대규모 트래픽 게시판 구축 시리즈 #5: MySQL 데이터베이스 연결 설정

2024. 9. 5. 13:31·프레임워크/자바 스프링

안녕하세요. 이번 글에서는 '대규모 트래픽 게시판' 프로젝트에서 MySQL 데이터베이스 연결과 MyBatis 설정 방법에 대해 알아보겠습니다.

1. 개요

대규모 트래픽을 처리하는 게시판 시스템에서 데이터베이스 연결과 ORM(Object-Relational Mapping) 설정은 매우 중요합니다. 우리 프로젝트에서는 MySQL을 데이터베이스로, MyBatis를 ORM 프레임워크로 사용하며, 이를 효율적으로 연결하고 관리하기 위해 DatabaseConfig와 MysqlConfig 클래스를 구현했습니다.

2. DatabaseConfig 클래스

DatabaseConfig 클래스는 데이터베이스 연결을 위한 DataSource를 설정합니다.

package com.example.boardserver.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DatabaseConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
}

주요 구성 요소

@ConfigurationProperties(prefix = "spring.datasource")

  • 이 어노테이션은 application.properties 또는 application.yml 파일에서 "spring.datasource" 접두사로 시작하는 모든 속성을 바인딩합니다.
  • 예를 들어, spring.datasource.url, spring.datasource.username 등의 속성이 자동으로 DataSource 객체에 설정됩니다.
  • 이를 통해 데이터베이스 연결 정보를 외부 설정 파일에서 쉽게 관리할 수 있습니다.

@Bean

  • 이 어노테이션은 메서드가 Spring 컨테이너에 의해 관리되는 빈을 생성함을 나타냅니다.
  • dataSource() 메서드가 반환하는 객체는 Spring의 애플리케이션 컨텍스트에 등록되어 다른 빈에서 주입받아 사용할 수 있습니다.

DataSourceBuilder.create().build()

  • DataSourceBuilder는 Spring Boot에서 제공하는 유틸리티 클래스로, DataSource 객체를 쉽게 생성할 수 있게 해줍니다.
  • create() 메서드는 DataSourceBuilder 인스턴스를 생성합니다.
  • build() 메서드는 설정된 속성을 바탕으로 실제 DataSource 객체를 생성합니다.
  • 이 방식은 클래스패스에 있는 DataSource 구현체(예: HikariCP, Tomcat JDBC, Commons DBCP 등)를 자동으로 감지하여 사용합니다.

MysqlConfig 클래스의 주요 구성 요소

이러한 상세한 구성 요소들이 함께 작동하여 MySQL 데이터베이스와 MyBatis를 Spring Boot 애플리케이션에 효과적으로 통합하고, 대규모 트래픽 처리에 적합한 데이터 액세스 계층을 구성합니다.

3. MysqlConfig 클래스

MysqlConfig 클래스는 MyBatis 설정을 담당하며, SqlSessionFactory를 생성합니다.

package com.example.boardserver.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import javax.sql.DataSource;

@Configuration
@MapperScan(basePackages = "com.example.boardserver.mapper")
public class MysqlConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);

        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setMapperLocations(resolver.getResources("classpath:mappers/*.xml"));

        Resource myBaticConfig = new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml");
        sessionFactory.setConfigLocation(myBaticConfig);
        return sessionFactory.getObject();
    }
}

주요 구성 요소

@MapperScan(basePackages = "com.example.boardserver.mapper")

  • 이 어노테이션은 MyBatis 매퍼 인터페이스를 스캔할 기본 패키지를 지정합니다.
  • 지정된 패키지와 그 하위 패키지에서 @Mapper 어노테이션이 붙은 인터페이스를 찾아 MyBatis 매퍼로 등록합니다.
  • 이를 통해 각 매퍼 인터페이스에 대한 구현체를 수동으로 생성할 필요가 없어집니다.

SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception

  • 이 메서드는 MyBatis의 핵심 컴포넌트인 SqlSessionFactory를 생성합니다.
  • DataSource를 파라미터로 받아 데이터베이스 연결 정보를 설정합니다.

SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean()

  • SqlSessionFactoryBean은 MyBatis-Spring 연동 모듈에서 제공하는 클래스로, SqlSessionFactory를 생성하는 데 사용됩니다.
  • 이 빈을 통해 MyBatis 설정을 Spring의 애플리케이션 컨텍스트에 통합할 수 있습니다.

sessionFactory.setDataSource(dataSource)

  • SqlSessionFactoryBean에 DataSource를 설정합니다. 이는 DatabaseConfig에서 생성한 DataSource 빈이 주입됩니다.

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver()

  • 이 클래스는 지정된 위치에서 리소스를 찾는 데 사용되는 Spring의 유틸리티 클래스입니다.
  • Ant-style 패턴 매칭을 사용하여 리소스를 검색할 수 있습니다.

sessionFactory.setMapperLocations(resolver.getResources("classpath:mappers/*.xml"))

  • MyBatis 매퍼 XML 파일의 위치를 설정합니다.
  • "classpath:mappers/*.xml" 패턴은 클래스패스의 mappers 디렉토리 아래에 있는 모든 XML 파일을 매퍼로 인식하게 합니다.

Resource myBaticConfig = new PathMatchingResourcePatternResolver().getResource("classpath:mybatis-config.xml")

  • MyBatis의 설정 파일(mybatis-config.xml)의 위치를 지정합니다.
  • 이 설정 파일에는 MyBatis의 전역 설정(예: 캐시 설정, 타입 알리아스 등)이 포함될 수 있습니다.

sessionFactory.setConfigLocation(myBaticConfig)

  • SqlSessionFactoryBean에 MyBatis 설정 파일의 위치를 설정합니다.

return sessionFactory.getObject()

  • SqlSessionFactoryBean으로부터 실제 SqlSessionFactory 객체를 생성하여 반환합니다.
  • 이 객체는 Spring 컨테이너에 의해 관리되며, 애플리케이션에서 MyBatis 작업을 수행할 때 사용됩니다.

4. MyBatis 설정 파일 (mybatis-config.xml)

mybatis-config.xml 파일은 MyBatis의 전역 설정을 관리하는 중요한 파일입니다. 이 파일을 통해 전역적으로 캐싱, 지연 로딩(Lazy Loading)과 같은 옵션을 제어할 수 있습니다.

<?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>
    <settings>
        <!-- camelCase 자동 변환 설정 -->
        <setting name="mapUnderscoreToCamelCase" value="true" />

        <!-- null 값일 때 setter 메서드 호출 -->
        <setting name="callSettersOnNulls" value="true"/>
    </settings>
</configuration>

주요 설정

  • mapUnderscoreToCamelCase: 데이터베이스의 스네이크 케이스(snake_case) 컬럼명을 자바의 카멜 케이스(camelCase) 필드명으로 자동 변환합니다.
  • callSettersOnNulls: null 값을 setter 메서드에 전달하여 빈 객체를 생성합니다.

5. Mapper XML 설정

MyBatis의 Mapper XML 파일은 SQL 쿼리와 매핑을 정의합니다. 각 매퍼는 SQL 쿼리를 직접 작성하며, SQL 구문을 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.boardserver.mapper.CategoryMapper">

    <insert id="register" parameterType="com.example.boardserver.dto.CategoryDTO">
        INSERT category(name)
        VALUES (#{name})
    </insert>

    <update id="updateCategory" parameterType="com.example.boardserver.dto.CategoryDTO">
        UPDATE category
        SET name = #{name}
        WHERE id = #{id}
    </update>

    <delete id="deleteCategory">
        DELETE FROM category
        WHERE id = #{id}
    </delete>
</mapper>

주요 구성 요소

  • insert, update, delete: SQL 쿼리를 정의하고, DTO 객체의 필드를 바인딩합니다.
  • #{name}: MyBatis는 바인딩 변수를 통해 객체 필드의 값을 SQL에 바인딩합니다.

6. Spring Boot와 MyBatis 통합 과정

MyBatis는 Spring Boot와 통합되어 자동 구성이 가능하며, MapperScan 어노테이션을 통해 매퍼 인터페이스를 자동으로 등록합니다. 이를 통해 SQL 쿼리 매핑 작업이 매우 간편해집니다.

7. application.properties 설정

두 설정 클래스가 제대로 작동하려면 application.properties 파일에 다음과 같은 데이터베이스 연결 정보가 포함되어 있어야 합니다:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/board
spring.datasource.username=your_username
spring.datasource.password=your_password
mybatis.mapper-locations=classpath:mappers/*.xml

8. 결론

이번 글에서는 DatabaseConfig, MysqlConfig, mybatis-config.xml 파일을 통해 MySQL 데이터베이스 연결과 MyBatis 설정 방법에 대해 알아보았습니다. 이러한 설정은 대규모 트래픽을 처리하는 게시판 시스템에서 안정적이고 효율적인 데이터베이스 작업을 가능하게 합니다.

저작자표시

'프레임워크 > 자바 스프링' 카테고리의 다른 글

대규모 트래픽 게시판 구축 시리즈 #7: Spring AOP를 활용한 인증 및 인가  (0) 2024.09.05
대규모 트래픽 게시판 구축 시리즈 #6: 유저 API  (1) 2024.09.05
대규모 트래픽 게시판 구축 시리즈 #4: 프로젝트 초기 셋업  (3) 2024.09.05
대규모 트래픽 게시판 구축 시리즈 #3: 도커를 이용한 데이터베이스 구축  (5) 2024.09.05
대규모 트래픽 게시판 구축 시리즈 #2: 프로젝트 기획 및 요구 사항  (0) 2024.09.05
'프레임워크/자바 스프링' 카테고리의 다른 글
  • 대규모 트래픽 게시판 구축 시리즈 #7: Spring AOP를 활용한 인증 및 인가
  • 대규모 트래픽 게시판 구축 시리즈 #6: 유저 API
  • 대규모 트래픽 게시판 구축 시리즈 #4: 프로젝트 초기 셋업
  • 대규모 트래픽 게시판 구축 시리즈 #3: 도커를 이용한 데이터베이스 구축
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (282)
      • 여러가지 (107)
        • 알고리즘 & 자료구조 (72)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (38)
        • 파이썬 (30)
        • 자바 (3)
        • 스프링부트 (5)
      • 운영체제 (0)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (2)
        • 도커 (2)
        • AWS (0)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (0)
        • 정보처리기사 (0)
      • 재태크 (4)
        • 암호화폐 (4)
        • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    완전탐색
    OOP
    AWS
    자바
    RDS
    DP
    FastAPI
    Python
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    SAA
    그리디
    reactor
    EC2
    WebFlux
    Spring WebFlux
    Redis
    java
    프로그래머스
    celery
    docker
    백준
    spring
    ecs
    Docker-compose
    mybatis
    시험
    취업리부트
    Spring Boot
    항해99
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
대규모 트래픽 게시판 구축 시리즈 #5: MySQL 데이터베이스 연결 설정
상단으로

티스토리툴바