spring boot 공부 - 1 - Mysql 연동 및 설정

문문·2023년 4월 23일
0

Spring Boot에 DB를 연동해 보겠습니다.
저는 Mysql을 사용할 거예요.

Tool : MySQL Workbench

스키마 명 : jpa
board라는 이름을 가진 테이블을 생성해 주세요.

create table board (
    id bigint not null auto_increment comment 'PK',
    title varchar(100) not null comment '제목',
    content text not null comment '내용',
    writer varchar(20) not null comment '작성자',
    hits int not null comment '조회 수',
    delete_yn enum('Y', 'N') not null comment '삭제 여부',
    created_date datetime not null comment '생성일',
    modified_date datetime comment '수정일',
    primary key (id)
) comment '게시판';

application.properties 파일을 열어서 아래 코드를 넣어주세요.

# 데이터 소스 (Data Source)
spring.datasource.hikari.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.jdbc-url=jdbc:mysql://localhost:3306/jpa?serverTimezone=Asia/Seoul&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.hikari.username=username
spring.datasource.hikari.password=password

# Resource and Thymeleaf Refresh
spring.devtools.livereload.enabled=true
spring.thymeleaf.cache=false

# JPA Properties
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=none
spring.jpa.open-in-view=false
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true


Database 및 userName, userPassword는 자신이 설정한 정보로 수정해 주세요.

데이터 소스 클래스 작성


위 경로로 DatabaseConfig 클래스를 생성합니다.

//DB와 커넥션을 관리해 주는 인터페이스.
@Configuration //어노테이션 선언을 통해 JAVA 기반의 설정 파일임을 인식한다.
@PropertySource("classpath:/application.properties") //해당 클래스에 참조할 properties의 경로를 선언한다.
public class DatabaseConfig {
    @Autowired //Bean으로 등록 된 인터페이스(객채)를 클래스에 주입하는데 사용
    private ApplicationContext context;

    @Bean //Configuration 클래스의 메서드 레벨에만 선언 가능, @Bean이 선언된 객체는 스프링 컨테이너에 의해 관리되는 Bean으로 등록됨.
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    /* 이 어노테이션은 인자에 prefix 속성을 선언할 수 있음.
    @PropertySource에 선언된 파일(application.properties)에서,
    prefix에 해당하는 spring.datasource.hikari로 시작하는 설정을 모두 읽어 들여
    해당 메서드에 매핑(바인딩)하는 개념임.
    */
    public HikariConfig hikariConfig() { //하커라CP 객체를 생성함. 커넥션 풀 라이브러리 중 하나임.
        return new HikariConfig();
    }

    @Bean
    public DataSource dataSource() {
    /*dataSource 데이터 소스 객체 생성. 커넥션 객체를 생성해 두고, DB에 접근하는 사용자에게 미리 생성해 둔 커넥션을
    제공했다가 다시 돌려받는 방법.
    dataSource는 커넥션 풀을 지원하기 위한 인터페이스이다.
    */
        return new HikariDataSource(hikariConfig());
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        /* sqlSessionFactory
        sqlSessionFactory 객체를 생성. DB 커넥션과 SQL 실행에 대한 모든 것을 갖는 객체.
        sqlSessionFactoryBean은 FactoryBean 인터페이스의 구현 클래스로 MyBatis와 스프링의 연동 모듈로 사용됨.
            ㄴ factoryBean 객체 데이터는 소스를 참조하며 XML Mapper(SQL 쿼리 작성 파일)의 경로와 설정 파일 경로 등의 정보를 갖는 객체.
         */
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource());
        return factoryBean.getObject();
    }

    @Bean
    public SqlSessionTemplate sqlSession() throws Exception {
        //SqlSessiontemplate는 SqlSessionFactory를 통해 생성되고 DB의 커밋, 롤백 등 SQL의 실행에 필요한 모든 메서드를 갖는 객체.
        return new SqlSessionTemplate(sqlSessionFactory());
    }
}

단위 테스트 진행하기

우리가 만든 DB와 Spring boot이 잘 붙었는지 확인하기 위해 JUNIT으로 단위 테스트를 진행 할게요.
단위 테스트는 비즈니스 로직 또는 SQL 쿼리에 문제가 있는지...등을 확인할 수 있는 중요한 부분입니다. 또한 프로젝트 간 테스트를 위해 WAS를 구동할 필요가 없어 시간 단축면에서 좋습니다.

테스트 코드 작성
HhiiApplication 클래스에서 소스에 커서를 위치하고 command + shift + T를 누르면 HhiiApplicationTests가 생성됩니다.
Test Class가 생성되는 위치는 src/test 하위에 생성됩니다.

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 HhiiApplicationTests {

	@Autowired
	private ApplicationContext context;

	@Autowired
	private SqlSessionFactory sessionFactory;

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

	@Test
	public void testBySqlSessionFactory() {
		try {
			System.out.println("####################" + sessionFactory.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
  1. testByApplicationConntext 단위 테스트를 해주세요.
    콘솔에 SqlSessionFactory 객체의 주소 값이 출력되었는지 확인하고 BUILD SUCCESSFUL이 나왔는지 확인해 주세요.
  2. 다음은 testBySqlSessionFactory 단위 테스트를 진행해 주세요.
    콘솔 주소 값 출력 확인, BUILD SUCCESSFUL 확인해 주세요.

Bean 이름 변경해 보기

@Bean 어노테이션의 name 속성을 이용해서 객체를 주입 받는 방법.
SqlSessionFactory 빈의 이름을 "abc"로 변경해서 단위 테스트 실행

  • DatabaseConfig 클래스의 SqlSessionFactory 매소드에 선언되어 있는 @Bean -> @Bean(name="abc")으로 변경
  • test 클래스의 testByApplicationContext 매서드에 getBean을 abc로 변경
    		public void testByApplicationContext() {
    			try {
    				System.out.println("@@@@@@@@@@@@@@@" + context.getBean("abc"));
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
 - 테스트 진행
 !!주위해야 할 점 : name 속성을 선언하면 메서드명으로는 Bean을 주입받을 수 없음.
 - 테스트 성공 했으면 다시 원상복구 시켜주세요.

0개의 댓글