[HATEOAS와 Self-Describtive Message 적용]_07_테스트용 DB와 설정 분리하기

1 minute read

PostgreSQL 적용

테스트 할 때는 계속 H2를 사용해도 좋지만 애플리케이션 서버를 실행할 때 PostgreSQL을 사용하도록 변경하자.

/scripts.md 참고

  1. (운영용 DB) PostgreSQL 드라이버 의존성 추가

    <dependency>
    	<groupId>org.postgresql</groupId>
    	<artifactId>postgresql</artifactId>
    </dependency>
    
  2. (테스트용 DB) H2 DB test scope로 변경

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
    </dependency>
    
  3. 도커로 PostgreSQL 컨테이너 실행

    –name : 컨테이너명

    -p : 포트 맵핑

    -e : 컨테이너 내에서 사용할 환경변수

    -d : 데몬 모드로 띄움

    이미지 이름

    docker run --name rest -p 5432:5432 -e POSTGRES_PASSWORD=pass -d postgres
    
  4. 도커 컨테이너에 들어가보기

    -i : interactive 모드로 실행

    -t target : 타겟 지정

    실행할 명령어 : ex)bash

    docker exec -i -t rest bash
    su - postgres
    # -U : postgres(기본 유저), -d : postgres(기본 DB )
    psql -d postgres -U postgres
    # 모든 데이터베이스 목록 출력
    \l
    # 현재 접속한 데이터베이스의 모든 테이블 목록 출력
    \dt
    
  5. 데이터소스 설정

    application.properties

    spring.datasource.username=postgres
    spring.datasource.password=pass
    spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
    spring.datasource.driver-class-name=org.postgresql.Driver
    
  6. 하이버네이트 설정 application.properties

    # 스키마 설정
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
    # 쿼리 포맷팅
    spring.jpa.properties.hibernate.format_sql=true
    # 쿼리 로깅
    logging.level.org.hibernate.SQL=DEBUG
    # 쿼리가 보여질 때 실제 입력되는 값을 확인
    logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
    

⇒ 애플리케이션을 실행하면 DB 스키마가 생성되면서 잘 동작하는 것 확인

create table event (
   id int4 not null,
    base_price int4 not null,
    begin_enrollment_date_time timestamp,
    begin_event_date_time timestamp,
    close_enrollment_date_time timestamp,
    description varchar(255),
    end_event_date_time timestamp,
    event_status varchar(255),
    free boolean not null,
    limit_of_enrollment int4 not null,
    location varchar(255),
    max_price int4 not null,
    name varchar(255),
    offline boolean not null,
    primary key (id)
)

테스트에서 사용하는 DB 설정 1 - 오버라이딩

현재 통합 테스트로 @SpringBootTest 애노테이션을 사용하고 있다. @SpringBootTest 애노테이션은

@SpringBootApplication 애노테이션을 찾아서 빈으로 등록하기 때문에 application.properites 설정까지도 같이 읽어들인다.

따라서 운영에서 사용하는 PostgreSQL DB 설정을 사용하게 된다.

테스트용 application.properitestest > resources > 에 만들어 주고, 테스트용 리소스로 지정해준다.

테스트 리소스 application.properites 파일이 src main 에 있는 application.properites 파일명과 동일하므로 테스트 설정으로 내용이 완전히 덮어쓰워져서 적용된다.

※ 테스트용 리소스로 지정방법

[Project Structure] > [Modules] > [Sources] >** resources 폴더 선택 후, [Test Resources] 누르면 지정됨

⇒ 단점. 중복이 많아진다.

테스트에서 사용하는 DB 설정 2 - 설정 분리

  • main application.properites: 공용으로 사용할 설정

  • application-test.properites : 테스트용 설정

애플리케이션 설정과 테스트 설정 중복 어떻게 줄일 것인가?

  • 프로파일과 @ActiveProfiles 활용
  1. 파일명 변경 : application-test.properties

    • datasource를 H2 DB로 설정

    • 오버라이딩할 내용만 남기거나, 테스트를 실행할 때만 적용할 설정들만 남기면 된다.

spring.datasource.username=sa
spring.datasource.password=
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver

spring.datasource.hikari.jdbc-url=jdbc:h2:mem:testdb
# 방언관련 설정
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
  1. 테스트용 properties를 사용하도록 선언
    • @ActiveProfiles("test") : test 라는 프로파일을 사용하겠다고 알려줌
@ActiveProfiles("test")
public class EventControllerTests {