[ 4주차 회고록 📚]
📌 커리큘럼
📌 코드리뷰 with 깃허브
github.com/CodeSoom/spring-week4-assignment-1/pull/10
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 타입 테스트란?
- 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은 미래의 나를 위한 일이기도 하지만, 다른 개발자를 위해 꼭 필요한 것이 아닐까 라고 생각해본다.
📍ORM이란?
- Object-relational mapping (객체 관계 맵핑)
- 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계하여 ORM이 중간에서 맵핑하는 역할을 함
📍JPA이란?
- Java persistence API
- 현재 자바 진영의 ORM 기술 표준으로, 인터페이스 모음
- 즉, 실제로 동작하는 것이 아님
- JAP 인터페이스를 구현한 대표적인 오픈소스가 Hibernate라고 할 수 있음
- @Entity -> 이 어노테이션을 클래스에 선언하면 그 클래스는 JPA가 관리함
3. 느낀 것
이번 주는 심적으로 힘들었다.
초반에는 '기간 내에 과제로 주어진 테스트를 다 통과할 수 있을까?' 하는 생각이 들었다.
과제를 하기 위해서, 코드 이해를 하기 위해서 많은 시간을 써야 했고
받은 피드백을 해결하기 위해 고민하는 시간도 짧지는 않았다.
테스트를 구현하기에 바빠서 코드에 사용된 어노테이션을 다 이해하지 못한 채로 쓰는 경우가 있었는데
마지막에 테스트를 통과하고 나서는 다시 하나씩 내용을 정리하는 시간을 가졌다.
"이 어노테이션을 왜 붙였는지, 역할이 무엇인지"까지 말로 답할 수 있으려면 복습을 많이 해야 할 것 같다.
과제를 하면서 테스트 코드를 작성하다 보니 이 전보다는 조-금 더 익숙해진 느낌을 받았다.
3주 차 때는 테스트 코드가 처음이라 구현 자체에 바빴다면,
이번 4주 차 때는 제대로 작성하고 있는 게 맞나? 다른 사람이 읽기에도 이해하기 쉽게 displayName을 붙이고 있나?라는 관점에서도 생각해 보게 되었다.
그리고 코드 리뷰를 해주시는 두 분의 트레이너님이
주차마다 번갈아가며 피드백을 주시는데
두 분의 리뷰 특징이나 관점이 조금씩 달라서 오히려 더 도움이 되는 것 같다.
4. 자기 선언
'회고록 모음 > 코드숨-스프링 과정 회고록' 카테고리의 다른 글
[회고록] 코드숨 Spring - 6주차 코드리뷰 (JWT) (0) | 2021.03.06 |
---|---|
[회고록] 코드숨 Spring - 5주차 코드리뷰 (Validation, DTO, Dozer Mapper) (3) | 2021.02.27 |
[회고록] 코드숨 Spring - 3주차 코드리뷰 (JUnit5, AssertJ, MockMvc, Mockito) (1) | 2021.02.02 |
[회고록] 코드숨 Spring - 2주차 코드리뷰 (Spring Web MVC, ControllerAdvice, Marko.js) (0) | 2021.01.25 |
[회고록] 코드숨 Spring - 1주차 코드리뷰 (REST API, Jackson) (0) | 2021.01.18 |