2021. 8. 24. 08:00γBack-End μμ μ€/Spring Framework
μλ νμΈμ? μ£Όλνλ μ λλ€.
λ³Έ λ΄μ©μ μ£Όλνλμ΄ Web κ°λ° νλ‘μ νΈλ₯Ό νλ©΄μ λμ νλ κΈ°μ λ€μ λν λ΄μ©μ μ 리νλ κ³³ μ λλ€!
μ΄ κΈμ ν¨κ» νλ‘μ νΈ νλ Back End κΏλ무 Crewκ° μμ±ν κ²μ΄μμ.
μ£Όλνλλ Back End κ°λ°μ 맑μμλ΅λλ€!
μ ν¬ νλ‘μ νΈμμλ JUnit κ³Ό Mockitoλ₯Ό μ¬μ©νμ¬ ν μ€νΈ μ½λλ₯Ό μμ±νμμ΅λλ€.
π¨π» κ²°λ‘
ν μ€νΈ μ½λλ₯Ό κ° κ³μΈ΅λ§λ€ μμ±ν¨μΌλ‘μ¨ κ°λ° μκ°μ΄ λ¨μΆλλ ν¨κ³Όλ₯Ό μ»μ μ μμμ΅λλ€.
ν μ€νΈλ₯Ό μ½κ²νκΈ° μν΄μ, μ΄ν리μΌμ΄μ μ½λλ₯Ό μ½κ² μ§κ² λμκ³ κ²°κ΅ ν μ€νΈ μ½λλ₯Ό μ§κΈ° μν΄ λ Έλ ₯νλ€ λ³΄λ, μ΄ν리μΌμ΄μ μ½λκ° κΉλν΄μ§λ κ²μ κ²½νν μ μμμ΅λλ€.
무μ보λ€λ μλ²λ₯Ό μ€νμν€μ§ μμλ, DBμ κ°μ λ£μ§ μμλ, μ§μ λμΌλ‘ νμΈνμ§ μμλ ν μ€νΈ μ½λλ§ μ€νμν€λ©΄ μ¬λ¬ λ¨μν μ€νΈλ₯Ό λͺ μ΄ λ§μ μλ£ν μ μμμ΅λλ€.
ν μ€νΈ μ½λλ νμ μ λ¬Έμλ‘ μ¬μ©μ΄ κ°λ₯νκΈ° λλ¬Έμ κ°λ μ±μ΄ λκ², F.I.R.S.T μμΉμ μ λ§μΆ°μ μμ±ν΄μΌ νλ€λκ±Έ λλ μ μμμ΅λλ€.
π¨π» ν μ€νΈ μ½λλ₯Ό μ μμ±ν΄μΌ ν κΉμ?
APIλ₯Ό κ°λ°νλ©΄μ ν μ€νΈ μ½λλ κΌ μμ±λμ΄μΌ νλ€κ³ μκ°νμμ΅λλ€.
ν μ€νΈ μ½λλ₯Ό μ§μ§ μκ³ ν μ€νΈλ₯Ό μ§νν κ²½μ° μλ²λ₯Ό μΌκ³ , DBμ κ°μ λ£λ μμ μ΄ μ΄λ£¨μ΄μ ΈμΌ ν©λλ€. κ·Έλ¦¬κ³ κ°λ°μκ° μ μμ μΌλ‘ λ‘μ§μ΄ μ²λ¦¬ λμλμ§ μ§μ λμΌλ‘ νμΈν΄μΌν©λλ€.
νμ§λ§ ν μ€νΈ μ½λλ₯Ό μμ±νλ€λ©΄ μλ²λ₯Ό μ€ννμ§ μκ³ λ, DBμ κ°μ λ£μ§ μμλ λΉ λ₯Έ μκ°μμ ν μ€νΈλ₯Ό μ§νν μ μλ€λ κ²μ λλΌκ² λμμ΅λλ€. ν μ€νΈ μ½λλ₯Ό μ€ν μν€κΈ°λ§ νλ©΄ μμms μμ ν μ€νΈλ₯Ό μ§νν μ μκ² λ©λλ€.
λν ν μ€νΈ μ½λ μμ²΄κ° λ¬Έμλ‘μμ μν λ κ°λ₯νκΈ° λλ¬Έμ νμ μ μμ°μ±μ λν μ μμμ΅λλ€.
π¨π» μΉ κ³μΈ΅ λ§λ€ ν μ€νΈ μ½λλ₯Ό μ΄λ»κ² μμ±νλμ?
Controller Layer
@WebMvcTest λ¨μν μ€νΈλ₯Ό μμ±νμμ΅λλ€.
μ€νλ§ μ ν리μΌμ΄μ μ μ€ννλ κ²μ΄ μλ κ°μ§ κ°μ²΄μΈ MockMvcλ₯Ό λ§λ€μ΄μ MVC λμμ ν μ€νΈ νμμ΅λλ€.
λ€μκ³Ό κ°μ΄ MockMvcλ₯Ό μ΄μ©ν΄ λΈλΌμ°μ μμ λ°μνλ μμ²μ κ°μμΌλ‘ λ§λ€κ³ 컨νΈλ‘€λ¬κ° μλ΅νλ λ΄μ©μ κΈ°λ°μΌλ‘ κ²μ¦μ μννμμ΅λλ€.
@Autowired
MockMvc mvc;
@MockBean
MessageSenderService messageSenderService;
@Test
public void μͺ½μ§_μ μ‘_μ±κ³΅() throws Exception {
DefaultRes result = new DefaultRes(HttpStatus.OK.value(), "μ μ‘μ±κ³΅");
given(messageSenderService.messageSender(any())).willReturn(result);
mvc.perform(post("/api/users/messages")
.contentType(MediaType.APPLICATION_JSON)
.content("{\n" +
" \"content\": \"μλ
νμΈμ\",\n" +
" \"receiver_id\": 1,\n" +
" \"sender_id\": 2\n" +
"}"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.message", equalTo(result.getMessage())));
}
Service Layer
Service Layerκ° μ μλνλμ§ νμΈνκΈ° μν΄ Service Layerλ§ λ 립μ μΌλ‘ ν μ€νΈλ₯Ό μ§ννμμ΅λλ€.
μ¦, μ€μ λΉμ§λμ€ λ‘μ§μ΄ μ μμ± λμλμ§ νμΈνλ ν μ€νΈ μ½λλ₯Ό μμ±νμμ΅λλ€.
λ€μκ³Ό κ°μ΄ given, when, then μΌλ‘ λλ μμ±νμμ΅λλ€.
νμν λ°μ΄ν°λ₯Ό 미리 κΈ°μ νκ³ , λΉμ§λμ€ λ‘μ§μ΄ μ¬λ°λ₯΄κ² μ²λ¦¬λλ μ§ ν μ€νΈνλ μ½λλ₯Ό μμ±νμμ΅λλ€.
@Test
public void μͺ½μ§_μ μ‘_μ±κ³΅(){
//given
User user1 =newUser();
User user2 =newUser();
given(userRepository.findById(1L)).willReturn(Optional.of(user1));
given(userRepository.findById(2L)).willReturn(Optional.of(user2));
//when
DefaultRes defaultRes = messageSenderService.messageSender(new MessageSenderRequestDto(1L, 2L, "μλ
νμΈμ"));
//then
assertThat(defaultRes.getMessage()).isEqualTo("μ μ‘μ±κ³΅");
assertThat(defaultRes.getStatusCode()).isEqualTo(200);
}
@Test
public void μͺ½μ§_μ μ‘_μ€ν¨_λ°μ μμμ(){
//given
User user1 =newUser();
User user2 =newUser();
given(userRepository.findById(1L)).willReturn(Optional.of(user1));
given(userRepository.findById(2L)).willReturn(Optional.of(user2));
//when
DefaultRes defaultRes = messageSenderService.messageSender(new MessageSenderRequestDto(3L, 2L, "μλ
νμΈμ"));
//then
assertThat(defaultRes.getMessage()).isEqualTo("λ°μ μμ 보μμ");
assertThat(defaultRes.getStatusCode()).isEqualTo(422);
}
Repository Layer
@DataJpaTest μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ JPA κ΄λ ¨ ν μ€νΈ μ€μ λ§ λ‘λνμ¬ ν μ€νΈ μ½λλ₯Ό μμ±νμμ΅λλ€.
λ°μ΄ν°μμ€μ μ€μ μ΄ μ μμ μΈμ§, JPAλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μ λλ‘ μμ±, μμ , μμ νλμ§ λ±μ ν μ€νΈλ₯Ό μ§ννμμ΅λλ€.
ν μ€νΈ μ½λ μ€ν ν μλ rollBackμ΄ λκΈ° λλ¬Έμ DBμ side effectκ° λ°μνμ§ μμ΅λλ€.
λν, Querydsl μ½λλ₯Ό ꡬννκ³ μ¬λ°λ₯Έ μΏΌλ¦¬κ° μ€ν λλμ§μ λν ν μ€νΈ μ½λλ₯Ό μμ±νμμ΅λλ€.
@Test
void νμ_μ μ₯(){
//given
User user = User.builder()
.email("test@test.com")
.password("1234")
.name("test")
.nickName("ν
μ€ν°")
.phoneNumber("010-1234-5678")
.grade(UserGrade.USER)
.build();
//when
User saveUser = userRepository.save(user);
//then
assertThat(user).isEqualTo(saveUser);
}
μ£Όλνλμ κΈμ΄ λ§μμ λμ ¨λμ? ꡬλ κ³Ό 곡κ°! κ·Έλ¦¬κ³ , λκΈμ μ£Όλνλμκ² λ§μ νμ΄ λ©λλ€
'Back-End μμ μ€ > Spring Framework' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Spring] μ€νλ§ ν΅μ¬ μ리 (0) | 2021.09.10 |
---|---|
[λμ κΈ°μ !] JPAμ Querydsl (0) | 2021.08.25 |
[λμ κΈ°μ !] Web Layer (0) | 2021.08.23 |
[Spring Boot] AOP (0) | 2021.08.20 |
[Spring Boot] Spring Data JPA (0) | 2021.08.19 |