반응형
1. MyBatis 연결
https://tadaktadak-it.tistory.com/98
[JSP] MyBatis
1. MyBatis - 모델(객체)과 DB(테이블)의 매개체 역할의 프레임워크 - ORM(Object Relational Mapping) - Java 소스코드 안에 SQL문을 작성하면 코드가 길어지고 섞여 있어서 유지보수 및 분업이 어려움 - MyBatis..
tadaktadak-it.tistory.com
- root-context.xml에 hikari객체로 만든 DataSource를 추가해주고 DataSource로 SqlSessionFactory를 추가해줘야 한다.
// root-context.xml에 추가
// hikari 객체
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/web0315"></property>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</bean>
// DataSource 객체
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<constructor-arg ref="hikariConfig"/>
</bean>
// SqlSessionFactory 객체
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
2. Spring에서 Mybatis 사용
- JSP에서 Mapper를 사용한 것처럼 스프링에서도 Mapper를 사용하는데 Mapper 인터페이스를 사용하거나 XML을 사용하면 된다.
- SQL이 짧고 간결한 경우에는 어노테이션을 이용해서 쿼리문을 작성해준다.
- SQL문이 복잡하거나 길어지는 경우에는 어노테이션보다 XML을 이용하는 것이 좋다.
- MyBatis-Spring의 경우 Mapper 인터페이스와 XML을 연동해서 동시에 이용할 수 있다.
- 인터페이스객체.메소드()를 호출하는 순간 해당하는 인터페이스의 경로를 namespace로 가지고 있는 XML로 찾아가서 메소드명과 동일한 id를 가지고 있는 쿼리문을 수행하여 결과로 돌려준다.
- 이젠 직접적으로 sqlsession은 사용하지 않는다.
package com.koreait.mapper;
import org.apache.ibatis.annotations.Select;
public interface TimeMapper {
// Mapper 인터페이스
// Mapper를 작성하는 작업은 XML을 이용할 수도 있지만,
// 최소한의 코드로 작성하기 위해서는 Mapper 인터페이스를 사용한다.
// XML을 이용하지 않고 바로 어노테이션을 이용해서 쿼리문 사용
@Select("select now() from dual")
public String getTime();
public String getTime2();
}
//---------------------------------------------------------------------------------------
package com.koreait.mapper;
public interface BoardMapper {
public int getMaxBoardnum(String userid);
}
- 위에 Mapper 인터페이스는 src/main/java 파일에 만들어주며 어노테이션이 없는 메소드는 namespace가 경로인 XML을 찾아가서 메소드가 같은 동일한 id를 가지고 있는 쿼리문을 수행하여 결과로 돌려준다.
- 위에 XML 파일은 src/main/resources에 pakage로 만들어 사용하면 되고 XML 파일을 보면 namespace가 Mapper 인터페이스이다. 스프링에서는 parametertype을 안 써줘도 자동으로 인식해서 넘어가게 된다.
package com.koreait.persistence;
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 com.koreait.mapper.BoardMapper;
import com.koreait.mapper.TimeMapper;
import lombok.Setter;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class MapperTests {
@Setter(onMethod_ = @Autowired)
private TimeMapper mapper1;
@Setter(onMethod_ = @Autowired)
private BoardMapper mapper2;
// @Test
// public void getTimeTest() {
// log.info("Now : " + mapper1.getTime());
// }
// @Test
// public void getTime2Test() {
// log.info("Now : " + mapper1.getTime2());
// }
@Test
public void getMaxBoardnumTest() {
log.info("apple의 최근 게시글 번호 : " + mapper2.getMaxBoardnum("apple"));
}
}
- 이제 실행하기 위해서는 우리가 원하는 mapper 인터페이스를 주입하기 위해 @Setter로 설정을 해주고 인터페이스에 선언한 메소드를 사용하면 된다. 이때 주입하기 위해 스프링이 매퍼를 찾을 수 있게 root-context에 설정을 해줘야 한다.
<!-- 스프링이 매퍼를 찾을 수 있게 스캔 -->
<mybatis-spring:scan base-package="com.koreait.mapper"/>
3. log4jdbc
- MyBatis는 내부적으로 JDBC의 PreparedStatement를 이용해서 SQL를 처리한다.
- 따라서 SQL에 전달되는 파라미터는 JDBC에서와 같이?로 치환되어서 처리된다.
- 복잡한 SQL의 경우?로 나오는 값이 제대로 전달되었는지 확인하기가 쉽지 않고 실행한 SQL의 내용을 정확히 확인하기 어렵다.
- 따라서 log4jdbc-log4j2 라이브러리를 사용하여 어떤 값들이 전달되었고, 어떤 쿼리문이 수행되었는지를 확인할 수 있다.
- 쉽게 말해, 스파이를 심어놔서 DB에서 일어나는 일들을 로그로 찍어서 보여준다.
- 이것은 root-context에서 hikari객체를 만들 때 설정을 해주면 된다.
- 스파이를 심어놓고 resource폴더에 리소스 파일을 하나 만들어서 설정을 해줘야 한다.
- 밑에 처럼 이 라이브러리를 사용하기 전보다 더 상세하게 나오게 된다.
4. 2개 이상의 값 xml로 넘기기
- 두개 이상의 값을 xml로 넘겨서 사용할 때는 전과 같이 Map이나 List를 이용해도 되지만 @Param("")을 이용해도 된다.
반응형
'웹개발 > Spring' 카테고리의 다른 글
[Spring] 스프링 MVC Controller의 특징, Postman (0) | 2022.07.04 |
---|---|
[Spring] 스프링 구동 순서/과정, MVC 구조, Front-Controller 패턴 (2) | 2022.07.03 |
[Spring] 스프링 프레임워크에서 DB 연결 (0) | 2022.07.01 |
[Spring] 의존성 주입 테스트, 테스트 환경 (0) | 2022.07.01 |
[Spring] Lombok 라이브러리 (0) | 2022.07.01 |