본문 바로가기

IT/게시판 프로젝트

springboot 게시판 만들기 3 (MariaDB 연동)

반응형

안녕하세요.

이번엔 MariaDB 연동을 해볼게요.

 

 

MariaDB는 10.6.11을 깔아주었어요.

그리고 저는 cmd 창을 이용해서 mariadb를 사용하겠습니다.

 

MariaDB에서는 Schema = Database 입니다.

스키마와 데이터베이스는 같은 개념이라고 생각해주시면 됩니다.

 

 

 

일단 'board'로 데이터베이스를 생성하겠습니다.

MariaDB [(none)]> create database board;
Query OK, 1 row affected (0.001 sec)

 

board database가 잘 생성됐는지 확인합니다.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| board              |
+--------------------+
8 rows in set (0.001 sec)

 

board database를 사용하기 위해서 use를 해줍니다.

MariaDB [(none)]> use board;
Database changed

 

 

이제 데이터 소스 설정을 해줍니다. (DB 연동)

application.properties 파일에 입력합니다.

spring.datasource.hikari.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mariadb://localhost:3306/board?serverTimezone=Asia/Seoul&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.hikari.username=root
spring.datasource.hikari.password=1234

jdbc-url   -> 데이터베이스 주소

   - 3306 : 포트번호

   - board : DB이름

   - 그 뒤의 serverTimezone, characterEncoding 등 : 시간, 한글 처리 등의 설정

 

 

이제 데이터 소스 설정 클래스(Data Source Configuration)를 추가합니다.

src/main/java 디렉터리 밑의 원래 있던 com.example.demo 에 config 패키지를 추가하고, DatabaseConfig.java 클래스를 생성합니다.

 

package com.example.demo.config;

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 DatabaseConfig {
	
	
	@Autowired							//bean으로 등록되어 있는 메서드 들이 이 생성자로 매핑됨. 이 스프링 컨테이너에 Bean들을 등록해서 의존성이 높은 문제를 해결함.
	private ApplicationContext context;
	
	//설정 파일 연결
	@Bean
	@ConfigurationProperties(prefix = "spring.datasource.hikari")	//application.properties 파일에서 spring.datasource.hikari로 시작하는 모든 설정을 읽어들여 이 메소드에 매핑함. 그리고 히카리CP(커넥션 풀 라이브러리) 객체 생성함.
	public HikariConfig hikariConfig() {
		return new HikariConfig();
	}
	
	//DB 경로 저장해놓음
	//데이터소스 객체를 생성함.
	@Bean
	public DataSource dataSource() {
		return new HikariDataSource(hikariConfig());
		//데이터소스 = 커넥션 풀을 지원하기 위한 인터페이스 (커넥션 풀 : 커넥션 객체를 생성해두고, DB에 접근하는 사용자에게 미리 생성해둔 커넥션을 제공했다가 다시 돌려받는 방법)
	}
	
	//DB 설정 파일 경로 등 정보 가짐
	//sqlSessionFactory 객체 생성함. (DB 커넥션과 SQL 실행에 대한 모든 것을 갖는 객체)
	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception{
		SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();	//SqlSessionFactoryBean : FactoryBean 인터페이스의 구현클래스임. 마이바티스와 스프링 연동 모듈로 사용됨.
		factoryBean.setDataSource(dataSource());							//factoryBean 객체는 데이터 소스를 참조하며, XML Mapper(SQL 쿼리 작성 파일)의 경로와 설정 파일 경로 등의 정보를 갖는 객체.
//		factoryBean.setMapperLocations(applicationContext.getResources("classpath:/mappers/**/*mapper.xml"));
		return factoryBean.getObject();
	}
	
	//DB 실행에 필요한 모든 메서드 가짐.
	//sqlSession 객체 생성함.
	@Bean
	public SqlSessionTemplate sqlSession() throws Exception{
		return new SqlSessionTemplate(sqlSessionFactory());					//sqlSessionTemplate은 SqlSessionFactory를 통해 생성됨, DB의 커밋과 롤백 등 SQL의 실행에 필요한 모든 메서드를 갖는 객체.
	}
}

이제 생성한 DatabaseConfig 클래스에 코드를 쳐줍니다.

(정리하면서 친 코드라 조금 지저분해요..)

 

어노테이션

@Configuration

@Configuration이 선언된 클래스는 자바 기반의 설정파일로 인식됩니다.

 

@PropertySource

해당 클래스에서 참조할 properties의 경로를 선언하여 경로를 지정합니다.

 

@Autowired

Bean으로 등록된 인스턴스를 클래스에 주입하는 데 사용합니다.

 

저는 의존성에 대한 이해가 제대로 되지 못한 상태이므로 의존성부터 다시 보겠습니다.

<DI>

DI(의존성 종속)란, 클래스간의 의존관계를 스프링 컨테이너가 자동으로 연결해주는 것을 말합니다.

DI가 필요한 이유는 객체 간 의존성을 주입해주기 위함입니다.

 

@Bean

Configuration 클래스의 메서드 레벨에만 선언이 가능합니다.

@Bean이 선언된 객체는 스프링 컨테이너에 의해 관리되는 Bean으로 등록됩니다.

(Bean = 스프링에 의하여 관리당하는 자바 객체 (그냥 객체가 아니라, ApplicationContext.getBean()으로 얻어질 수 있는 객체))

 

@ConfigurationProperties

인자에 prefix 속성을 선헌 할 수 있습니다.

위의 코드에서는 prefix에 spring.datasource.hikari를 선언하여 @PropertySource에 선언된 파일(application.properties)에서 prefix에 해당하는 spring.datasource.hikari로 시작하는 설정을 모두 읽어들여 해당 메서드에 매핑하는 것입니다.

(이 어노테이션은 메서드 뿐만 아니라 클래스 레벨에서도 선언 가능)

 

스프링컨테이너

ApplicationContext

스프링 컨테이너는 Bean의 생성, 사용, 관계, 생명 주기 등을 관리합니다.

클래스들이 서로에 대한 의존성이 높을때, 이러한 문제를 컨테이너에서 Bean을 주입받는 방법으로 해결할 수 있습니다.

 

 

메서드

hikariConfig

히카리CP 객체를 생성합니다.  히카리CP는 커넥션 풀 라이브러리 중 하나입니다.

 

dataSource

데이터 소스 객체를 생성합니다.

순수 JDBC는 SQL을 실행할 때마다 커넥션을 맺고 끊는 I/O 작업을 하는데, 이 작업은 상당한 양의 리소스를 잡아먹습니다.

그래서 이 문제를 해결하기 위해 커넥션 풀이 있습니다. 커넥션 풀은 커넥션 객체를 생성해두고, DB에 접근하는 사용자에게 미리 생성해둔 커넥션을 제공했다가 다시 돌려받는 방법입니다. 데이터 소스는 커넥션 풀을 지원하기 위한 인터페이스 입니다.

 

sqlSessionFactory

sqlSessionFactory 객체를 생성합니다.

SqlSessionFactory는 DB 커넥션과 SQL 실행에 대한 모든 것을 갖는 객체입니다. SqlSessionFactoryBean은 FactoryBean 인터페이스의 구현 클래스로, 마이바티스와 스프링의 연동 모둘로 사용됩니다.

factoryBean 객체는 데이터 소스를 참조하며, XML Mapper(SQL 쿼리 작성 파일)의 경로와 설정 파일 경로 등의 정보를 갖는 객체입니다.

 

sqlSession

sqlSession 객체를 생성합니다.

다음은 공식 문서의 정의입니다.

1. SqlSessionTemplate은 마이바티스 스프링 연동 모듈의 핵심이다.

2. SqlSessionTemplate은 SqlSession을 구현하고, 코드에서 SqlSession을 대체한다.

3. SqlSessionTemplate은 쓰레드에 안전하고, 여러 개의 DAO나 Mapper에서 공유할 수 있다.

4. 필요한 시점에 세션을 닫고, 커밋 또는 롤백하는 것을 포함한 세션의 생명주기를 관리한다.

SqlSessionTemplate은 SqlSessionFactory를 통해 생성되고, DB의 커밋, 롤백 등 SQL의 실행에 필요한 모든 메서드를 갖는 객체로 생각할 수 있습니다.

 

 

 

DB연동을 해주었으니, 이제 JUnit 단위 테스트를 해봐야합니다.

일반적으로 단위 테스트는 비즈니스 로직 또는 SQL 쿼리에 문제가 있는지 확인하는 용도로 사용됩니다.

WAS(톰캣)을 구동하지 않은 상태에서도 테스트가 가능하다는 장점이 있습니다.

 

src/test/java 디렉터리의 BoardApplicationTests에 코드를 작성합니다.

package com.example.demo;

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 Board1ApplicationTests {
	@Autowired
	private ApplicationContext context;

	@Autowired
	private SqlSessionFactory sessionFactory;

	@Test
	void contextLoads() {
	}

	@Test
	public void testByApplicationContext() {
		try {
			System.out.println("============");
			System.out.println(context.getBean("sqlSessionFactory"));
			System.out.println("============");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

context와 sessionFactory 객체를 생성해주고 context안의 Bean 객체인 SqlSessionFactory 객체의 주소값이 출력되도록 하였습니다.

 

 

콘솔에 출력이 잘 찍히는 것을 확인하였습니다 !

 

 

 

 

끗!

 

참조 : https://congsong.tistory.com/14

참조 : https://atoz-develop.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B9%88Bean%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%83%9D%EC%84%B1-%EC%9B%90%EB%A6%AC

반응형