04. STS - MySQL 연동하기
1) MySQL DB와 MySQL Workbench 설치
dev.mysql.com/downloads/mysql/
2) Connection 생성
password -> Store in vault로 비번 저장하고 Test Connection으로 잘 됐는지 확인
3) 스키마 생성
utf8과 utf8mb4 차이점
- utf8mb4가 utf8 charset보다 다양한 문자들을 지정하기 위하여 생겨난 charset 임. (ex : 이모티콘 등)
4) DataSource 설정하기
* 기존에 SpringBoot에선 tomcat-jdbc를 기본 Datasource 로 제공했었는데요. 2.0부터 HikariCP가 기본으로 변경되었다고 합니다. (참조 jojoldu.tistory.com/296)
@Bean 애노테이션 또는 application.properties 파일을 이용할 수 있음.
properties 이용법
해당 구문 application.properties에 작성
connection-test-query는 애플리케이션이 실행되면 해당 테스트 쿼리가 콘솔에 출력됨. (잘 연결 되었는지 확인용)
5) 패키지와 클래스 추가하기
@Configuration
- @Configuration을 선언하면 해당 클래스는 환경구성 파일이고 @Bean 어노테이션을 통해 Bean임을 알려줌
@PropertySource
- PrppertySource를 Spring 에 추가하기 위해서는 Environment 인 @Configuration 클래스와 함께 사용된다.
- @PropertySource 어노테이션에 application.properties 위치를 넣어주면 연결 객체에 프로퍼티 값이 자동으로 주입된다.
@Autowired
- 필요한 의존 객체의 “타입"에 해당하는 빈을 찾아 주입한다.
- 생성자, setter, 필드 3가지의 경우에 Autowired를 사용할 수 있다. Autowired는 기본값이 true이기 때문에 의존성 주입을 할 대상을 찾지 못한다면 애플리케이션 구동에 실패한다.
ApplicationContext
- 스프링 컨테이너 중 하나임. Bean의 생성과 사용, 관계, 생명 주기 등을 관리함. Bean은 쉽게 말하면 객체임.
@Bean
- @Bean이 지정된 객체는 컨테이너에 의해 관리되는 Bean으로 등록됨.
@ConfigurationProperties
- @ConfigurationProperties 애노테이션은 인자에 prefix 속성을 지정할 수 있음. prefix에 spring.datasource.hikari를 지정한 것은 @PropertySource에 지정된 파일(application.properties)에서 접두사 spring.datasource.hikari로 시작하는 설정을 모두 읽어 들여 해당 메소드에 맵핑합니다.
hikariConfig
- 히카리CP 객체를 생성. 히카리CP는 커넥션 풀 라이브러리 중 하나임.
dataSource
- 순수 JDBC는 SQL 실행할 때 마다 커넥션을 맺고 끊는 I/O 작업을 함. 이 작업은 리소스를 많이 잡아 먹음. 커넥션 풀은 커넥션 객체를 생성해두고 데이터베이스에 접근하는 사용자에게 커넥션을 제공했다가 돌려받는 방법임. 이를 지원하기 위한 인터페이스가 dataSource 임.
sqlSessionFactory
- SqlSessionFactory 객체를 생성. SqlSessionFactory는 데이터베이스의 커넥션과 SQL 실행에 대한 모든 것을 갖는 중요한 역할을 함. SqlSessionFactoryBean은 마이바티스와 스프링의 연동 모듈로 사용. MyBatis XML Mapper, 설정 파일 위치 등을 지정하고 SqlSessionFactoryBean 자체가 아닌 getObject 메소드가 리턴하는 SqlSessionFactory를 생성.
sqlSession
- SqlSessionTemplate은 마이바티스 스프링 연동 모듈의 핵심.
- SqlSessionTemplate은 SqlSession을 구현하고 코드에서 SqlSession을 대체하는 역할을 한다.
- SqlSessionTemplate은 쓰레드에 안전하고 여러 개의 DAO나 Mapper에서 공유할 수 있음.
- 필요한 시점에 세션을 닫고 커밋 또는 롤백하는 것을 포함한 세션의 생명주기를 관리함.
- SqlSessionTemplate은 SqlSessionFactory를 통해 생성되고 데이터베이스의 커밋, 롤백 등 SQL의 실행에 필요한 모든 메소드를 갖는 객체로 생각할 수 있음.
6) 테스트 코드 작성 (JUnit을 이용해 단위 테스트 하는 방법)
@SpringBootTest
class BoardApplicationTests {
@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();
}
}
@Test
public void testBySqlSessionFactory() {
try {
System.out.println("=========================");
System.out.println(sessionFactory.toString());
System.out.println("=========================");
} catch (Exception e) {
e.printStackTrace();
}
}
}
메소드를 지정하고 오른쪽 클릭하여 Run As -> JUnit Test 선택
다음은 testByApplicationContext 메서드의 테스트 실행 결과입니다.
DBConfiguration 클래스의 sqlSessionFactory 메서드의 이름을 ApplicationContext의 getBean 메서드의 인자로 지정합니다.
testBySqlSessionFactory 메소드 테스트 실행 결과.
앞에서 getBean 메소드의 인자로 지정항 sqlSessionFactory와 @Autowired로 주입한 sessionFactory는 동일한 SqlSessionFactory 객체.
다른 방법으로는 @Bean 애노테이션의 name 속성을 이용해 이름 지정 가능.
sqlSessionFactory 메소드 이름을 "abc"로 변경해서 실행한 결과.
주의 할 점은 name 속성을 사용하면 메소드 이름으로 Bean을 가져올 수 없음.