Web/Spring

Spring boot - 게시판 만들기 2 (MySQL 연동, 설정, Configuration 관련 용어정리)

dev_sr 2020. 10. 8. 18:58

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 결과

 

 

참고한 글

 

스프링 부트(Spring Boot) 게시판 - MySQL(HikariCP) 연동하기 [개발을 시작해봐요!]

이전 글에서는 스프링 부트의 프로젝트 구조와 필수적인 파일, MVC 패턴에 대해 알아보았습니다. 이번에는 스프링 부트와 MySQL 데이터베이스를 연동하는 시간을 가져보도록 할 건데요. MySQL 데이�

congsong.tistory.com

 

 

Bean, Configuration 관련 내용

 

[SpringBoot] @Bean, @Configuration, @Component 어노테이션

기존의 Spring MVC에서는 xml을 활용하여 Bean을 등록하고 있었다. 하지만 프로젝트의 규모가 커짐에 따라 사용하는 요소들을 xml에 등록하는 것이 상당히 번거로워 져서 어노테이션(Annotation, @)를 활�

mangkyu.tistory.com

 

스프링 빈(Spring Bean)이란? [번역]

https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-introduction 스프링 빈이 무엇입니까? 무슨 용어는 이렇게 많은지.. 간단하게 한줄로 답하자면 스프링 빈이란 자바 객..

endorphin0710.tistory.com

 

 

Spring - @Bean 어노테이션과 @Component 어노테이션(DI) - 2

@Component, @Bean 프로그램이 거대해 짐에 따라 XML 을 이용하여 IOC Container 를 설정하는 것이 점점 어려워졌고 때문에 Annotation(@) 이란 것이 등장했다(이하 어노테이션). 어노테이션은 코드에 메타데��

galid1.tistory.com

 

IoC 컨테이너

 

토비의 스프링 - IoC 컨테이너와 DI

이 글은 “토비의 스프링” 책 내용을 정리한 글입니다. 만약 저작권 관련 문제가 있다면 “gunjuko92@gmail.com”로 메일을 보내주시면, 바로 삭제하도록 하겠습니다. 토비의 스프링 - IoC 컨테이너와

gunju-ko.github.io

 

@ConfigurationProperties

 

@ConfigurationProperties 사용법 - 개발자 삽질 일기

- @configurationproperties 사용법 - ConfigurationProperties *.properties , *.yml 파일에 있는 property를 자바 클래스에 값을 가져와서(바인딩) 사용할 수 있게 해주는 어노테이션 Spring boot 에서는 운영에..

programmer93.tistory.com

 

히카리

 

Spring에 커넥션풀(Connection Pool) 등록 - HikariCP

커넥션풀(Connection Pool) 이란? 위의 그림처럼 풀(Pool)속에 데이터베이스와의 연결(커넥션)들을 미리 만들어 두고 데이터베이스에 접근시 풀에 남아있는 커넥션중 하나를 받아와서 사용한뒤 반환��

chocodrogba.tistory.com

 

SqlSessionFactory

 

[Spring] 6.MyBatis설정-SqlSessionFactory

 

kookyungmin.github.io

 

sqlSession

 

mybatis-spring – 마이바티스 스프링 연동모듈 | SqlSession 사용

SqlSession 사용 마이바티스에서는 SqlSession를 생성하기 위해 SqlSessionFactory를 사용한다. 세션을 한번 생성하면 매핑구문을 실행하거나 커밋 또는 롤백을 하기 위해 세션을 사용할수 있다. 마지막으�

mybatis.org

 

 

mybatis Framework (마이바티스 개념, ibatis와 차이, 구조, api, SqlSession)

1. 마이바티스란? 객체지향 언어인 자바의 관계형 데이터 베이스 프로그래밍을 좀더 쉽게 할수 있게 도와주는 개발 프레임워크이다. 자바는 jdbc api 를 제공해주지만, 이런 JDBC를 이용하면 1개 클�

sjh836.tistory.com