📌폴더 구조



📌Mybatis연결(JDBC,JBCP연결 과정)
📍src/main/webapp/WEB-INF/spring/root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.ysh.studySpring.dependency"></context:component-scan>
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="username" value="hr"/>
<property name="password" value="hr"/>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig"/>
</bean>
</beans>
📍src/main/webapp/WEB-INF/views/home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>Hello world!</h1>
<P>The time on the server is ${serverTime}.</P>
</body>
</html>
📍package dependency.Persisitence;
import static org.junit.Assert.fail;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.log;
import java.sql.Connection;
import javax.sql.DataSource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class DataSourceTests {
@Autowired
private DataSource dataSource;
@Test
public void testConnection() {
try(Connection connection = dataSource.getConnection()){
log.info(connection);
}catch(Exception e) {
fail(e.getMessage());
}
}
}
📍package dependency.Persisitence;
import static org.junit.Assert.fail;
import java.sql.Connection;
import java.sql.DriverManager;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class JDBC_Tests {
//해당 드라이버를 메모리에 올리는 코드, Oracle DB를 사용했을 경우
static {
try {
Class.forName("orcle.jdbc.driver.OracleDriver");
}catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
//위해서 해당 메모리를 할당해주고 해당 주소를 적어주면 연결된다??
@Test
private void testConnection() {
//외부 장치를 열었으면 자동으로 닫아주는 코드
try(Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "hr", "hr")){
log.info(connection);
}catch(Exception e) {
//junit의 메소드로 무조건 실패로 처리한 뒤 실행을 중지한다.
fail(e.getMessage());
}
}
}
✏️부가 설명(MyBatis 연결 - jdbc, dbcp연결)
1. 프로젝트 우클릭 buildpath -> 라이브러리 -> 오라클 JDBC.jar파일 추가(class path에 추가)
2.jdbc가 연결 되었는지 확인
DBMS작업은 영속적이기 때문에 persistence영역이라고 한다.
JDBC, DBCP를 연결" 하는 작업
📌Mybatis설정(SqlSession,mapper / interface(자바),xml에서 쿼리문 작성해서 사용하는 예시)
📍package mapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
//Mapper 인터페이스
//SQL을 작성하는 작업은 xml을 이용할 수도 있지만 , 최소한의 코드를 작성하기 위해서는
//Mapper인터페이스를 작성한다.\
//@Mapper를 사용하기 위해서는 스캔이 필요하다(root-coiontext.xml -> nameSpace -> mybatis-spring 체크 + 코드 작성 필요)
@Mapper //xml과 연동하기 위한 어노테이션
public interface TimeMapper {
//현재 db에 테이블이 없기 대문에 DB에 있는 데이터를 불러오는 것이 아니라 현재 시간을 불러오는 예시
//java코드 내에서 쿼리 실행 가능 / 간단한 것은 여기에 작성하고 복잡한 쿼리문은 xml에 작성해라!!
@Select("SELECT SYSDATE FROM DUAL")
public String getTime(); //getRime이 실행되면 위의 쿼리가 실행된다.
//위처럼 직접 쿼리를 작성하는 것이 아니라 xml에 있는 쿼리를 받아와 사용하는 방법
public String getTime2();
}
📍src/main/resources/com/ysh/studySpring/mapper/TimeMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ysh.studySpring.mapper.TimeMapper">
<select id="getRime2" resultType="string">
SELECT SYSDATA FROM DUAL
</select>
</mapper>
📍src/main/webapp/WEB-INF/spring/root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.ysh.studySpring.dependency"></context:component-scan>
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="username" value="hr"/>
<property name="password" value="hr"/>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<mybatis-spring:scan base-package="com.ysh.studySpring.mapper" />
</beans>
📍package dependency.Persisitence;
import static org.junit.Assert.fail;
import java.sql.Connection;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class DataSourceTests {
@Autowired
private DataSource dataSource;
@Autowired
private SqlSessionFactory sqlSessionFactory;
// @Test
// public void testConnection() {
// try(Connection connection = dataSource.getConnection()){
// log.info(connection);
// }catch(Exception e) {
// fail(e.getMessage());
// }
// }
//sqlSessionFactory를 통해 connection객체를 가지고 오는지 확인하는 테스트(mapper쪽에서 기본적인 세팅 완료)
@Test
public void testConnection() {
try
( //true를 사용해야 auto commit이 된다
SqlSession sqlSession = sqlSessionFactory.openSession(true);
Connection connection = sqlSession.getConnection();
){
log.info(sqlSession);
log.info(connection);
}catch(Exception e) {
fail(e.getMessage());
}
}
}
📍package dependency.mapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
import mapper.TimeMapper;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class TimeMapperTests {
@Autowired
private TimeMapper timeMapper;
@Test
public void testGetTime() {
log.info(timeMapper.getClass().getName());
log.info(timeMapper.getTime());
}
@Test
public void testGetTime2() {
log.info(timeMapper.getClass().getName());
log.info(timeMapper.getTime2());
}
}
📍target/classes/com/ysh/studySpring/mapper/TimeMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ysh.studySpring.mapper.TimeMapper">
<select id="getRime2" resultType="string">
SELECT SYSDATA FROM DUAL
</select>
</mapper>
✏️부가설명(Mybatis 연결 - SqlSession, Mapper)
- 쿼리문을 왔다갔다 하면서 사용하기 힘들다, 기존 java파일에서 섞어서 사용하는 것이 좋지 않아 xml로 분리해서 기존에 java파일에서 섞어서 했던 jdbc를 열어 놓고 반납을 하는 방법이 dbcp connectionful이다.
- Mybatis : 자바에 sql코드가 섞여 있으니까 보기 싫기 때문에 분리 하는 개념 -> sql은 전부 xml에 넣는다. xml에 있는 것을 java쪽 interface와 연결을 해서 가지고 온다.
구조에 대한 이해
- sql(xml)
- java(interface) : 처음에는 구현이 되어 있지 않은데 xml에 있는 sql이 쿼리문이 실행이 되면서 구현이 된다(사용자가 java의 interface를 실행하면 해당 interface에 바인딩이 된 xml에 있는 sql이 실행이 된다) / 이러한 interface를 mapper라고 부른다(sql과 연결되어 있는 것)
xml에 파일을 만드는 방법
- 경로를 따로 지정도 가능하지만 우선 default경로로 사용(기본 경로) - xml경로를 interface경로와 동일하게 맞추어 폴더를 만들어 주는 것이 기본이다. / xml파일은 resources부터 찾는다(기본으로 설정이 되어있다.)
1) src/main/resource -> com package생성 -> ysh package생성 -> studySpring package생성 -> mapper package생성 ->xml파일 생성
(interface 패키지 경로와 동일한 경로로 찾기 때문에 맞추어 주어야 한다)
2)Mybatis Mapper Default Code(마이바티스에서 매퍼를 사용할 경우 기본적으로 작성해야 하는 xml코드)<<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
</mapper>
📌Mybatis연결(Log4j, 경로설정 / 콘솔에 테이블로 보기 좋게 보여주도록 하는 설정)
📍src/main/resources/config/config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0/EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
📍src/main/resources/log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
<logger name="com.ysh.studySpring">
<level value="info" />
</logger>
<logger name="org.springframework.core">
<level value="info" />
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
<logger name="jdbc.audit">
<level value="warn"/>
</logger>
<logger name="jdbc.connection">
<level value="warn"/>
</logger>
<logger name="jdbc.audit">
<level value="warn"/>
</logger>
<root>
<priority value="warn" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
📍src/main/resources/log4jdbc.log4j2.propertis
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
//왼쪽을 오른쪽 으로 이름을 변경한다.
//log라이브러리의 설정을 여기서 바꿀 예정
//라이브러리가 위의 이름을 일고 실행 된다.
//ctrl + n -> general -> untyped text로 만드낟
📍src/main/webapp/WEB-INF/spring/root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.ysh.studySpring.dependency"></context:component-scan>
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" />
<property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="username" value="hr"/>
<property name="password" value="hr"/>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml" />
<property name="configLocation" value="classpath:config/config.xml"/>
</bean>
<mybatis-spring:scan base-package="com.ysh.studySpring.mapper" />
</beans>
📍target/classes/config/config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0/EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
📍target/classes/log4j.xml
?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
<logger name="com.ysh.studySpring">
<level value="info" />
</logger>
<logger name="org.springframework.core">
<level value="info" />
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
<logger name="jdbc.audit">
<level value="warn"/>
</logger>
<logger name="jdbc.connection">
<level value="warn"/>
</logger>
<logger name="jdbc.audit">
<level value="warn"/>
</logger>
<root>
<priority value="warn" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
📍target/classes/log4jdbc.log4j2.propertis
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
//왼쪽을 오른쪽 으로 이름을 변경한다.
//log라이브러리의 설정을 여기서 바꿀 예정
//라이브러리가 위의 이름을 일고 실행 된다.
//ctrl + n -> general -> untyped text로 만드낟
✏️부가설명(13강 - Log4j, 경로 설정)
- log4j가 jdbc에 관여 해서 결과를 콘솔에 출력해주는 기능을 사용할 예정(DB결과가 콘솔에 보이게 하기 위한 작업)
- log4j_spy라이브러리를 사용
- Mybatis는 내부적으로 JDBC의 PreparedStatement를 이용해서 SQL을 처리한다.
- 따라서 SQL에 전달되는 파라미터는 JDBC에서 와 같이 '?'로 치환 되어 처리 된다.
- 복잡한 SQL의 경우 '?'로 나오는 값이 제대로 되었는지 확인하기 쉽지 않다.
- 실행된 SQL위 내용을 정확히 확인하기 어렵기 때무에 log4jdbc-log4j2라이브로리를 가용하여 어떤값인지 정확하게 확인한다.
- src/main/resources에 새 파일을 만든다. -> general/untyped Text로 만든다
(config.xml의 default 코드이다)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0/EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>