https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start
MyBatis는 자바 애플리케이션에서 관계형 데이터베이스와의 상호작용을 단순화하는 SQL 매핑 프레임워크이다. SQL을 코드와 분리해 XML 또는 애노테이션으로 관리하며, JDBC API의 복잡함을 줄이고, SQL 중심의 데이터베이스 작업을 간소화함 ORM 도구인 Hibernate와 달리 SQL 제어권을 개발자에게 주며, 필요한 경우 직접 SQL을 작성할 수 있다.
ResultSet을 수동으로 처리하지 않아도 객체와 데이터베이스 필드를 쉽게 매핑할 수 있음<if>, <choose>, <foreach> 등을 사용하여 조건부 쿼리, 반복, 동적 쿼리도 가능mybatis-config.xml)을 기반으로 구성됨selectOne(), selectList(): 데이터 조회.insert(), update(), delete(): 데이터 수정 및 삭제.build.gradle 파일에 MyBatis와 데이터베이스 드라이버 의존성을 추가해보자
dependencies {
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2'
implementation 'org.mariadb.jdbc:mariadb-java-client:3.1.2'
}
mybatis-config.xml)MyBatis의 글로벌 설정을 정의하는 파일
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"<https://mybatis.org/dtd/mybatis-3-config.dtd>">
<configuration>
<!-- 환경 설정 -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
</configuration>
mapUnderscoreToCamelCase: 데이터베이스의 snake_case 컬럼 이름을 Java의 camelCase 필드 이름으로 자동 매핑.application.properties에서 데이터베이스 연결 정보를 설정해보자
spring.datasource.url=jdbc:mariadb://localhost:3306/mydatabase
spring.datasource.username=myuser
spring.datasource.password=mypassword
# MyBatis 매퍼 설정
mybatis.type-aliases-package=com.example.demo.model
mybatis.mapper-locations=classpath:mapper/*.xml
public class User {
private int id;
private String name;
private String email;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface UserMapper {
@Select("SELECT * FROM users")
List<User> findAllUsers();
@Select("SELECT * FROM users WHERE id = #{id}")
User findUserById(int id);
}
XML 파일에서 SQL을 정의할 수도 있다. (위 매퍼 인터페이스와 함께 사용 가능)
mapper/UserMapper.xml<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"<https://mybatis.org/dtd/mybatis-3-mapper.dtd>">
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="findAllUsers" resultType="com.example.demo.model.User">
SELECT * FROM users
</select>
<select id="findUserById" parameterType="int" resultType="com.example.demo.model.User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
private final UserMapper userMapper;
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public List<User> getAllUsers() {
return userMapper.findAllUsers();
}
public User getUserById(int id) {
return userMapper.findUserById(id);
}
}
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping
public List<User> getAllUsers() {
return userService.getAllUsers();
}
@GetMapping("/{id}")
public User getUserById(@PathVariable int id) {
return userService.getUserById(id);
}
}
| 특징 | MyBatis | JPA (Hibernate) |
|---|---|---|
| 쿼리 제어권 | SQL을 직접 작성 | SQL 자동 생성 |
| 성능 | SQL 최적화 가능 | ORM으로 인해 복잡한 쿼리 성능 저하 가능 |
| 복잡한 쿼리 처리 | 복잡한 쿼리에 적합 | 복잡한 쿼리 작성 시 번거로움 |
| 학습 곡선 | 낮음 | 비교적 높음 |
| 엔터티 관계 처리 | 수동 처리 필요 | 자동 처리 |