[회고] 코드숨 스프링 12기 3주차

개발자 춘식이·2022년 11월 27일
0

CodeSoom

목록 보기
3/8
post-thumbnail

3주 차 회고록

이번 주는 테스트 코드 작성에 초점이 맞춰져 있다. 테스트 코드 같은 경우 인프런 김영한님의 스프링 강의를 보면서 Given-When-Then을 작성해보았고(따라 써보았고), 회사에서는 테스트 코드를 작성하는 문화가 없지만, 테스트 코드를 작성해보고 싶어서 개인적으로 회사 프로젝트에 테스트 코드도 작성해보았다. 혼자서 맡은 프로젝트라 가능하지만, 맞게 작성하고 있는지는 몰랐는데 이번 기회에 테스트 코드를 작성해볼 수 있어서 좋았다.


3주 차 Keyword

  • Lombok : 처음에는 Task Model 클래스에 Lombok 애노테이션을 덕지덕지 붙였었다. @Getter, @Setter, @NoArgsConstructor, @AllArgsConstructor, @Builder까지.. 하지만 Lombok이 꼭 좋은 것만은 아니었다. 따라서 @Getter@Setter만 남기고, @Slf4j을 통해서 로그를 확인하는 정도로만 사용하였다.. 여태까지 Lombok을 사용하면서 Lombok의 장단점을 주관적으로 느낀 점을 표로 만들어보았다.
장점 단점
애노테이션을 사용함으로써 코드가 간결해진다. 라이브러리 의존성이 강해진다.
로그를 확인할 수 있다. Lombok을 사용하기 위한 별도의 설정이 필요하다.
변수를 변경해도 롬복이 알아서 그에 맞춰 코드를 작성해준다. 예) Getter/Setter 컴파일 후의 코드가 달라서 개발자가 의도한 대로 실행이 안 될 수 있다.
굉장히 편하다. @NoArgsConstructor와 @AllArgsConstructor를 사용하게 되면 추후 치명적인 버그가 생길 가능성이 있다.
  • Fixture : Fixture은 '고정물, 정착물'이라는 뜻을 지닌 영어단어이다. 프로그래밍에서는 테스트에 사용되는 데이터의 모음을 뜻한다. 아래와 같이 충분히 검증되고 변하지 않는 fixture를 @BeforeEach 메소드에 미리 만들어놓고 이 데이터로 테스트를 작성할 수 있다.
        Task task = new Task();
        task.setTitle(TASK_TITLE);
        taskService.createTask(task);
  • MockMvc : Mock은 '가짜의/모의의'라는 뜻을 지닌 영어단어이다. MockMvc는 Spring MVC 애플리케이션을 테스트하기 위한 프레임워크이다. 아래와 같이 모의 request와 response 객체를 통해 Spring MVC를 테스트한다.
		mockMvc.perform(get("/tasks")).andExpect(status().isOk());
  • JaCoCo : JaCoCo는 Java로 된 코드의 커버리지를 측정하는 라이브러리이다. 과제 Git에서 Fork한 프로젝트와 컴퓨터 환경과 달라서인지 우아한형제들 기술 블로그를 보고 JaCoCo를 다시 설정하였다.

  • DCI 패턴(Describe-Context-It) : Given-When-Then 대신 Describe-Context-It 패턴을 처음 사용해보았다.
    DCI 패턴은 위와 같이 계층형 구조를 갖는 패턴이다. 계층으로 되어있기 때문에 어떤 테스트가 수행되었고, 어떤 결과를 낳는지 보기 쉽다는 장점이 있다. 다만 MockMvcTest 클래스에서도 @Nested를 사용해서 DCI 패턴으로 구현하고 싶었지만, 에러가 발생했다. 이에 관련해서 찾고 있었는데 마침 코드숨 11기이신 분께서 같은 에러에 관한 블로그 글을 작성해주시고 공유해주셨다! -> 스프링부트 버전을 올리면 된다.

  • Health check : 아래 API는 Health Check를 위한 API로, 서버 실행이 완료되어 응답받을 수 있는 상태인지 확인하는 용도이다.

        @RequestMapping("/")
        public String sayHello() {
            return "Hello, World!";
        }
  • RuntimeException : TaskNotFoundExceptionTitleNotFoundException 모두 RuntimeException을 상속받도록 구현했다. 이 예외들은 사용자의 입력값에 따라 발생할 가능성이 있는 예외이기 때문에, 컴파일 당시에는 알지 못하고 실행해야 알 수 있으므로 RuntimeException을 상속받도록 했다.

코드 리뷰 코멘트

📌 테스트는 무엇을 테스트하고 있고 무엇을 기대하고 있는지 작성해 주는 것이 좋다.

📌 테스트가 꼼꼼하게 작성되어 있다면 하나하나의 기능에 대해서는 좋지만, 전체적으로 어떻게 사용하는지는 판단하기 어려울 수 있다.

📌 Controller에서는 사용자가 실제로 API를 호출하는 것처럼 테스트하는 게 목적이다. Service의 메소드는 Serivce Test에서 구현하면 된다.

📌 메소드 안에 상황을 줄 수도 있지만 @BeforeEach로 주어진 상황이 어떻게 달라지는지 표현할 수 있다.

📌 DCI 패턴에서 Context는 주어진 상황(given)이 달라질 때를 명시할 수 있으므로, 이 Context가 있으면 다른 상황이 있다는 가정을 할 수 있다. 따라서 다른 상황이 없다면 생략해도 된다.


마무리

TDD를 많이 들어보았지만 제대로 써본 적은 없었는데 이제 어디 가서 그래도 TDD를 작성해보았다고 말할 수 있을 것 같다. 나중에 프로젝트에도 큰 도움이 될 것 같다. TDD, BDD, DDD.. 배움의 길은 끝이 없다는데, 막막하면서도 끊임없이 지적 재산을 채우고자 하는 갈증을 채울 수 있어서 기쁘다.✍🏻
매주 평일에 하루 정도는 퇴근하고 나서 아무것도 안 하게 되는데 다음 주부터 <구글 엔지니어는 이렇게 일한다> 책 스터디를 하게 되어서 그날에는 스터디 준비를 하면 될 것 같다! 체력을 길러야 할 탠데..🤦🏻‍♀️

profile
춘식이를 너무 좋아하는 주니어 백엔드 개발자입니다.

0개의 댓글