ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [1-ch4 스프링] MyBatis특징과 스프링 연동
    Back-End/Spring Legacy 2022. 8. 14. 17:22

     

    MyBatis란?

     

    객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는 개발 프레임 워크로서 JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 SQL 쿼리, 저장 프로 시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개 변수의 중복 작업을 제거한다. 

     

    SQL 쿼리의 분리로 코드의 간결성 및 유지보수성 향상 

    resultType, resultClass등 VO를 사용하지 않고 조회결과를 사용자 정의 DTO, MAP 등으로 매핑하여 사용할 수 있다. 

     

     

     

     

    MyBatis 관련 라이브러리 추가

     

    MyBatis와 mybatis-spring을 사용하기 위해 pom.xml에 추가적인 라이브러리들을 설정해야 한다. 

     


    <!-- mybatis 추가 -->

    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
    </dependency>
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.2</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${org.springframework-version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
    </dependency>

     

     

     

     

    SQLSessionFactory

     

    MyBatis에서 가장 핵심적인 객체는 SQLSession이라는 존재와 SQLSessionFactory이다. SQLSessionFactory의 이름에서 보듯이 내부적으로 SQLSessionFactory이라는 것을 만들어 내는 존재인데, 개발에서는 SQLSession을 통해서 Connection을 생성하거나 원하는 SQL을 전달하고 결과를 리턴받는 구조로 작성된다. 

     

    <!-- HikariCP configuration -->
    <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></bean>

     

     

    Mybatis 과정

     

     

    1.sqlMapConfig.xml에 각 기능별로 실행할 SQL문을 SqlMap.xml에 미리 작성한 후 등록
    2.애플리케이션에서 데이터베이스와 연동하는 데 필요한 데이터를 각각의 매개변수에 저장한 후 마이바티스에 전달
    3.애플리케이션에서 요청한 SQL 문을 SqlMap.xml에서 선택
    4.전달한 매개변수와 선택한 SQL문을 결합
    5.매개변수와 결합된 SQL 문을 DBMS에서 실행
    6.DBMS에서 반환된 데이터를 애플리케이션에서 제공하는 적당한 매개변수에 저장한 후 반환
     

    마이바이티스 설정 파일 작성

    SqlMapConfig.xml

    : 데이터베이스 연동 시 반환되는 값을 저장할 빈이나 트랜잭션, 데이터소스 등 마이바티스 관련 정보를 설정한다.

     

    member.xml

    회원정보 관련 SQL 문을 설정한다.

     

    Mybatis로 조건값 전달 방법

    : MemberDAO에서 메서드 호출 시 전달된 조건 값은 매개변수 이름으로 SQL문의 조건식에 전달

     

    SQL 문에서 조건값 사용법

    #{전달된 매개변수이름}

     

    MyBais 설정 파일 ( sqlMapConfig.xml)

    1) 데이터베이스의 접속 주소 정보나 Mapping 파일의 경로 등 고정된 환경 정보를 설정한다.

    2) VO의 객체 정보를 설정한다.

     

    SqlSeesionFactoryBuilder

    1)MyBatis 설정 파일을 바탕으로 SqlSessionFactory를 생성한다.

    2) Spring Bean으로 설정해야한다.

     

    SqlSessionFacotory 

    : sqlSession을 생성한다.

     

    SqlSession : 핵심적인 역할을 하는 클래스로 sql 실행이나 트랙잭션 관리를 실행한다.

     

    Mapping 파일 (user.xml) : SQL문과 OR Mapping을 설정한다.

     

     

     

     

    스프링과의 연동 처리

     

    SQLSessiontFactory를 이용해서 코드를 작성해도 직접 Connection을 얻어서 JDBC 코딩이 가능하지만, 좀 더 편하게 작업하기 위해서 SQL을 어떻게 처리할 것인지를 별도의 설정을 분리해주고, 자동으로 처리되는 방식을 이용하는 것이 좋다. 이를 위해 MyBatis의 Mapper라는 존재를 작성해줘야 한다. 

     

    Mapper는 쉽게 말해 SQL과 그에 대한 처리를 지정하는 역할을 한다. 

     

     

    Mapper를 작성하는 작업은 xml을 이용할 수 있지만 아래 예제에서는 최소한의 코드를 작성하는 Mapper 인터페이스를 사용해봤다. 

     

    org.zerock.mapper라는 패키지를 만들고, TimeMapper라는 인터페이스를 추가한다.(src/main/java)

     

     

    package org.zerock.mapper;
    
    import org.apache.ibatis.annotations.Select;
    
    public interface TimeMapper {
    	
    	@Select("SELECT sysdate FROM dual")
    	public String getTime();
    	
    	public String getTime2();
    
    }

     

     

    Mapper를 작성했다면 MyBatis가 동작할 때 Mapper를 인식할 수 있도록 root-context.xml에 추가적인 설정이 필요하다. root-context.xml 파일에서 Namespaces 항목에서 'mybatis-spring' 탭을 선택한다. 

     

     

     

     

    그 후 소스 코드에 아래 2문장을 추가해주면 된다. <mybatis-spring:scan> 태그의 base-package 속성은 지정된 패키지의 모든 MyBatis 어노테이션을 찾아서 처리한다. 즉) TimeMapper 인터페이스에 있는 @select 어노테이션을 읽어오는 것. Mapper를 설정하는 작업은 각각의 xml이나 mapper 인터페이스를 설정할 수 있지만, 매번 너무 번잡하기 때문에 자동으로 org.zerock.mapper 패키지를 인식하는 방식으로 작성하는 것이 가장 편리하다. 

     

    <mybatis-spring:scan base-package="org.zerock.mapper" />
    <context:component-scan base-package="org.zerock.sample"></context:component-scan>

     

     

     

    Mapper 테스트

     

    MyBatis-Spring은 Mapper 인터페이스를 이용해 실제 SQL 처리가 되는 클래스를 자동으로 생성한다. 따라서 개발자들은 인터페이스와 SQL만을 작성하는 방식으로도 모든 JDBC 처리를 끝낼 수 있다. TimeMapper를 테스트 하는 코드는 src/test/java 밑에 TimeMapperTests라는 클래스를 생성해서 처리한다. 

     

    package org.zerock.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 org.zerock.mapper.TimeMapper;
    
    import lombok.Setter;
    import lombok.extern.log4j.Log4j2;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
    @Log4j2
    public class TimeMapperTests {
    
    	@Setter(onMethod_ =@Autowired)
    	private TimeMapper timeMapper;
    	
    	@Test
    	public void testGetTime() {
    		log.info(timeMapper.getClass().getName());
    		log.info(timeMapper.getTime());
    	}
    	
    	@Test
    	public void testGetTime2() {
    		log.info("getTime2");
    		log.info(timeMapper.getTime2());
    	}
    }

     

    TimeMapperTests 클래스는 TimeMapper가 정상적으로 사용이 가능한지 알아보기 위한 테스트이다. 정상 동작하면 TimeMapper 타입으로 만들어진 스프링 객체(빈)가 존재한다는 뜻이다. 

     

     

     

     

    xml 매퍼와 같이 쓰기

     

    MyBatis를 이용해서 sql을 처리할 때 어노테이션을 이용하는 방식이 압도적으로 편리하지만, sql이 복잡하거나 길어지는 경우에는 어노테이션 보다는 xml을 이용하는 방식이 더 선호된다. xml을 작성해서 사용할 때는 xml 파일 위치와 xml 파일에 지정하는 namespace 속성이 중요한데, xml 파일의 경우 mapper 인터페이스가 있는 곳에 같이 작성하거나 src/main/resources 구조에 xml을 저장할 폴더를 생성할 수 있다. 

     

     

     

     

    xml 파일에는 MyBatis의 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="org.zerock.mapper.TimeMapper">
    
    
    	<select id="getTime2" resultType="string">
    	SELECT sysdate FROM dual
    	</select>
    	
    </mapper>

     

     

    XML 매퍼를 이용할 때 신경 써야 하는 부분은 mapper 태그의 namespace 값이다. MyBatis는 Mapper 인터페이스 이름과 namespace 속성값을 가지고 판단한다. 위와 같이 org.zerock.mapper.TimeMapper 인터페이스가 존재하고, xml의 <mapper namespace="org.zerock.mapper.TimeMapper">와 같이 이름이 동일한 태그가 존재한다면, 이를 병합해서 처리한다. <select> 태그에서 id 값은 메서드의 이름과 동일하게 맞춰줘야 한다. select 태그의 경우 resultType 속성값을 가지는데 이 값은 인터페이스에 선언된 메서드의 리턴 타입과 동일하게 작성한다. 

     

    반응형

    댓글

Designed by Tistory.