
Spring Boot에서 MyBatis를 사용하면, XML과 어노테이션 기반 SQL 매핑을 깔끔하게 사용할 수 있습니다.
1. 의존성 추가
dependencies {
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
implementation 'org.mariadb.jdbc:mariadb-java-client'
}
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
2. application.yml 설정
spring:
datasource:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
url: jdbc:log4jdbc:mariadb://localhost:3306/demo_db
username: demo_user
password: demo_password
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/**/*.xml
type-aliases-package: com.example.demo.domain
✅ type-aliases-package 는 도메인 객체 패키지 (DTO, VO 등)
✅ mapper-locations 는 매퍼 XML 경로
✅ config-location 은 MyBatis 전역 설정 파일 (선택)
3. Mapper 인터페이스와 XML 매핑
@Mapper
public interface UserMapper {
User findById(Long id);
}
src/main/resources/mybatis/mapper/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="com.example.demo.mapper.UserMapper">
<select id="findById" resultType="User">
SELECT id, username, email
FROM users
WHERE id = #{id}
</select>
</mapper>
4. 기본 아키텍쳐 구조 설정
Controller → Service → Mapper → DB
Controller: 요청 받고, 응답 돌려줌
Service: 비즈니스 로직 처리 담당
Mapper: DB와 직접 통신 (SQL 처리)
💡 예제: 사용자(User) 조회 API 만들기
📦 패키지 구조 예시
com.example.demo
├── controller
│ └── UserController.java
├── service
│ └── UserService.java
├── mapper
│ └── UserMapper.java
├── domain
│ └── User.java
└── DemoApplication.java
1️⃣ 도메인 객체: User
package com.example.demo.domain;
import lombok.Data;
@Data
public class User {
private Long id;
private String username;
private String email;
}
2️⃣ Mapper 인터페이스 & XML
UserMapper.java
package com.example.demo.mapper;
import com.example.demo.domain.User;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
User findById(Long id);
}
UserMapper.xml
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="findById" resultType="com.example.demo.domain.User">
SELECT id, username, email
FROM users
WHERE id = #{id}
</select>
</mapper>
3️⃣ Service 클래스
package com.example.demo.service;
import com.example.demo.domain.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserMapper userMapper;
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User getUserById(Long id) {
return userMapper.findById(id);
}
}
4️⃣ Controller 클래스
package com.example.demo.controller;
import com.example.demo.domain.User;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}
🚀 실행 결과
GET http://localhost:8080/api/users/1
Response:
{
"id": 1,
"username": "ddokddok",
"email": "ddok@example.com"
}
✅ 정리 요약
| 계층 | 설명 |
|---|---|
Controller | API 진입점, 요청/응답 처리 |
Service | 로직 처리, 트랜잭션 관리 |
Mapper | SQL 쿼리 실행 (MyBatis XML or 어노테이션) |
Domain | DB와 매핑될 객체 |