1. DB 만들기
워크 벤치로 스키마를 새로 만들고 테이블을 만들어줌
charset : utf-8mb4
Collation : Default Collation
쿼리문으로 만들어주거나
use board;
CREATE TABLE tb_board(
idx INT NOT NULL AUTO_INCREMENT COMMENT '번호(PK)',
title VARCHAR(100) NOT NULL COMMENT '제목',
content VARCHAR(3000) NOT NULL COMMENT '내용',
writer VARCHAR(20) NOT NULL COMMENT '작성자',
view_cnt INT NOT NULL DEFAULT 0 COMMENT '조회 수',
notice_yn ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '공지글 여부',
secret_yn ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '비밀글 여부',
delete_yn ENUM('Y','N') NOT NULL DEFAULT 'N' COMMENT '삭제 여부',
insert_time DATETIME NOT NULL DEFAULT NOW() COMMENT '등록일',
update_time DATETIME NULL COMMENT '수정일',
delete_time DATETIME NULL COMMENT '삭제일',
PRIMARY KEY(idx)
) COMMENT '게시판';
이렇게 만들어줌
어차피 만들면서 쿼리로 바뀜
이렇게 만들어줌
2. 스프링이랑 연결하기
데이터 소스(DataSource) 설정하기
src / main / resources 의 application.properties에 이렇게 작성해줌
#HikariCP 데이터 소스(DataSource)
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/board?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.hikari.username=username
spring.datasource.hikari.password=password
spring.datasource.hikari.connection-test-query=SELECT NOW() FROM dual
+)
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
오류 발생 시 이렇게 적어줘야 됨..
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/board?zeroDateTimeBehavior=convertToNull&useUnicode=yes&characterEncoding=UTF-8&connectTimeout=2000&autoReconnect=true&serverTimezone=UTC&useSSL=false
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
@Bean 을 사용해서 설정할 수도 있다고 함
jdbc-url : 데이터베이스의 주소, 뒤에는 설정
username : 워크벤치 유저네임
password : 워크벤치 패스워드
connection-test-query : 테스트 용 쿼리문, 정상적으로 연동되어서 실행되면 저 쿼리가 실행됨
*dual은 오라클에서 만든 임시 테이블
3. Configuration 패키지, 클래스 추가
구성, 설정파일 만들기
원래는 XML을 통해서 Bean(POJO) 을 등록했는데 규모가 커질수록 번거롭다보니
어노테이션을 이용해 등록하는 방법이 나왔다.
src / main / java 에 configuration 패키지 추가
configuration 패키지에 DBConfiguration 클래스 생성
코드 작성
package com.board2.configuration;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
@Configuration
@PropertySource("classpath:/application.properties")
public class DBConfiguration {
@Autowired
private ApplicationContext applicationContext;
@Bean
@ConfigurationProperties(prefix="spring.datasource.hikari")
public HikariConfig hikariConfig() {
return new HikariConfig();
}
@Bean
public DataSource dataSource() {
return new HikariDataSource(hikariConfig());
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception{
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
return factoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSession() throws Exception{
return new SqlSessionTemplate(sqlSessionFactory());
}
}
Bean이란
스프링(IoC)컨테이너에 의해서 관리되고 애플리케이션의 핵심을 이루는 자바 객체
POJO(Plain Old Java Object)로써 Spring 애플리케이션을 구성하는 핵심 객체
class, id, scope, constructor-arg 등을 주요 속성으로 지닌다.
스프링 컨테이너(IoC - Inversion of Control Container)
Bean(객체)의 생성과 사용, 관계, 생명 주기등을 관리한다.
BeanFactory와 ApplicationContext라는 두 개의 인터페이스로 정의되어 있다.
ApplicationContext 인터페이스는 BeanFactory 인터페이스를 상속한 서브인터페이스다.
POJO 클래스와 설정 메타데이터가 있어야 동작이 가능하다.
ApplicationContext
스프링 컨테이너를 구성하는 요소 중 하나
@Bean
개발자가 직접 제어가 불가능한 외부 라이브러리 등을 Bean으로 만드려할 때 사용하거나
개발자가 작성한 Method를 통해 반환한 객체를 Bean으로 만든다.
Bean으로 지정된 객체는 컨테이너에서 관리되는 Bean으로 등록된다.
Configuration 클래스에서 메서드에만 지정이 가능하다.
ApplicationContext.getBean( ) 으로 반환되면 Bean이다.
@Configuration
스프링 IoC Container에 해당 클래스가 Bean으로 구성된 클래스로 인식하도록 함
@Autowired
빈으로 등록된 인스턴스를 클래스에 자동 주입하는 데 사용
@ConfigurationProperties
*.properties , *.yml 파일에 있는 property를 자바 클래스에 값을 가져와서(바인딩) 사용할 수 있게 해주는 어노테이션
인자에 prefix (접두사) 속성을 지정할 수 있는데
prefix = "spring.datasource.hikari" 라고 지정하면
@PropertySource에 지정된 설정 파일 (application.properties) 에서 spring.datasource.hikari로 시작되는
설정들을 모두 읽어서 해당 메서드에 매핑(바인딩)한다.
클래스에도 지정할 수 있다.
hikariConfig
히카리CP 객체를 생성함
hikariCP란
DataBase와의 커넥션 풀(Connection Pool)을 관리해주는 라이브러리
커넥션 풀
풀(Pool)속에 데이터베이스와의 연결(커넥션)들을 미리 만들어 두고
데이터베이스에 접근시 풀에 남아있는 커넥션중 하나를 받아와서 사용한뒤 반환하는 기법을 말한다.
JDBC는 SQL을 실행할 때 마다 커넥션을 맺고 끝는 I/O 작업을 하는데, 이게 상당한 리소스를 사용하기 때문에
많이 느리다고 한다.
이런 문제를 해결하기 위해 커넥션 풀이 등장했다고 함.
dataSource는 커넥션 풀을 지원하기 위한 인터페이스임
SqlSessionFactory
sqlSessionFactory 객체는 DataSource를 참조해서 MySQL과 MyBatis를 연결해 준다.
이 객체를 생성하려면 SqlSessionFactoryBean 이라는 클래스를 이용해야 한다.
SqlSessionFactoryBean 은 MyBatis와 스프링의 연동 모듈로 사용되고
getObject 메서드 반환값을 통해 SqlSessionFactory를 생성한다.
sqlSession
SqlSession이란 RDB에 인증을 거친 논리적인 연결 상태를 말하는 것
SqlSession 클래스 : Mapper XML 에 등록된 SQL을 실행하기 위해 API 를 제공
SqlSessionTemplate
SqlSessionTemplate은 마이바티스 스프링 연동모듈의 핵심이다. SqlSessionTemplate은 SqlSession을 구현하고 코드에서 SqlSession를 대체하는 역할을 한다.
SqlSessionTemplate 은 쓰레드에 안전하고 여러개의 DAO나 매퍼에서 공유할수 있다.
getMapper()에 의해 리턴된 매퍼가 가진 메서드를 포함해서 SQL을 처리하는 마이바티스 메서드를 호출할때 SqlSessionTemplate은 SqlSession이 현재의 스프링 트랜잭션에서 사용될수 있도록 보장한다.
추가적으로 SqlSessionTemplate은 필요한 시점에 세션을 닫고, 커밋하거나 롤백하는 것을 포함한 세션의 생명주기를 관리한다.
또한 마이바티스 예외를 스프링의 DataAccessException로 변환하는 작업또한 처리한다.
라고 다큐먼트에 써있는데 뭔말이지..
SqlSessionFactory를 통해 생성된다.
4. 테스트 코드 작성
src/test/java Board2ApplicationTest.java에 작성해줌
package com.board2;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
@SpringBootTest
class Board2ApplicationTests {
@Autowired
private ApplicationContext context;
@Autowired
private SqlSessionFactory sessionFactory;
@Test
void contextLoads() {}
@Test
public void testApplicationContext() {
try {
System.out.println("=========================================");
System.out.println(context.getBean("sqlSessionFactory"));
System.out.println("=========================================");
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void testSqlSessionFactory() {
try {
System.out.println("=========================================");
System.out.println(sessionFactory.toString());
System.out.println("=========================================");
} catch (Exception e) {
e.printStackTrace();
}
}
}
메서드 이름을 더블클릭하고 우클릭 -> Run As ->Junit Test 를 하면 간단하게 테스트 할 수 있음
testApplicationContext 의 context.getBean("sqlSessionFactory");
DBConfiguration 클래스의 sqlSessionFactory 메서드의 이름을
ApplicationContext의 getBean 메서드의 인자로 지정
testApplicationContext 결과
testSqlSessionFactory 의 sessionFactory.toString();
위의 getBean() 의 인자인 sqlSessionFactory와 @Autowired로 주입한 sessionFactory는 같은 SqlSessionFactory 객체
testSqlSessionFactory 결과
참고한 글
Bean, Configuration 관련 내용
IoC 컨테이너
@ConfigurationProperties
히카리
SqlSessionFactory
sqlSession
'Web > Spring' 카테고리의 다른 글
Spring boot - 게시판 만들기 4 ( 서비스, 컨트롤러 및 View 만들기 ) (0) | 2020.10.13 |
---|---|
Spring boot - 게시판 만들기 3 ( Mapper 구현 및 테스트) (0) | 2020.10.12 |
Spring boot - 게시판 만들기 1 ( 프로젝트 설정) (2) | 2020.10.08 |
MVC 패턴 (0) | 2020.10.07 |
Spring boot 게시판 만들기 (2) | 2020.10.06 |