관리 메뉴

공부가 싫은 개발자

[Spring Boot] MyBatis 설정하기 본문

스프링

[Spring Boot] MyBatis 설정하기

우엉엉 2025. 9. 14. 10:51

의미 없는 서론...

매번 JPA로 프로젝트를 했는데 생각보다 기업 프로젝트에서 MyBatis를 많이 쓴다.
이유는 아는데 여기에 쓰기 귀찮... (신입이라 JPA 쓰는 곳은 아직 못 봄...)

그래서 사이드 프로젝트로 MyBatis를 사용해 보려고한다.
yml 파일 기준 MyBatis 설정하는 법을 기록해 본다. (맨날 까먹음...)

프로젝트 구조 예시)

mybatis-demo/
 ├── src/main/java/com/example/demo/
 │    ├── DemoApplication.java          # main() 함수 있는 스프링 부트 실행 클래스
 │    │
 │    ├── domain/
 │    │    └── User.java                # DTO/VO (DB 테이블과 매핑될 엔티티)
 │    │
 │    ├── mapper/
 │    │    └── UserMapper.java          # Mapper 인터페이스
 │    │
 │    └── ...
 │
 ├── src/main/resources/
 │    ├── application.yml               # DB, MyBatis 설정
 │    │
 │    └── mappers/                       # MyBatis XML 매퍼 파일들
 │         └── UserMapper.xml
 │
 └── build.gradle

 

[진짜 시작]

1. build.gradle

implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.5'

 

2. application.yml

spring:
  datasource:
    url: {본인 DB 주소}
    username: {아이디}
    password: {비밀번호}
    driver-class-name: org.postgresql.Driver
    
  mybatis:
    mapper-locations: classpath:mappers/*.xml
    type-aliases-package:
      - vo 패키지 경로
      - dto 패키지 경로

spring 보다 한 단계 낮은 level에  mybatis를 넣으면 정상적으로 실행되지 않는다.
(이거 못 찾아서 2시간 헤맨 건 안 비밀)

spring:
  datasource:
    url: {DB 주소}
    username: {아이디}
    password: {비밀번호}
    driver-class-name: org.postgresql.Driver

mybatis:
  mapper-locations: classpath:mappers/*.xml
  type-aliases-package:
    - vo 패키지 경로
    - dto 패키지 경로

위와 같이 spring이랑 동일한 level에 작성해 줘야 한다.

 

3. @MapperScan 추가하기

@SpringBootApplication
@MapperScan("본인 mapper 패키지 경로 작성")   // resources 아래 있는 패키지 경로가 아님
public class BackendApplication {

    public static void main(String[] args) {
       SpringApplication.run(BackendApplication.class, args);
    }

}

 

4. mapper 패키지에는 interface 생성

@Mapper
public interface UserMapper {

    void insertUser(UserVO userVO);
    UserVO findByUsername(String username);
    UserVO findByEmail(String email);
    UserVO findByNickname(String nickname);
    void updateCreatedId(UserVO userVO);
    void updateLastLogin(UserVO userVO);
}

본인 프로젝트 파일 경로에 mapper 패키지 생성

 

5. resources 아래에 mappers 패키지에는 실제 쿼리 작성 

<?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="적용될 매퍼 인터페이스 경로">
    <insert id="insertUser" useGeneratedKeys="true" keyProperty="userId">
        INSERT INTO users (
            username,
            email,
            password,
            nickname
        )
        VALUES (
            #{username},
            #{email},
            #{password},
            #{nickname}
            )
    </insert>

</mapper>

이건 XML 기반 mapper이고 애노테이션 기반 mapper도 있다.
본인이 편한 걸로 진행하면 된다.

XML 기반은 <if>, <where> 처럼 태그를 자유롭게 쓸 수 있어서 좋은데 쿼리 작성은 불편하다.
(정확히는 쿼리라기 보단 parameterType, resultType 써주는 게 귀찮다... 타입 추론이 가능한 경우 안 써줘도 되긴 하지만 ㅋ)
애노테이션 기반은 쿼리 작성은 편한데 태그 작성이 불편하다.

각자 장단점이 있는데, 개인적으로 애노테이션이 편하다.
근데 회사에서 XML 기반으로 아직도 많이 쓰므로 둘 다 해보는 걸 권장한다.