[HATEOAS와 Self-Describtive Message 적용]_07_테스트용 DB와 설정 분리하기
PostgreSQL 적용
테스트 할 때는 계속 H2를 사용해도 좋지만 애플리케이션 서버를 실행할 때 PostgreSQL을 사용하도록 변경하자.
/scripts.md 참고
-
(운영용 DB) PostgreSQL 드라이버 의존성 추가
<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> </dependency>
-
(테스트용 DB) H2 DB test scope로 변경
<dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency>
-
도커로 PostgreSQL 컨테이너 실행
–name : 컨테이너명
-p : 포트 맵핑
-e : 컨테이너 내에서 사용할 환경변수
-d : 데몬 모드로 띄움
이미지 이름
docker run --name rest -p 5432:5432 -e POSTGRES_PASSWORD=pass -d postgres
-
도커 컨테이너에 들어가보기
-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
-
데이터소스 설정
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
-
하이버네이트 설정 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.properites
를 test > resources > 에 만들어 주고, 테스트용 리소스로 지정해준다.
테스트 리소스 application.properites
파일이 src main 에 있는 application.properites
파일명과 동일하므로 테스트 설정으로 내용이 완전히 덮어쓰워져서 적용된다.
※ 테스트용 리소스로 지정방법
[Project Structure] > [Modules] > [Sources] >** resources 폴더 선택 후, [Test Resources] 누르면 지정됨
⇒ 단점. 중복이 많아진다.
테스트에서 사용하는 DB 설정 2 - 설정 분리
-
main
application.properites
: 공용으로 사용할 설정 -
application-test.properites
: 테스트용 설정
애플리케이션 설정과 테스트 설정 중복 어떻게 줄일 것인가?
- 프로파일과 @ActiveProfiles 활용
-
파일명 변경 :
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
- 테스트용 properties를 사용하도록 선언
@ActiveProfiles("test")
: test 라는 프로파일을 사용하겠다고 알려줌
@ActiveProfiles("test")
public class EventControllerTests {