[Spring Boot] MyBatis, MySQL 연동

joyful·2024년 2월 13일
2

Java/Spring

목록 보기
19/28
post-custom-banner

❗ 들어가기 전에

이 글에서는 Spring Boot 초기 설정 및 MySQL 설정 관련 내용은 다루지 않습니다.

🔎 관련 글 보러가기


⚙️ 프로젝트 환경

🛠️ 개발 도구

항목버전
Spring Boot3.2.2
Java17
Gradle8.5
MySQL8.0.35
MyBatis3.5.14

📁 Project 구조

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

🗄️DB 구조

FieldTypeNullKeyDefaultExtra
board_idint unsignedNOPRIauto_increment
titlevarchar(100)NO
contenttextYES
writervarchar(20)NO
passwordvarchar(200)NO
viewsint unsignedNO0
created_attimestampNOCURRENT_TIMESTAMPDEFAULT_GENERATED
modified_attimestampNOCURRENT_TIMESTAMPDEFAULT_GENERATED

🛠️ Setting

⌨️ Build.gradle

프로젝트에 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
    • MyBatis를 Spring Boot 애플리케이션에 쉽게 통합할 수 있도록 도와주는 도구
    • MyBatis 설정 자동화
    • Spring Boot 애플리케이션의 구성 및 일관성 유지
  • mysql-connector-j
    • MySQL DB를 Java Application과 연결하는데 사용되는 JDBC 드라이버
    • MySQL과의 통신을 위한 표준 API 제공
    • DB 연결, 쿼리 실행, 결과 처리 등의 작업 수행

⌨️ application.yml

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-nameDB에 연결하기 위해 사용되는 JDBC 드라이버의 클래스명com.mysql.cj.jdbc.Driver· MySQL Connector/J 8.0 이상 버전에 포함된 드라이버 클래스
· Java 애플리케이션과 MySQL DB 간의 연결 관리
urlDB의 위치를 나타내는 JDBC URLjdbc:mysql://localhost:3306/board?
serverTimezone=UTC
&characterEncoding=utf8
· localhost : DB가 로컬 시스템에 설치됨
· 3306 : 사용중인 MySQL 서버의 포트 번호
· board : 사용중인 MySQL 서버의 DB 이름
· serverTimezone=UTC : 서버의 시간대를 UTC로 설정
· characterEncoding=utf8 : 문자 인코딩으로 UTF-8 사용
usernameDB에 접속하기 위한 사용자 이름user-
passwordDB 사용자의 비밀번호1234-
config-locationMyBatis의 전역 구성 파일의 위치 지정classpath:mybatis-config.xml· classpath 상의 mybatis-config.xml 파일 참조
· MyBatis 설정 정의 및 초기화에 사용
mapper-locationsMyBatis Mapper 파일들의 위치 지정classpath:mapper/*.xml· classpath 상의 mapper 디렉토리 내 모든 .xml 파일을 Mapper 파일로 로드
type-aliases-package타입 별칭을 자동으로 스캔할 패키지의 위치 지정com.study.board· 해당 패키지와 하위 패키지에서 MyBatis가 사용할 수 있는 타입 별칭을 정의한 클래스 검색

⌨️ mybatis-config.xml

사용할 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>

⌨️ MybatisConfig.java

SpringBoot와 MyBatis를 연동할 때, SqlSessionFactorySqlSessionTemplate을 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
    • MyBatis와 데이터베이스 사이의 세션을 관리
    • SQL 실행이나 트랜잭션 관리에 필요한 SqlSession 인스턴스를 생성하는 데 사용
  • SqlSessionTemplate
    • MyBatis의 SqlSession 구현 및 스프링 트랜잭션 설정과의 통합을 용이하게 함
    • SqlSession의 스레드 안전한 공유 인스턴스를 제공하여, SQL 작업 실행 및 트랜잭션 관리를 단순화

🔎 사용

프로젝트 설정 완료 후, 게시판 목록을 조회하는 예제를 통해 MyBatis와 MySQL을 사용하여 데이터를 관리하는 과정의 실제 작업 흐름을 살펴보도록 할 것이다.

📝 DTO(Data Transfef Object)

게시판의 게시물 정보를 담는 데이터 전송 객체를 작성해준다.

Board.java

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;	// 수정일자
    
}

📝 DAO(Data Access Object) & Mapper

게시판의 게시물 데이터에 접근하기 위한 mapper 인터페이스를 작성해주고, Mapper 파일에 실제 SQL 쿼리를 작성해준다.

BoardMapper.java

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();
}

BoardMapper.xml

실제 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>

📝 Service & Controller

사용자의 요청을 처리하고 비즈니스 로직을 실행하는 Controller 및 Service Layer를 구현한다.

BoardService.java

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();
    }
    
}

BoardController.java

사용자의 요청을 받아 게시물 목록을 조회하고, 이를 반환한다. @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 쿼리 실행과 결과 매핑을 담당하여, 개발자가 객체 지향적인 방식으로 데이터베이스를 다룰 수 있도록 지원한다.

profile
기쁘게 코딩하고 싶은 백엔드 개발자
post-custom-banner

0개의 댓글