2020. 5. 28. 21:29ㆍ강의/스프링 부트 개념과 활용
1. 프로파일
프로파일이란 스프링 프레임워크에서 기본적으로 제공해주는 기능이다. 특정 프로파일에서 특정 Bean을 등록하고 싶다거나, 애플리케이션의 동작을 Bean설정을 다르게 해주어 실행시킬 수 있도록 하는 등의 역할을 한다. 프로파일은 @Configuration 이나 @Component와 함께 주로 사용되는데, @Profile("프로파일 이름")으로 등록을 해주어 사용할 수 있다. 이렇게 프로파일을 지정해주면 해당 프로파일일 때만 그 설정파일 또는 Bean을 사용할 수 있게 된다.

위와 같이 왼쪽은 Profile을 prod로 설정해야 해당 Bean이 주입되고, 오른쪽은 Profile을 test로 설정해주어야 Bean이 주입되는 것이다.




특정 profile을 적용시키는 방법은 application.properties에 spring.profiles.active 를 통해 설정할 수 있다. 위와 같이 어떤 profile을 설정하느냐에 따라 주입되는 Bean이 다른것을 확인 할 수 있었다.
한편, spring.profiles.include 를 사용하면 다른 프로파일 프로퍼티도 적용시켜서 여러 프로퍼티를 적용시킬 수 있다.
2. 테스트
테스트 코드를 작성하는 것은 내가 계속해서 관심을 갖는 부분이었는데, 강의 내용에 포함되어 있어서 아주 좋았다. 테스트 코드를 작성해본 경험이, 자바 콘솔 프로그램을 만들면서 밖에 없었기 때문에 호기심을 가지고 듣게 되었다.
1) 먼저, 테스트기능을 사용하기 위해서 spring-boot-starter-test 의존성을 추가해 준다. 이때 scope를 test로 설정하여 추가해준다.

2) 테스트 클래스에는 @RunWith(SpringRunner.class) 와 @SpringBootTest를 달아준다.
(@SpringBootTest는 @SpringBootApplication을 찾아가서 프로덕션에서 사용하는 모든 bean을 찾아서 test용 applicationContext에 등록을 해준다. 그 다음 MockBean이 있다면 교체해주는 작업을 해준다.)
@SpringBootTest는 반드시 @RunWith(SpringRunner.class)와 함께 사용되어야 하는데 , webEnvironment값을 설정할 수 있다. 이 설정값은 MOCK, RANDOM_PORT, NONE이 있는데 각각의 경우 테스트를 어떻게 하는지 간단히 코드를 작성해 보았다.
2-1) MOCK



webEnvironment의 설정값이 MOCK일 경우 위의 테스트 코드를 보면 MockMvc를 주입받아 사용하는 것을 볼 수 있다. 이 객체를 이용하여 컨트롤러를 테스트할 수 있는데, 사용되는 메소드 등은 따로 공부를 해야겠다 ...
2-2) RANDOM_PORT

webEnvironment의 설정값이 RANDOM_PORT일경우 MockMvc객체가 아닌 TestRestTemplate객체를 사용하여 위와 같이 테스트 할 수 있다.
3) 위와 같은 과정중에 스프링 부트는 @MockBean을 사용하여 좀더 유연한 테스트를 가능하게 해준다. MockBean은 주입받은 빈의 내용을 사용자가 원하는 값으로 변경하여 테스트할 수 있다. 이것이 매우 유용한 이유는 자바 콘솔 프로그램을 만들때 느꼈다. 예를들어 본 프로덕션 코드에서 랜덤값을 사용하는 로직에 대한 테스트는 매번 다른 결과를 낼 수 밖에없다. (모든 경우에 대해 assertion할 수 없기 때문에.) 이때 랜덤이 아닌 사용자가 원하는 값으로 변경하여 테스트할 수 있다면 본 프로덕션 코드를 건드리지 않고도 편하게 테스트를 할 수 있게 된다. 직접 사용하다보면 더욱 와닿을 것이다.

위와 같이 MockBean을 통해 SampleService를 주입받을때는 테스트에서만 사용할 mockSampleService로 주입받는다. 이후 when과 then을 통해 해당 메소드가 실행됬을때 기대되는 값을 직접 정해줌으로써 간편히 테스트 할 수 있다. (나의 경우에는 위와 같은 예시로는 필요성이 와닿지 않았었지만 랜덤값을 내놓는 로직에 대한 테스트를 작성할때 참 와닿았다.)
정리하자면 @MockBean은 ApplicationContext에 들어있는 빈을 Mock으로 만든 객체로 교체하고, 모든 @Test 마다 자동으로 리셋된다.
테스트는 기본적으로 동기식으로 진행된다. 이것은 하나의 테스트요청이 있으면 테스트 결과를 받고나서야 다음 작업을 할 수 있다는 것을 의미한다. 스프링부트에서는 webTestClient를 이용하여 비동기식으로 테스트를 할 수 있도록 제공하고 있다. (webTestClient는 웹플럭스 의존성이 들어와 있어야 사용할 수 있다 !)

백기선님은 비동기식이 아니더라도 해당 API가 편해서 webTestClient를 사용하실것 같다고 하셨다!
그 외에 슬라이스 테스트라는 개념이 있는데, 레이어 별로 잘라서 테스트하고 싶을때 사용한다고 한다. ( 나중에 따로 정리해 보아야 겠다.)
'강의 > 스프링 부트 개념과 활용' 카테고리의 다른 글
| [인프런 강의] 스프링 부트 개념과 활용 - 6 (0) | 2020.06.04 |
|---|---|
| [인프런 강의] 스프링 부트 개념과 활용 - 5 (0) | 2020.06.03 |
| [인프런 강의] 스프링 부트 개념과 활용 - 3 (0) | 2020.05.27 |
| [인프런 강의] 스프링 부트 개념과 활용 - 2 (0) | 2020.05.26 |
| [인프런 강의] 스프링 부트 개념과 활용 - 1 (0) | 2020.05.26 |