공부가 싫은 개발자
[Spring Boot] MyBatis 설정하기 본문
의미 없는 서론...
매번 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 기반으로 아직도 많이 쓰므로 둘 다 해보는 걸 권장한다.
'스프링' 카테고리의 다른 글
| [Spring Boot] Gmail SMTP로 이메일 보내기 (0) | 2025.12.18 |
|---|---|
| [Spring boot JPA] @Query 수정, 삭제 (0) | 2023.03.15 |
| [Spring boot JPA] Fetch 전략과 orphanRemoval (0) | 2023.03.15 |
| [Spring boot JPA] 엔티티의 양방향 관계 (0) | 2023.02.19 |