Spring boot

스프링 부트 - 회원 기능 테스트 학습내용

방구석 대학생 2021. 1. 7. 23:03

"인프런 - 실전! 스프링 부트와 JPA 활용1 강의를 듣고 작성한 글 입니다."

www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1#

 

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 인프런

실무에 가까운 예제로, 스프링 부트와 JPA를 활용해서 웹 애플리케이션을 설계하고 개발합니다. 이 과정을 통해 스프링 부트와 JPA를 실무에서 어떻게 활용해야 하는지 이해할 수 있습니다. 초급

www.inflearn.com

 

 

지금까지 개발한 회원 기능을 TDD 방식으로 테스트 코드를 작성하여 테스트 해보자.

 

테스트 요구사항?

- 회원 가입이 성공해야 한다.

- 회원 가입 할 때 같은 이름이 있으면 예외가 발생해야 한다.

 

@RunWith 어노테이션

: @RunWith(SpringRunner.class) : Junit 을 실행할 때 스프링을 엮어서 같이 실행시켜 준다.

 

@SpringBootTest 어노테이션

: 스프링 부트를 띄운 상태, 즉 스프링 컨테이너 내부에서 테스트를 실행하기 위한 어노테이션이다.

이게 없으면 내부에 작성해둔 @Autowired 와 같은 어노테이션 들이 모두 실패한다. 

 

@Transactional 어노테이션

: 테스트를 실행할 때 트랜잭션을 걸어두고 실행시킬 수 있게끔 해주며, 테스트가 끝난 뒤엔 데이터베이스를 롤백해버린다.

 

 

강의 중 실행된 테스트 도중 문제점?

결국 테스트 코드들이 제대로 실행되는지 확인하려면 지금까지는 h2 데이터베이스와 같은 외부 데이터베이스와 연결을 해주어야 했다.

이게 좀 귀찮은게, 테스트 케이스 하나를 돌리는 데 있어 기본적으로 테스트가 끝나면 데이터가 전부 초기회 되는게 좋다.

그렇기 때문에 테스트를 완전히 격리된 환경, 즉 자바 안에서 데이터베이스 하나를 새로 만들어서 실행시킬 수 있는 방법이 있다.

 

메모리 DB 의 활용

스프링 부트를 활용하면 메모리 DB 와 같은 기능들을 공짜로 사용할 수 있다.

 

프로젝트에서 자바 소스 코드는 기본적으로 main, test 두 가지 폴더로 나뉜다.

여기서 test 폴더에 main 폴더에 있는 것처럼 resource 폴더를 하나 만들어주고, 그 안에 application.yml 파일을 복사해오자.

application.yml 과 같은 설정 파일은 main, test 두 가지 폴더에 모두 존재하더라도 어떤 폴더의 자바 소스 코드 파일이 실행되느냐에 따라 실행 우선순위가 달라진다.

 

즉, 여기서 test 폴더에 application.yml 파일을 똑같이 하나 더 만들어 준다면, 파일의 설정 값을 통해 main 폴더의 실제 개발에 이용되는 파일들과는 전혀 상관없이 메모리 DB 를 이용하는 것이 가능해진다.

 

 

* 이쯤에서 build.gradle 파일을 한 번 살펴보자.

이 파일에서 runtimeOnly : 'com.h2database:h2' 와 같이 h2 데이터베이스가 설정되어 있는 것을 볼 수 있는데, 이게 있으면 h2 데이터베이스는 어차피 자바로 돌아가기 때문에 JVM 내부에서 지금까지 와는 달리 메모리 모드로 데이터베이스를 띄워줄 수 있다.

 

- h2 데이터베이스 홈페이지 에서 왼쪽 메뉴에 있는 cheet sheet 링크를 클릭해서 들어가보자.

www.h2database.com/html/main.html

 

H2 Database Engine

H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2 MB jar file size     Suppor

www.h2database.com

이곳에서 In-Memory 의 경우 데이터베이스의 url 을 어떻게 설정하면 되는지에 대한 정보가 나와있다.

이 페이지에서 나와있는 대로 데이터베이스의 url 을 따로 설정해주자.

 

- test\resource\application.yml

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

위와 같이 application.yml 파일을 설정한 다음 열어두었던 h2 데이터베이스를 내려준 후 테스트를 실행해보자.

결과를 보면 데이터베이스가 열려있지 않음에도 불구하고 테스트가 정상적으로 잘 수행되는 것을 확인할 수 있다.

 

이후 로그에서 p6spy 가 출력해주는 로그를 보면 테스트용 메모리 데이터베이스 url 이 정상적으로 잘 수행되는 것을 확인할 수 있다.

 

2021-01-04 17:54:41.899  INFO 1936 --- [           main] p6spy                                    : #1609750481899 | took 0ms | rollback | connection 3| url jdbc:h2:mem:test

;

 

 

* 여기서 또 하나 놀라운 점?

스프링 부트에서는 별도의 설정이 없으면 그냥 메모리 모드로 프로그램을 돌려버리기 때문에 application.yml 파일에 해놓았던 url 과 같은 설정들이 전부 없어도 상관없다.

- application.yml

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

#  jpa:
#    hibernate:
#      ddl-auto: create
#    properties:
#      hibernate:
      #  show_sql: true
#        format_sql: true

logging:
  level:
    org.hibernate.SQL: debug
    org.hibernate.type : trace

 파일을 위와 같이 바꿔 둔 후 테스트를 다시 실행해보면 테스트가 정상적으로 잘 통과되는 것을 알 수 있다.

아래는 데이터베이스 커넥션 로그이다.

2021-01-04 17:59:32.672  INFO 4944 --- [           main] p6spy                                    : #1609750772672 | took 0ms | commit | connection 6| url jdbc:h2:mem:12ac3e90-e8be-4fd2-9b2f-61183052ba4e

;

* 강의 때 강사님 로그에 표시된 url : jdbc:h2:mem:testdb

 

 

그런데 사실 테스트에 있는 yml 파일과 운영에 있는 yml 은 원래 분리를 해주는 것이 맞다.

테스트에서 필요한 설정과 운영에서 필요한 설정은 다를 수 밖에 없다.

어차피 테스트 케이스는 데이터베이스의 동작과 상관없이 작성된 코드들이 잘 돌아가는지만 확인하면 그만이다.

 

 

또 하나 자잘한 정보?

스프링 부트에서 아무 설정도 안해두면 기본적으로 데이터베이스를 create-drop 모드로 생성한다.

application.yml 파일을 위와 똑같이 별도의 설정을 주지 않고 테스트 코드를 실행했을 경우 출력되는 로그를 보면 어플리케이션 실행이 끝난 이후 drop 쿼리를 실행시키면서 생성해놓은 데이터베이스 들을 모두 삭제 시키면서 깔끔하게 초기화 시키는 것을 알 수 있다.