RootConfig class는 DB 관련 설정을 하는 곳이다.
그러므로 DB에서 root 계정으로 로그인을 하여 User를 생성하고
프로젝트에서 사용할 DB의 권한을 먼저 부여했다.
# User 생성 / DB 생성
-- root 계정으로 DB 생성, User 생성
-- DB 생성 구문
CREATE DATABASE DB이름;
-- user 생성 구문
CREATE USER 'User이름'@'localhost' identified by 'User의 비밀번호';
-- user 권한 부여
GRANT ALL PRIVILEGES ON DB이름.*
TO 'mywebUser'@'localhost'
WITH GRANT OPTION;
-- 권한 설정 완료
FLUSH PRIVILEGES;
그 후, User 계정으로 로그인하여 board Table을 생성했다.
# DB 테이블 생성
CREATE TABLE board(
bno BIGINT NOT NULL auto_increment,
title VARCHAR(200) NOT NULL,
writer VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
reg_at DATETIME DEFAULT now(),
mod_at DATETIME DEFAULT now(),
read_count INT DEFAULT 0,
cmt_qty INT DEFAULT 0,
has_file INT DEFAULT 0,
PRIMARY KEY(bno)
);
DB 관련 내용은 src > main > webapp > resources에 Untitled Text File을 생성하여
sql이라는 이름으로 저장하며 기록한다.
지금까지 기록한 sql은 다음과 같다.
sql
-- 2024-01-16
# User 생성 / DB 생성
-- root 계정으로 DB 생성, User 생성
-- DB 생성 구문
CREATE DATABASE db명;
-- user 생성 구문
CREATE USER 'user명'@'localhost' identified by 'user의 비밀번호';
-- user 권한 부여
GRANT ALL PRIVILEGES ON mywebdb.*
TO 'user명'@'localhost'
WITH GRANT OPTION;
-- 권한 설정 완료
FLUSH PRIVILEGES;
# DB 테이블 생성
CREATE TABLE board(
bno BIGINT NOT NULL auto_increment,
title VARCHAR(200) NOT NULL,
writer VARCHAR(100) NOT NULL,
content TEXT NOT NULL,
reg_at DATETIME DEFAULT now(),
mod_at DATETIME DEFAULT now(),
read_count INT DEFAULT 0,
cmt_qty INT DEFAULT 0,
has_file INT DEFAULT 0,
PRIMARY KEY(bno)
);
RootConfig class는 먼저 전체적인 코드를 쓰고 하나하나 분석을 하고자 한다.
RootConfig.java
package com.basicWeb.www.config;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
@MapperScan(basePackages = {"com.basicWeb.www.repository"})
@ComponentScan(basePackages = {"com.basicWeb.www.service"})
@EnableTransactionManagement
@Configuration
public class RootConfig {
// DB 설정 부분
// hikariCP 사용 / log4jdbc-log4j2 사용
// log4jdbc 안쓸거면 Driver는 기존대로 작성하면 된다.
@Autowired
ApplicationContext applicationContext;
@Bean
public DataSource dataSource() {
HikariConfig hikariConfig = new HikariConfig();
// log4jdbc-log4j2
hikariConfig.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy");
hikariConfig.setJdbcUrl("jdbc:log4jdbc:mysql://localhost:3306/DB명");
hikariConfig.setUsername("User이름");
hikariConfig.setPassword("User의 비밀번호");
hikariConfig.setMaximumPoolSize(5); //최대 커넥션 개수
hikariConfig.setMinimumIdle(5); //최소 유휴 커넥션 개수(위의 값과 같은 값으로 설정)
hikariConfig.setConnectionTestQuery("SELECT now()"); //test 쿼리문
hikariConfig.setPoolName("springHikariCP"); // 그냥 이름 설정이므로 본인이 원하는 대로 작성 가능
// 추가 설정
// cachePrepStmts : cache 사용 여부 설정
hikariConfig.addDataSourceProperty("dataSource.cachePrepStmts", "true");
// mysql Driver가 연결당 cache statement의 수에 관한 설정 : 250 ~ 500 사이 권장
hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSize", "250");
// connection 당 캐싱할 preperedStatement의 개수 지정 옵션 : default 256
hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSqlLimit", "true"); // 기본값으로 설정
// mysql 서버에서 최신 이슈가 있을 경우 지원받는 설정
hikariConfig.addDataSourceProperty("dataSource.useServerPrepStmts", "true");
HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
return hikariDataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlFactoryBean = new SqlSessionFactoryBean();
// 위에 있는 dataSource() method 사용
sqlFactoryBean.setDataSource(dataSource());
sqlFactoryBean.setMapperLocations(
applicationContext.getResources("classpath:/mappers/*.xml"));
// Alilas 설정하려고
sqlFactoryBean.setConfigLocation(
applicationContext.getResource("classpath:/MybatisConfig.xml"));
return sqlFactoryBean.getObject();
}
// Transaction Manager Bean 설정
@Bean
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
}
코드 설명에 앞서 어노테이션(@)들은 다음과 같은 기능을 한다.
@MapperScan(basePackages = {}) | Package 내의 MyBatis Mapper Interface를 스캔하여 Bean으로 등록 |
@ComponentScan(basePackages = {}) | @Component 어노테이션이 붙은 class를 찾아서 Bean으로 등록 |
@EnableTransactionManagement | @Transactional 어노테이션 등을 사용하여 Transaction관리 |
@Configuration | Spring이 class를 읽어서 Bean들을 생성하고 관리 |
@Autowired | Springframwork에서 사용되는 어노테이션으로 필드, 메서드, 생성자 등에 사용되며, 해당 타입의 Bean을 자동으로 Injection하도록 Spring에 지시 |
@Bean | 해당 Method가 컨테이너에게 Bean을 제공하며 Method의 return 값은 해당 Bean의 인스턴스가 됨 |
ApplicationContext를 이용하면 Bean을 검색하거나, 다른 Bean과의 상호작용,
Resources 로딩 등 다양한 기능을 수행한다.
@Autowired
ApplicationContext applicationContext;
dataSource() Method의 hikariConfig의 경우 공식 홈페이지를 참고하여 작성했다.
공식 홈페이지는 https://github.com/brettwooldridge/HikariCP이다.
DriverClassName는 log4jdbc-log4j2를 사용하여 SQL 로깅을 위한 DriverSpy를 설정한 것이고
JdbcUrl / Username / Password는 나의 DB와 사용자에 맞추어 설정했다.
hikariConfig.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy");
hikariConfig.setJdbcUrl("jdbc:log4jdbc:mysql://localhost:3306/DB명");
hikariConfig.setUsername("User이름");
hikariConfig.setPassword("User의 비밀번호");
@Bean
public DataSource dataSource() {
HikariConfig hikariConfig = new HikariConfig();
// log4jdbc-log4j2
hikariConfig.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy");
hikariConfig.setJdbcUrl("jdbc:log4jdbc:mysql://localhost:3306/DB명");
hikariConfig.setUsername("User이름");
hikariConfig.setPassword("User의 비밀번호");
hikariConfig.setMaximumPoolSize(5); //최대 커넥션 개수
hikariConfig.setMinimumIdle(5); //최소 유휴 커넥션 개수(위의 값과 같은 값으로 설정)
hikariConfig.setConnectionTestQuery("SELECT now()"); //test 쿼리문
hikariConfig.setPoolName("springHikariCP"); // 그냥 이름 설정이므로 본인이 원하는 대로 작성 가능
// 추가 설정
// cachePrepStmts : cache 사용 여부 설정
hikariConfig.addDataSourceProperty("dataSource.cachePrepStmts", "true");
// mysql Driver가 연결당 cache statement의 수에 관한 설정 : 250 ~ 500 사이 권장
hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSize", "250");
// connection 당 캐싱할 preperedStatement의 개수 지정 옵션 : default 256
hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSqlLimit", "true"); // 기본값으로 설정
// mysql 서버에서 최신 이슈가 있을 경우 지원받는 설정
hikariConfig.addDataSourceProperty("dataSource.useServerPrepStmts", "true");
HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);
return hikariDataSource;
}
sqlSessionFactory() Method는 MyBatis를 사용하여 데이터베이스와 상호작용하는
SqlSessionFactory Bean을 설정한다.
dataSouce() Method를 사용하여 Mapper의 위치를 설정하고 필요시에 Alilas도 설정할 수 있도록 코드를
작성하였다.
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sqlFactoryBean = new SqlSessionFactoryBean();
// 위에 있는 dataSource() method 사용
sqlFactoryBean.setDataSource(dataSource());
sqlFactoryBean.setMapperLocations(
applicationContext.getResources("classpath:/mappers/*.xml"));
// Alilas 설정하려고
sqlFactoryBean.setConfigLocation(
applicationContext.getResource("classpath:/MybatisConfig.xml"));
return sqlFactoryBean.getObject();
}
transactionManager() Method는 데이터베이스 Transaction을 관리한다.
@Bean
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
sqlSessionFactor() Method에서 mapper와 MybatisConfig.xml의 위치를 선언해 주었으니,
각각 생성하고자 한다.
경로는 src / main / resources 하위로 공통이고 mappers는 package로 MybatisConfig는 xml로 생성한다.
MybatisConfig의 경우 https://mybatis.org/mybatis-3/ko/getting-started.html를 참고하여 작성했다.
MybatisConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
일반적으로 DB는 _ 로 단어구분
read_count (sql) = > readCount (java)
mapUnderscoreToCamelCase 변경하는 역할
-->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<!-- 사용할 경우 사용 -->
<!-- <typeAlias type="" alias=""/> -->
</typeAliases>
</configuration>
mapUnderscoreToCamelCase는
DB에서 자주 쓰는 단어 구분과 Java에서 자주 쓰는 단어 구분의 상호호환을 위해 사용한다.
[Spring] 06. RootConfig class 설정
(다음 게시물 예고편)
[Spring] 07. 초기 레이아웃 설정 (header.jsp / nav.jsp / footer.jsp)
얼렁뚱땅 주니어 개발자
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!