framework/spring

4. 데이터 접근 기술 - MyBatis(spring, maven) 이론

wooweee 2023. 5. 19. 11:07
728x90

0. summary_설정

 

  1. library 받기

  2. root-context에서 libaray로 부터 받은 2가지 1) sqlSessionFactory 2) sqlSession 의 설정을 해준다.
    1. sqlSessionFactory
      1. dataSource: bean으로 등록된 dataSource를 myBatis에게 전달
      2. configLocation: myBatis의 내부 설정 파일 등록
      3. mapperLocations: myBatis는 repository인 DAOsqlQuery인 mapper를 따로 분리 해서 사용하는데 그 중 mapper의 위치를 지정하는 설정

    2. sqlSession
      • repository Dao에서 sqlSession의 method를 이용해서 mapper의 sqlQuery를 사용한다.

  3. 2.1.2의 configLocation 내부 설정 파일
    1. 경로 :  resources/ 에 작성 - java 파일이아닌 설정인 xml 파일이므로
    2. 별명 : 기본형을 제외한 dto 객체를 사용하려면 해당 객체의 class의 경로를 다 써줘야하지만 별명을 통해서 dto의 class명만 작성 가능

 

1. sourceCode_설정

 

  • pom.xml
<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.9</version>
    </dependency>

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.7</version>
    </dependency>
</dependencies>

 

  • root-context
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        ...
    </bean>

	<!-- 여러개발자가 막 건들이는 것은 자동등록 -->
    <!-- myBatis 2가지 설정 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation"  value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:mapper/*Mapper.xml"/>
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory"/>
    </bean>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <tx:annotation-driven/>
    <context:component-scan base-package="com.fastcampus"/>
</beans>

 

  • mybatis-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>
    <typeAliases>
        <!-- 프로젝트에 맞게 변경 -->
        <typeAlias alias="BoardDto" type="com.fastcampus.domain.BoardDto"/>
    </typeAliases>
</configuration>

 

 

2. summary_작동코드

 

  • 크게 3박자
    1. BoardDto.java : db의 값을 객체로 받을 class

    2. BoardDaoImpl.java
      • db와의 연결통로중 java logic만 깔끔하게 존재
      • SqlSession을 주입받아서 .xml에서 query문을 수행
    3. boardMapper.xml
      • sqlSessionFactory에서 지정한 위치에 mapper.xml을 넣어야한다.

 

  • 분리된 파일들끼리 연결하는 방법( ==규칙)
    1. BoardDaoImpl.java
      • session의 경로
        • params : mapper의 namespace + mapper의 id명, 넘겨줄 값(model처럼 생각하면 된다)
        • params : mapper의 namespace + mapper의 id명 

    2. boardMapper.xml
      • <mapper namespace: 나를 나타내는 이름>
        • 보통 해당 파일의 경로로 이름을 지정하지만 아무 이름으로 해도된다.
        • 다만, 아무 이름으로 한 걸 BoardDaoImpl.java 의 session method의 params의 nameSpace에 동일한 이름으로 작성만 하면된다.
      • <select id="select" parameterType="int" resultType="BoardDto">
        • id =  BoardDaoImpl.java 의 session method의 params의 id명

        • parameterType = 기본형도 되고 객체도 가능. BoardDaoImpl에서 넘겨줄 값의 type을 작성하고 해당 값을 query문에서 사용할 때 #{} BoardDaoImpl에서 넘겨줄 값의 type의 변수명

        • resultType = BoardDaoImpl에서 받아낼 반환 타입, 기본형이 아닌 객체일 경우 별명을 지정하지 않을 경우 해당 객체의 경로도 정확히 작성 필요