본문 바로가기

회고록 모음/코드숨-스프링 과정 회고록

[회고록] 코드숨 Spring - 4주차 코드리뷰 (클린 아키텍처, Spring Data JPA, Repository)

[ 4주차 회고록 📚]

 

유독 힘들었던 4주차

 


📌 커리큘럼 


📌 코드리뷰 with 깃허브

github.com/CodeSoom/spring-week4-assignment-1/pull/10

 

[Spring 4주차 과제] 고양이 장난감가게 만들기 by developerOlive · Pull Request #10 · CodeSoom/spring-week4-assig

📍 과제 목록 고양이 장난감 목록 얻기 - GET /products 고양이 장난감 상세 조회하기 - GET /products/{id} 고양이 장난감 등록하기 - POST /products 고양이 장난감 수정하기 - PATCH /products/{id} 고양이 장난감

github.com


1. 한 것 

- 코드숨 스프링 4회 강의 3개 듣기 

 

- 고양이 장난감을 등록/조회/수정/삭제하는 기능이 있는 웹에서 사용할 REST API 작성

 

- API 테스트 통과를 위한 테스트 코드 작성

 

- 테스트 커버리지 100%를 달성을 위한 테스트 코드 작성

 

- 코드 리뷰 확인 후 리팩토링

 

- 코드에 사용된 어노테이션 자료 찾아보기

 

- JPA에 관한 자료 찾아보기

 

- Lombok에 관한 자료 찾아보기

 

 

 

컨트롤러 테스트 코드 결과
리파지토리 테스트 코드 결과


2. 배운 것 

 

📍서비스도메인 로직에 대한 책임을 갖고, 

  리포지토리추상화된 DB 역할을 한다. 

 각각의 책임이 다르며, 서비스는 리포지토리 interface 구현체를 알고 있을 필요가 없다. 

 

 


 

  • @Autowired를 사용하면 객체 생성 시점에 Spring container에서 해당 Bean을 찾아서 주입한다.

📍Spring bean이란?

  • 스프링 컨테이너에 의해 생성되는 자바의 객체

📍Spring container란? 

  • 자바 객체(Bean)를 담고 있음
  • Bean들의 생명주기를 관리
  • Spring Container는 애플리케이션을 구성하는 Bean들을 관리하기 위해 IoC를 사용

📍IoC란? 

  • 직역하면 제어의 역전 -> 제어권이 역전되었다는 의미
  • @Autowired를 사용해 주입받은 객체는 개발자가 직접 관리하지 않음
  • 제어권이 Spring container로 넘어가 객체에 대한 제어권이 바뀐 것

 


 

 

 

테스트 파일에는 @SpringBootTest 어노테이션이 붙어있다.

이 어노테이션은 @SpringBootApplication 어노테이션이 붙어있는 스프링 메인 애플리케이션을 찾아간다.

 

이후 메인부터 시작하는 모든 Bean을 찾는다.

다음으로는 테스트용 애플리케이션 context를 만들면서 Bean을 등록해준다.

이 중에 MockBean에 해당되는 Bean을 찾아서 교체를 해준다.

교체된 MockBean은 테스트마다 리셋이 된다.

 

 


 

 

 

📍Mock 타입 테스트란? 

출처 : https://ksshlee.github.io/mock/testcode/mock/

 

  • Mock은 모조품이라는 뜻을 갖고 있다. 가짜 객체를 만드는데 이때 Mock을 사용한다.
  • Mock타입은 서블릿 컨테이너(톰캣 등)를 테스트용으로 띄우지 않고, Mockup을 해서 서블릿을 Mocking 한 것을 띄워준다. 
  • 이때mockup 된 서블릿과 상호작용을 하려면 MockMVC라는 클라이언트를 사용해야 한다.
  • MockMVC를 사용하려면 @AutoConfigureMockMvc 어노테이션을 붙여주고, 주입 사용하면 된다.

 

코드 설명

  • mockMvc.perform(get("/products"))
    • get요청을 보내는 것
  • andExpect()
    • ~하길 기대하는 것

 


 

 

 

📍@MockBean이란? 

  • @MockBean은 Mock과 달리 org.springframework.boot.test.mock.mockito 패키지 하위에 존재함
  • spring-boot-test에서 제공하는 어노테이션이며, Mockito의 Mock객체들을 Spring의 ApplicationContext에 넣어줌
  • 만약 ApplicationContext내에 동일한 타입의 bean이 존재할 경우 MockBean으로 교체함
  • Test 도중 Spring에서 어느 의존성도 필요하지 않다면, Mockito의 @Mock을 사용하면 되지만
  • Spring Container가 관리하는 bean들 중 하나 이상을 Mocking 하고 싶다면 @MockBean을 사용함

 


 

 

 

📍 @WebAppConfiguration이란? 

WAS 없이 MVC 패턴의 Controller를 단위 테스트하기 위해서는 @WebAppConfiguration을 사용해야 함 

이 어노테이션을 붙이면 Controller 및 web환경에 사용되는 빈들을 자동으로 생성하여 등록함 

 

* WAS : 서버 단에서 애플리케이션을 동작할 수 있도록 지원하는 것, 동적인 페이지를 표현하기 위한 서버 (ex. JSP, servlet)

 

 


 

 

 

commit -> push 후 깃허브에서 테스트를 돌릴 때 위와 같이 에러가 뜨는 이유는

아래와 같이 커버리지를 100% 만족하지 못했기 때문이다.

 


📍JavaDoc 빌드 방법

 

내가 작성한 JavaDoc을 빌드한 모습

 

내가 작성한 JavaDoc을 빌드한 모습

 

왜 javaDoc을 작성하는 것이 중요할까? 라는 생각을 해봤다.

개발자가 많은 회사라면 다뤄야 할 코드들이 굉장히 많을 것이다.

 

만약 다른 사람의 코드를 보고 내가 유지/보수 해야 할 일이 생길 때,

많은 양의 코드를 하나하나 다 읽어가면서 해석한다면 시간이 너무 많이 걸릴 것 같다.

 

그 때 코드 작성자가 이 javaDoc을 잘 정리해 놓았다면 코드를 파악하는데 시간이 엄청나게 줄어들 것 같다.

그래서 javaDoc은 미래의 나를 위한 일이기도 하지만, 다른 개발자를 위해 꼭 필요한 것이 아닐까 라고 생각해본다.

 


📍ORM이란?

  • Object-relational mapping (객체 관계 맵핑)
  • 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계하여 ORM이 중간에서 맵핑하는 역할을 함

 


📍JPA이란?

  • Java persistence API
  • 현재 자바 진영의 ORM 기술 표준으로, 인터페이스 모음
  • 즉, 실제로 동작하는 것이 아님
  • JAP 인터페이스를 구현한 대표적인 오픈소스가 Hibernate라고 할 수 있음

 

출처 : https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html

 

  • @Entity -> 이 어노테이션을 클래스에 선언하면 그 클래스는 JPA가 관리함


 


3. 느낀 것

 

이번 주는 심적으로 힘들었다.

초반에는 '기간 내에 과제로 주어진 테스트를 다 통과할 수 있을까?' 하는 생각이 들었다.

과제를 하기 위해서, 코드 이해를 하기 위해서 많은 시간을 써야 했고

받은 피드백을 해결하기 위해 고민하는 시간도 짧지는 않았다.

 

테스트를 구현하기에 바빠서 코드에 사용된 어노테이션을 다 이해하지 못한 채로 쓰는 경우가 있었는데

마지막에 테스트를 통과하고 나서는 다시 하나씩 내용을 정리하는 시간을 가졌다.

"이 어노테이션을 왜 붙였는지, 역할이 무엇인지"까지 말로 답할 수 있으려면 복습을 많이 해야 할 것 같다.

 

과제를 하면서 테스트 코드를 작성하다 보니 이 전보다는 조-금 더 익숙해진 느낌을 받았다.

3주 차 때는 테스트 코드가 처음이라 구현 자체에 바빴다면,

이번 4주 차 때는 제대로 작성하고 있는 게 맞나? 다른 사람이 읽기에도 이해하기 쉽게 displayName을 붙이고 있나?라는 관점에서도 생각해 보게 되었다.

 

그리고 코드 리뷰를 해주시는 두 분의 트레이너님이

주차마다 번갈아가며 피드백을 주시는데 

두 분의 리뷰 특징이나 관점이 조금씩 달라서 오히려 더 도움이 되는 것 같다.

 

 


4. 자기 선언