[도입]
자바에서는 데이터베이스를 이용하기 위해 JDBC API를 이용하는데, 개발자가 작성해야 하는 코드가 너무 많아 불편했다. 이런 JDBC를 사용하기 쉽게 SQL Mapper를 이용한 MyBatis의 간단 예제를 살펴보자.
[MyBatis 동작 원리]
1. 애플리케이션이 시작되면 SqlSessionFactoryBuilder는 MyBatis 설정 파일을 참고해서 SqlSessionFactory를 생성한다.
2. 애플리케이션에서 Sql 요청이 들어오면 SqlSession을 생성한다.
3. 생성한 SqlSession는 수행하는 쿼리문이 담겨져 있는 mapper를 참고하여 DB작업을 수행한다.
[Mapper Interface]
MyBatis 3.0이전에는 xml파일에 쿼리 명령문을 작성했어야 했는데, 3.0이후부터는 Mapper Interface를 사용하여 간단하게 쿼리문 작성이 가능해졌다.
@Mapper
public interface userMapper {}
Mapper인터페이스를 호출하면, SqlSession 메서드 호출을 통해 SQL 처리를 요청한다.
@Mapper 어노테이션을 통해 스프링부트가 해당 클래스를 Mapper로 인식할 수 있으며 해당 interface를 MyBatis mapper 빈으로 등록한다.
MyBatis & Spring Boot 예제
프로젝트 설정
start.spring.io 사이트에 접속하여 다음 dependency를 추가해준다.
- spring web
- mybatis
- mysql
프로젝트 구조
User 정보를 MyBatis, MySql을 사용하여 저장하고 불러오는 간단한 예제를 해보자. 구조는 다음과 같다.
프로젝트 구조
DB 코드 작성
create table user
(
id int auto_increment
primary key,
name varchar(30) not null,
addr varchar(30) not null
);
프로그램 코드
[user.class]
@Data
public class User {
private int id;
private String name;
private String addr;
}
[UserMapper.class]
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user")
List<User> findAll();
@Insert("insert into user values(#{id}, #{name}, #{addr})")
void insertUser(User user);
}
UserMapper 인터페이스가 호출시 구현체가 SqlSession 메서드 호출을 통해 SQL 실행을 요청한다.
#{}의 매개변수 명을 User의 파라미터와 동일하게 작성해줌으로써 매칭시킬 수 있다.
[UserService.class]
@Service
@RequiredArgsConstructor
public class UserService {
private final UserMapper userMapper;
public List<User> getAllUsers() {
return userMapper.findAll();
}
public void insertUser() {
User user = new User();
user.setId(5);
user.setName("kim");
user.setAddr("seoul");
log.info("user = {} ", user);
userMapper.insertUser(user);
}
}
데이터베이스에 등록된 모든 사용자 정보를 불러오는 getAllUsers() 메소드와 새로운 유저를 저장하는 insertUser() 메소드를 작성하였다.
[UserController.class]
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping("/users")
public String AllUsers() {
StringBuilder sb = new StringBuilder();
List<User> allUsers = userService.getAllUsers();
for (User allUser : allUsers) {
sb.append(allUser.getName() + " ");
}
return sb.toString();
}
@GetMapping("/insert")
public String insertUser() {
userService.insertUser();
return "DB에서 확인해보세요";
}
}
@RestController 어노테이션을 추가해 별도의 템플릿을 사용하지 않고 body에 결과를 출력하도록 작성하였다.
http://localhost:8080/users 로 접속하면 다음과 같은 화면이 나온다.
http://localhost:8080/insert로 접속하면 insertUser()에 있는 User정보가 데이터베이스에 저장된다.
http://localhost:8080/users 로 접속하면 다음과 같은 화면이 나온다. (DB에 있는 유저 정보의 이름을 불러온다)
http://localhost:8080/insert로 접속하면 insertUser()에 있는 User정보가 데이터베이스에 저장된다.
@Insert의 매칭 규칙
MyBatis의 @Insert 어노테이션은 다음과 같은 규칙으로 데이터베이스의 컬럼과 User의 필드값을 매칭한다.
1. User 클래스에 setter가 있으면 setter를 호출한다.
2. 필드 이름을 기준으로 매핑한다.
3. 생성자를 기준으로 매핑한다. 이 때 생성자의 파라미터 순서와 DB의 컬럼 순서가 일치해야 한다.