안녕하세요. 이번 글에서는 '대규모 트래픽 게시판' 프로젝트에서 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 |