매번 커넥션 생성, 소멸시 리소스가 많이 소모됩니다.
-> 커넥션 풀이 등장, datasource를 통해서 커넥션을 받고 반납할 수 있음!
커넥션 미리 만들어 놓고 풀에 저장해뒀다가
필요할때마다 커넥션을 가져와서 쓰고 다시 반환
커넥션 풀을 데이터소스에 의해서 가져와지고 반납된다.
따라서 커넥션 클로즈를 하는거는 사실 데이터 소스에 커넥션을 반환하는거당
*여러 데이터 소스 구현 라이브러리 있음
1. 스프링제공 : simpleDriverDataSource -> 사실 커넥션풀 개념은 아니고 그냥 열고 닫음
2. 아파치의 DBCP
3. HikariCP
빠르고 안정적인 DBCP
spring-boot-starter-jdbc 디펜던시 설정시 함께 들어온다.
//DataSorce를 HikariDataSource 타입을 제작해서 주입받아 사용하기!
@Configuration
@ComponentScan(basePackages = {"org.prgrms.kdt.customer"})
static class config{
@Bean
public DataSource dataSource(){
var dataSource = DataSourceBuilder.create()
.url("jdbc:mysql://localhost/database이름")
.username("사용자이름")
.password("사용 비밀번호")
.type(HikariDataSource.class)
.build();
return dataSource;
}
}
@Autowired
CustomerJdbcRepository customerJdbcRepository;
@Autowired
DataSource dataSource;
원래 @BeforeAll은 static 메소드.
따라서 그 안에서 인스턴스 변수에 접근이 안된다.
-> @TestInstance(TestInstance.Lifecycle.PER_CLASS) // 클래스 단위로 인스턴스 하나 생성.
-> 따라서 @BeforeAll이 static 아니여도 되고, 내부 필드들을 가지고 작업도 가능하다
[추가 조사]
JUnit 에서는 @Test 가 붙은 테스트 메서드를 실행시킬 때, 각각 클래스를 새로 로딩 한다.
왜냐면 -> @TestInstance(TestInstance.Lifecycle.PER_METHOD)가 디폴트라서 메소드 별로 로딩한다.
그래서 BeforeAll이 스태틱이여야 한다.
BeforeAll이 전체 테스트 이전에 한번만 실행되므로
각 테스트 메소드의 인스턴스가 생성되지 않았더라도, 호출되어야 하기 때문.
참고: 링크
클래스 단위로 실행할 테스트에서 순서를 정해 진행하지 않으면 오류가 발생할 수 있다.
이때 테스트 클래스에
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)를 달아서 순서대로 실행하게 할 수 있다.
MethodOrderer.{?}.class | |
---|---|
OrderAnnotation | @order(숫자) 어노테이션 순서대로 |
DisplayName | @DisplayName("") 알파벳순 |
MethodName | 메소드 명 알파벳순 |
Random | 랜덤 순서대로 |
@order(숫자) : 숫자 순서대로(오름차순) 테스트 실행
커넥션 맺는 부분과 예외처리 하는부분이 계속 반복된다.
이 반복되는 부분과 변경되는 부분을 템플릿 콜백 패턴을 이용해서
JDBC 템플릿 패턴을 제공.
JDBC 템플릿: 변경이 필요한 제공해서 간결한 코드를 쓰게 해준다.
jdbcTemplate.query("select * from customers", customerRowMapper);
.query() 가 실행되는 방식
.update() 가 실행되는 방식