[TIL] 20210826

열심히 사는 루피 🥰·2021년 8월 25일
0

데브코스 백엔드 TIL

목록 보기
14/20

1. DataSource

매번 커넥션 생성, 소멸시 리소스가 많이 소모됩니다.
-> 커넥션 풀이 등장, datasource를 통해서 커넥션을 받고 반납할 수 있음!

커넥션 미리 만들어 놓고 풀에 저장해뒀다가
필요할때마다 커넥션을 가져와서 쓰고 다시 반환

커넥션 풀을 데이터소스에 의해서 가져와지고 반납된다.
따라서 커넥션 클로즈를 하는거는 사실 데이터 소스에 커넥션을 반환하는거당

*여러 데이터 소스 구현 라이브러리 있음
1. 스프링제공 : simpleDriverDataSource -> 사실 커넥션풀 개념은 아니고 그냥 열고 닫음
2. 아파치의 DBCP
3. HikariCP

2.DataSource - HikariCP

빠르고 안정적인 DBCP
spring-boot-starter-jdbc 디펜던시 설정시 함께 들어온다.

3.DataSource - CustomerRepository(1, 2)

//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;

3. TestInstance Lifecycle

원래 @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(숫자) : 숫자 순서대로(오름차순) 테스트 실행

4. JDBC Template

커넥션 맺는 부분과 예외처리 하는부분이 계속 반복된다.
이 반복되는 부분과 변경되는 부분을 템플릿 콜백 패턴을 이용해서 
JDBC 템플릿 패턴을 제공.

JDBC 템플릿: 변경이 필요한 제공해서 간결한 코드를 쓰게 해준다.
jdbcTemplate.query("select * from customers", customerRowMapper);
  1. .query() 가 실행되는 방식

  2. .update() 가 실행되는 방식

profile
반가워_! 세상아!

0개의 댓글