개발 환경 설정 및 툴 사용법

Spring Boot with Mybatis : 스프링부트 Mybatis 설정 (요약)

letsDoDev 2024. 8. 31. 22:42

 

#1 Dependency 추가해주자 (case. 신규 프로젝트)

-  만약 사용하여 신규 프로젝트를 만든 다면 

- 아래 이미지처럼 파란 박스  Dependecy 추가

 

 

#1 Dependency 추가해주자 (case. 진행 중인 프로젝트) 

※ 버전은 각자 프로젝트 개발환경 (spring boot 버전) 에 따라 달라진다.

- Gradle 의 경우 : build.gradle 에 추가 및 수정

dependencies {

	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
	testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'

}

 

- maven 의 경우 : pom.xml 에 추가 및 수정

<dependencies>
    <!-- MyBatis Spring Boot Starter -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>3.0.3</version>
    </dependency>

    <!-- MyBatis Spring Boot Starter Test -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter-test</artifactId>
        <version>3.0.3</version>
        <scope>test</scope>
    </dependency>
</dependencies>

 

 

#2 application.yml 에 mybatis 설정 추가

- application.yml 인 경우

# mybatis mapper.xml 경로 설정    
mybatis:
    mapper-locations: classpath:mapper/*.xml
    type-aliases-package: com.mybatis.setting.mapper
# mapper.xml 의  nameSpace가 c"om.mybatis.setting.mapper" 로 시작하는 매퍼.xml 들은 -> (sqlSession 경로)
# src/main/resuorces/  "mapper/*.xml" 을 뒤적거려서 찾겠다.

 

- application.properties 인 경우

# MyBatis 매퍼 XML 파일의 위치 설정
mybatis.mapper-locations=classpath:mapper/*.xml

# MyBatis 타입 별칭 패키지 설정
mybatis.type-aliases-package=com.mybatis.setting.mapper

 

- sqlSession에서 mapper.xml의 별칭 패키지를 입력 받는데

- ex) sqlSession.selectList("com.mybatis.setting.mapper.UserMapper"); 이런 식으로 

- 위 예시 처럼 sqlSession 에게 넘긴 xml 패키지명이 들어오면

- com.mybatis.setting.mapper 하위로 들어 온(가 포함된) 매퍼 파일을

- mybatis.mapper-locations=classpath: 로 지정한 mapper/ 경로의 모든 .xml 타입 파일의 namespace 로 찾겠다는 의미이다.

- mybatis.mapper-locations=classpath:의 디폴트 경로는 "src/main/resources" 이기 때문에 mapper/*.xml 은 

- 실질적으로 "src/main/resources/" + "mapper/*.xml" 이 돤다.

즉 요약 sqlSession 에서 com.mybatis.setting.mapper 하위 패키지명으로 입력된 xml 별칭은
src/main/resources/" + "mapper/*.xml" 파일 들 중에서 namespace로 찾을 거다 라는 의미

 

#3 위에서 type-alias-package로 지정한 것은

- 아래 예시 mapper.xml 에서

- <mapper namespace="해당 mapper.xml 에 내가 부여한 별칭 "> 에서 사용된다.

- 아래 xml 은 이 .xml 파일의 별칭을 "com.mybatis.setting.mapper.UserMapper" 로 지정한 것이며

- 그 중 UserMapper 이전 까지의 패키지명이 application.yml 에서 지정한 type-alias-package 여야 하고

- "UserMapper" 은 각자 식별로 사용할 문자를 사용하면 된다 -> .xml 의 파일명과 동일하게 해주면 구분하기 쉬움

- 아래 파일은 UserMapper.xml 로 생성했던 매퍼 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">

<!-- src/main/resources/mapper/UserMapper.xml -->
<!-- sqlSession 으로 가지고 올 때 사용되는 일종의 key 라고 보면 됨-->
<mapper namespace="com.mybatis.setting.mapper.UserMapper">

    <select id="findAllUsers" resultType="com.mybatis.setting.dto.user.UserDto">
		:
    </select>

    <select id="findUserById" parameterType="java.lang.Integer" resultType="com.mybatis.setting.dto.user.UserDto">
		:
    </select>

    <select id="findUserByNameAndPassword" parameterType="map" resultType="com.mybatis.setting.dto.user.UserDto">
		:
    </select>

    <insert id="insertUser" parameterType="com.mybatis.setting.dto.user.UserDto">
		:
    </insert>

    <update id="updateUserById" parameterType="com.mybatis.setting.dto.user.UserDto">
		:
    </update>

    <delete id="deleteUserById" parameterType="java.lang.Integer">
		:
    </delete>

</mapper>

 

 

#4 mapper 파일(xml 파일) 에서 지정한 별칭 namespace로 쿼리문 실행시키기 with java method

- 이렇게 지정한 매퍼xml 의 namespace로 해당 xml 파일에 정의된 쿼리문을 실행시킬려면

- sqlSession 또는 sqlSesstionTemplate을 사용해야 한다.

- 둘의 차이는 sqlSession 은 인터페이스로 sqlSessionFactory 로 객체를 생성시켜주어야 하는 반면,

- sqlSessionTemplate은 자체가 구현체이므로 별도의 다른 클래스 간섭 없이 객체를 생성할 수 있으며

- 트랜잭셕, 스레드 작업 과정에서의 안정성이 sqlSession 보다 안정적이라는 특징이 있다.

- 아래 DaoImpl 클래스에서

- 방법1 은 sqlSession 으로 namespace 을 통해 mapper.xml (UserMapper.xml) 의 쿼리문을 실행시키는 방법

- 방법2 는 sqlSessionTemplate으로 namespace 을 통해 mapper.xml (UserMapper.xml) 의 쿼리문을 실행시키는 방법

- 이다

package com.mybatis.setting.dao;

import com.mybatis.setting.dto.user.UserDto;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Repository
@RequiredArgsConstructor
public class UserDaoImpl implements UserDao{

    // 방법 1 sqlSession 을 사용하는 방법
    private final SqlSessionFactory sqlSessionFactory;

    // 방법 2 sqlSessionTemplate 을 사용하는 방법 -> 내가 채택한 방법
    private final SqlSessionTemplate sqlSessionTemplate;

    // src/resources/mapper 경로의 UserMapper.xml 의 namespace 이다.
    private static String nameSpace = "com.mybatis.setting.mapper.UserMapper";

    @Override
    public List<UserDto> findAllUsers() {
        // 방법 1
        /*
        try (SqlSession sqlSession = sqlSessionFactory.openSession();){
            return sqlSession.selectList(nameSpace + ".findAllUsers");
        } catch (Exception e) {
            log.error(e.getLocalizedMessage());
            throw e;
        }
         */

        // 방법 2
        return sqlSessionTemplate.selectList(nameSpace + ".findAllUsers");
    }

    @Override
    public int insertUser(UserDto user) {
        // 방법 1
        /*
        try (SqlSession sqlSession = sqlSessionFactory.openSession();){
             return sqlSession.insert(nameSpace + ".insertUser", user);
        } catch (Exception e) {
            log.error(e.getLocalizedMessage());
            throw e;
        }
         */

        // 방법 2
        return sqlSessionTemplate.insert(nameSpace + ".insertUser", user);
    }

    @Override
    public UserDto findUserById(long id) {
        // 방법 1
        /*
        try (SqlSession sqlSession = sqlSessionFactory.openSession();){
             return sqlSession.selectOne(nameSpace + ".findUserById", (int) id));
        } catch (Exception e) {
            log.error(e.getLocalizedMessage());
            throw e;
        }
         */

        // 방법 2
        return sqlSessionTemplate.selectOne(nameSpace + ".findUserById", (int) id);
    }

    @Override
    public UserDto findUserByNameAndPassword(String name, String password) {

        Map<String, String> userMap = new HashMap<>();
        userMap.put("name", name);
        userMap.put("password", password);

        // 방법 1
        /*
        try (SqlSession sqlSession = sqlSessionFactory.openSession();){
             return sqlSession.selectOne(nameSpace + ".findUserByNameAndPassword", userMap);
        } catch (Exception e) {
            log.error(e.getLocalizedMessage());
            throw e;
        }
         */

        // 방법 2
        return sqlSessionTemplate.selectOne(nameSpace + ".findUserByNameAndPassword", userMap);
    }

    @Override
    public int updateUserById(UserDto user) {
        // 방법 1
        /*
        try (SqlSession sqlSession = sqlSessionFactory.openSession();){
             return sqlSession.update(nameSpace + ".updateUserById", user);
        } catch (Exception e) {
            log.error(e.getLocalizedMessage());
            throw e;
        }
         */

        // 방법 2
        return sqlSessionTemplate.update(nameSpace + ".updateUserById", user);
    }

    @Override
    public int deleteUserById(long id) {
        // 방법 1
        /*
        try (SqlSession sqlSession = sqlSessionFactory.openSession();){
             return sqlSession.update(nameSpace + ".deleteUserById", (int) id));
        } catch (Exception e) {
            log.error(e.getLocalizedMessage());
            throw e;
        }
         */

        // 방법 2
        return sqlSessionTemplate.delete(nameSpace + ".deleteUserById", (int) id);
    }
}

 

# 여기 까지 진행으로 spring boot 에서의 mybatis 설정과 쿼리문을 sqlSession 이라는 일종의 API로 실행시키는 법까지 모두 알아봤다.

 

- 더 자세한 과정을 project CRUD로 확인하고 싶다면

https://letsdodev.tistory.com/199

 

Spring Boot with Mybatis : 스프링부트 Mybatis 설정 + User CRUD (FULL 버전)

오늘은 스프링 부트와 mybatis 설정을 진행하고 테스트할 것이다.- 스프링 이니셜라이저로 다음과 같이 프로젝트 생성-  CRUD 테스트할 테이블 생성 및 샘플데이터 INSERTCREATE DATABASE mybatishandler;use my

letsdodev.tistory.com

- 위 게시물을 읽어보자!