이 글에서는 Spring Boot 초기 설정 및 MySQL 설정 관련 내용은 다루지 않습니다.
항목 | 버전 |
---|---|
Spring Boot | 3.2.2 |
Java | 17 |
Gradle | 8.5 |
MySQL | 8.0.35 |
MyBatis | 3.5.14 |
src
├─main
│ ├─java
│ │ └─com
│ │ └─study
│ │ └─board
│ │ ├─controller
│ │ │ └─BoardController.java
│ │ ├─dto
│ │ │ └─Board.java
│ │ ├─dao
│ │ │ └─BoardMapper.java
│ │ ├─service
│ │ │ └─BoardService.java
│ │ ├─BoardApplication.java
│ │ └─MybatisConfig.java
│ │
│ └─resources
│ ├─mapper
│ │ └─BoardMapper.xml
│ ├─application.yml
│ └─mybatis-config.yml
│
└─test
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
board_id | int unsigned | NO | PRI | auto_increment | |
title | varchar(100) | NO | |||
content | text | YES | |||
writer | varchar(20) | NO | |||
password | varchar(200) | NO | |||
views | int unsigned | NO | 0 | ||
created_at | timestamp | NO | CURRENT_TIMESTAMP | DEFAULT_GENERATED | |
modified_at | timestamp | NO | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
프로젝트에 MyBatis와 MySQL을 연동하기 위해 MyBatis 및 MYSQL 관련 의존성을 추가해야 한다.
dependencies {
...
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
runtimeOnly 'com.mysql:mysql-connector-j'
}
mybatis-spring-boot-starter
mysql-connector-j
MyBatis와 MySQL 연동을 위해 설정 파일에 DB 연결 정보와 MyBatis 설정 정보를 추가해야 한다. 파일 형식으로 yml
을 사용하는 이유는 관리의 편리함 때문이다. 원한다면 properties
로도 작성 가능하다.
spring:
# DB 연결 정보
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/board?serverTimezone=UTC&characterEncoding=utf8
username: user
password: 1234
# MyBatis 설정 정보
mybatis:
config-location: classpath:mybatis-config.xml
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.study.board
key | 설명 | value | 설명 |
---|---|---|---|
driver-class-name | DB에 연결하기 위해 사용되는 JDBC 드라이버의 클래스명 | com.mysql.cj.jdbc.Driver | · MySQL Connector/J 8.0 이상 버전에 포함된 드라이버 클래스 · Java 애플리케이션과 MySQL DB 간의 연결 관리 |
url | DB의 위치를 나타내는 JDBC URL | jdbc:mysql://localhost:3306/board? serverTimezone=UTC &characterEncoding=utf8 | · localhost : DB가 로컬 시스템에 설치됨· 3306 : 사용중인 MySQL 서버의 포트 번호· board : 사용중인 MySQL 서버의 DB 이름· serverTimezone=UTC : 서버의 시간대를 UTC로 설정· characterEncoding=utf8 : 문자 인코딩으로 UTF-8 사용 |
username | DB에 접속하기 위한 사용자 이름 | user | - |
password | DB 사용자의 비밀번호 | 1234 | - |
config-location | MyBatis의 전역 구성 파일의 위치 지정 | classpath:mybatis-config.xml | · classpath 상의 mybatis-config.xml 파일 참조· MyBatis 설정 정의 및 초기화에 사용 |
mapper-locations | MyBatis Mapper 파일들의 위치 지정 | classpath:mapper/*.xml | · classpath 상의 mapper 디렉토리 내 모든 .xml 파일을 Mapper 파일로 로드 |
type-aliases-package | 타입 별칭을 자동으로 스캔할 패키지의 위치 지정 | com.study.board | · 해당 패키지와 하위 패키지에서 MyBatis가 사용할 수 있는 타입 별칭을 정의한 클래스 검색 |
사용할 mapper 파일을 매핑해준다.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<mappers>
<mapper resource="mapper/BoardMapper.xml"/>
</mappers>
</configuration>
SpringBoot와 MyBatis를 연동할 때, SqlSessionFactory
와 SqlSessionTemplate
을 Bean으로 등록해야 한다.
package com.study.board;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import javax.sql.DataSource;
@Configuration
public class MybatisConfig {
/**
* SqlSessionFactory 빈 생성
*
*
* @param dataSource 데이터베이스 연결을 위한 DataSource 객체
* @return SqlSessionFactoryBean 객체
* @throws Exception 예외 처리
*/
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource); // 데이터 소스 설정
// MyBatis 설정 파일 위치 지정
sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));
return sqlSessionFactoryBean.getObject(); // SqlSessionFactory 반환
}
/**
* SqlSessionTemplate 빈 생성
*
*
* @param sqlSessionFactory SqlSessionFactory 객체
* @return SqlSessionTemplate 인스턴스
*/
@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory); // SqlSessionTemplate 반환
}
}
SqlSessionFactory
SqlSessionTemplate
프로젝트 설정 완료 후, 게시판 목록을 조회하는 예제를 통해 MyBatis와 MySQL을 사용하여 데이터를 관리하는 과정의 실제 작업 흐름을 살펴보도록 할 것이다.
게시판의 게시물 정보를 담는 데이터 전송 객체를 작성해준다.
package com.study.board.dto;
import lombok.*;
import java.time.LocalDateTime;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Board {
private long id; // 게시물의 ID
private String title; // 제목
private String content; // 내용
private String writer; // 작성자
private long views; // 조회수
private LocalDateTime createdAt; // 작성일자
private LocalDateTime modifiedAt; // 수정일자
}
게시판의 게시물 데이터에 접근하기 위한 mapper 인터페이스를 작성해주고, Mapper 파일에 실제 SQL 쿼리를 작성해준다.
MyBatis Mapper 인터페이스로, @Mapper
어노테이션을 사용하여 Spring Boot에서 자동으로 인식된다. 게시물 목록을 조회하는 getAllBoardList
메소드를 정의한다.
package com.study.board.dao;
import com.study.board.dto.Board;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface BoardMapper {
List<Board> getAllBoardList();
}
실제 SQL 쿼리가 작성되는 파일로, SELECT
쿼리를 통해 모든 게시물을 최신 순으로 조회한다.
<?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.study.board.dao.BoardMapper">
<select id="getAllBoardList" resultType="com.study.board.dto.Board">
SELECT * FROM tb_board ORDER BY board_id DESC;
</select>
</mapper>
사용자의 요청을 처리하고 비즈니스 로직을 실행하는 Controller 및 Service Layer를 구현한다.
BoardMapper
를 주입받아, 데이터베이스로부터 게시물 목록을 가져오는 비즈니스 로직을 처리한다.
package com.study.board.service;
import com.study.board.dto.Board;
import com.study.board.dao.BoardMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class BoardService {
private final BoardMapper boardMapper;
@Autowired
public BoardService(BoardMapper boardMapper) {
this.boardMapper = boardMapper;
}
public List<Board> getAllBoardList() {
return boardMapper.getAllBoardList();
}
}
사용자의 요청을 받아 게시물 목록을 조회하고, 이를 반환한다. @RestController
어노테이션을 사용하여, JSON 형태로 데이터를 클라이언트에 전송한다.
package com.study.board.controller;
import com.study.board.dao.Board;
import com.study.board.service.BoardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.time.LocalDateTime;
import java.util.List;
@RestController
public class BoardController {
private final BoardService boardService;
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
@GetMapping("/list")
public List<Board> findAll() {
return boardService.getAllBoardList();
}
}
이러한 구성을 통해, 사용자는 웹 애플리케이션을 통해 게시물 목록을 조회할 수 있다. 사용자의 요청은 Controller를 통해 Service로 전달되고, Service는 Mapper를 통해 데이터베이스와의 상호작용을 관리한다. 이 과정에서 MyBatis는 SQL 쿼리 실행과 결과 매핑을 담당하여, 개발자가 객체 지향적인 방식으로 데이터베이스를 다룰 수 있도록 지원한다.