MyBatis란?
SpringFramework 에서 제공하는 JDBC라이브러리를 보다 쉽게 작업할 수 있도록 만든 라이브러리이다.
Spring JDBC에서 썼던 Mapper의 역할을 확장시켜 쿼리문 작성을 모두 Mapper인터페이스에서 할 수 있도록 지원한다.
항상 반복적으로 만들어야하는 쿼리문 코드를 최대한 줄일 수 있는 라이브러리이다!
우선 MyBatis를 사용하기 위해서는 라이브러리를 추가해주어야 한다.
mvnrepository에 MyBatis라고 검색하면 이렇게 두가지가 나온다.
이 두개 모두 추가를 해주어야 한다.
다음과 같이 추가해주었다. 버전관리를 위해서 프로퍼티를 지정해서 버전을 따로 빼주었다.
Java Configuration 파일이다. MyBatis도 DataSource를 이용하기 때문에 BasicDataSource클래스를 만들어서 커넥션 풀을 설정해준다.
Spring JDBC에서는 JdbcTemplate라는 것을 만들어서 그 탬플릿의 update메소드, query메소드를 이용하여 DAO클래스에서 쿼리문을 작성하여 사용하였다.
MyBatis를 이용하려면 위와 같이 SqlSessionFactory와 Mapper가 필요하다. SqlSessionFactory는 Jdbc를 처리하는 객체로서 위와 같이 dataSource를 매개변수로 받아서 setDataSource하여 셋팅을 해준다.
중요한것은 mapper인데 개발자가 만들어 놓은 쿼리문을 관리하는 것이다.
포스팅 처음에 MyBatis는 Spring JDBC의 mapper를 확장시켜 mapper 인터페이스를 이용한다고 하였다. 위의 코드에서 MapperFactoryBean<MapperInterface>형의 빈을 만들었다. MapperInterface는 사용자가 만든 인터페이스이다.
setSqlSessionFactory()하여 위에서 만든 SqlSessionFactory를 셋팅해주고 factoryBean을 반환해준다.
사용자는 빈으로 등록한 testMapper를 getBean하여 불러오고 그 빈객체를 이용하여 쿼리문을 불러올 수 있다.
또, mapper는 여러개 있어도 된다. 위의 예제는 한개만 만들었는데 interface이름만 다르게 해서 여러개 만들어도 상관없다.
여기까지 설정하면 이제 MapperInterface에 사용자가 원하는 쿼리문을 작성해주면 되겠다.
MapperInterface에 어노테이션을 이용하여 쿼리문을 작성해주면 된다.
@Select("select * from test") List<JdbcVO> select(); 라고 선언해주면 사용자는 select()메소드를 호출함으로서 어노테이션에 선언되어 있는 쿼리문을 실행할 수 있다.
위에 @Results, @Result는 왜 주석처리를 했을까???
생략해도 되기 때문.
주석처리된 구문의 의미는 '데이터베이스의 data1 칼럼에는 지정된 빈의 data1 프로퍼티에 넣겠다', '데이터베이스의 data2 칼럼에는 지정된 빈의 data2 프로퍼티에 넣겠다' 의 의미가 된다.
그런데, Mybatis에서는 프로퍼티의 이름과 칼럼의 이름이 같으면 알아서 그냥 주입을 해준다. POJO클래스를 만들 때, 칼럼의 이름과 프로퍼티의 이름을 맞추어 만들어 주면 @Results 을 사용하는 일을 줄일 수 있겠다.
@Insert("insert into test values(#{data1}, #{data2})") 를 보면, values가 #{data1}와 같이 되어있다.
Spring JDBC에서는 Java에서 사용했던 방식과 똑같이 ?을 넣어 쿼리문을 선언해주고, update()메소드 매개변수에 순서를 맞추어 줌으로써 ?에 값이 1:1대응으로 삽입이 되게 만들어 주었다.
MyBatist도 마찬가지로 #{data1}와 같이 선언하면, void insert(JdbcVO bean); 에서 bean변수의 프로퍼티를 알아서 찾아주어서 data1은 data1에 data2는 data2에 자동으로 주입해준다.
'JAVA > Spring' 카테고리의 다른 글
Spring Socket에 대해 알아보자! - 1. WebSocket (0) | 2020.06.18 |
---|---|
Spring WebSocket에 대한 내용 정리 (0) | 2020.06.11 |
Spring JDBC (0) | 2020.04.20 |
@AspectJ 어노테이션 (0) | 2020.04.17 |
execution 명시자 (0) | 2020.04.17 |