Spring #3

황현근·2023년 7월 10일
0

Spring

목록 보기
3/6
post-thumbnail

MyBatis

SQL Mapping 프레임워크로 흔히 분류된다.
개발자들은 JDBC 코드의 복잡하고 지루한 작업을 피하기 위해 사용한다.

<전통적인 JDBC프로그램과 MyBatis의 구조 비교>

  • 전통적인 JDBC프로그램

    • 직접 Connection을 맺고 마지막에 close()
    • PreparedStatement 직접 생성 및 처리
    • PreparedStatement의 setXXX()
    • Select 경우 ResultSet 직접 처리
  • MyBatis

    • 자동으로 Connection close() 가능
    • MyBatis 내부적으로 PreparedStatement 처리
    • #{prop} 과 같이 속성 지정하여 자동 처리
    • 리턴 타입을 지정하는 경우 자동으로 객체 생성 및 ResultSet 처리

스프링은 다른 프레임워크들과의 연동을 쉽게 하는 추가적인 라이브러리들이 많다. MyBatis 또한 mybatis-spring 이라는 라이브러리를 통해 쉽게 연동이 가능하다.


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>

MyBatis의 주요 Component와 동작 과정을 그림으로 표현하면 다음과 같다.

  1. MyBatis Config 파일을 읽어 SqlSessionFactoryBuilder 객체를 생성한다.
    MyBatis Config 파일에는 DB설정 정보, mapper 파일 등록, typeAlias설정 등이 들어있다.
  2. SqlSessionFactoryBuilder 객체를 이용해 SqlSessionFactory 객체를 생성한다.
  3. SqlSessionFactoryBuilder는 단순히 SqlSessionFactory 객체를 생성해주기 위한 용도다.
  4. 앱 실행 중(런타임)에 CRUD처리가 들어오면 SqlSessionFactory로 SqlSession 객체를 생성한다.
  5. SqlSession 객체를 이용해 DB요청을 한 후, 결과값을 받아온다.

먼저 MyBatis Config 파일은 XML로 작성하고, 다음과 같이 작성할 수 있다.

아래 MyBatis Config XML 파일은 4개의 정보를 설정하고 있다.

  1. <properties>: 프로퍼티 파일을 정의합니다.

  2. <typeAliases>: mapper.xml에서 사용할 alias를 설정합니다. (긴 패키지 경로 대신 짧은 단어 하나로 사용하기 위해)

  3. <environments>: DB 정보를 설정합니다. <property>에 ${driver}로 적은 것은 위 <properties>에서 가져온 내용을 대입한다는 의미입니다.

  4. <mappers>: 어떤 XML 파일이 mapper 파일인지를 설정합니다.

SQLSessionFactory

SQLSession은 개발자가 이를 통해 Connection을 생성하거나 원하는 SQL을 전달하고, 결과를 리턴 받는 구조로 작성하게 된다.

<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"/>
  	<property name="configLocation" value="classpath:Configuraion.xml"/>
</beans:bean>

Mapper

Mapper을 작성하는 것은 XML을 이용할 수도 있지만 인터페이스로도 가능하다.

MyBatis가 동작할 때 이 Mapper를 인식할 수 있도록 root-context.xml에 설정을 해야한다. 가장 간단한 방법은 <mybatis:scan> 태그를 이용하는 것이다.

root-context.xml > Namespaces > mybatis-spring 탭 선택
아래 코드 작성한다.

<mybatis-spring:scan base-package="com.test.mapper"/>

base-package속성은 지정된 패키지의 모든 MyBatis 관련 어노테이션을 찾아 처리한다.


Mapper 사용 예시

[Configuration.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>
    <!-- 자주 사용하는 type 의 별칭을 등록해놓고 Mapper xml 에서 사용할 수 있다. -->
    <typeAliases>
        <typeAlias type="com.gura.spring.users.dto.UsersDto" alias="usersDto"/>
        <typeAlias type="com.gura.spring.file.dto.FileDto" alias="fileDto"/>
        <typeAlias type="com.gura.spring.cafe.dto.CafeDto" alias="cafeDto"/>
        <typeAlias type="com.gura.spring.cafe.dto.CafeCommentDto" alias="cafeCommentDto"/>
        <typeAlias type="com.gura.spring.gallery.dto.GalleryDto" alias="galleryDto"/>
    </typeAliases>

    <!-- sql 문을 작성한 Mapper xml 문서가 어디에 있는지 목록을 작성해야 한다. -->
    <mappers>
        <mapper resource="mapper/UsersMapper.xml"/>
        <mapper resource="mapper/FileMapper.xml"/>
        <mapper resource="mapper/CafeMapper.xml"/>
        <mapper resource="mapper/CafeCommentMapper.xml"/>
        <mapper resource="mapper/GalleryMapper.xml"/>
    </mappers>
</configuration>

[UserMapper.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="users">
    <insert id="insert" parameterType="usersDto">
        INSERT INTO USER_TB
            (ID, PWD, EMAIL, REGDATE)
        VALUES (#{id}, #{pwd}, #{email}, SYSDATE)
    </insert>

    <select id="getData" parameterType="string" resultType="usersDto">
        SELECT ID, PWD, EMAIL, PROFILE, REGDATE
        FROM USER_TB
        WHERE ID = #{id}
    </select>

    <update id="updatePwd" parameterType="usersDto">
        UPDATE USER_TB
        SET PWD = #{newPwd}
        WHERE ID = #{id}
    </update>

    <update id="update" parameterType="usersDto">
        UPDATE USER_TB
        SET EMAIL = #{email}, PROFILE = #{profile}
        WHERE ID = #{id}
    </update>

    <delete id="delete" parameterType="string">
        DELETE FROM USER_TB
        WHERE ID = #{id}
    </delete>
</mapper>

0개의 댓글