본문 바로가기
📝 회고/🤝 코드스쿼드 백엔드 프로젝트

[프로젝트 회고] 스프링 카페 (Spring, 테스트 코드, 프로젝트 시간 관리)

by kukim 2022. 5. 1.
  스프링 카페 (전체 소스코드)
배운 것 Spring, Unit Test, H2 DB, JDBC Template, Heroku 배포
기간 22.02.28 ~ 22.03.18 (15일) 
팀원 @쿠킴
Step 1 회원 가입 및 목록 기능 / 1단계 PR
Step 2 글 쓰기 기능 구현 / 2단계 PR
Step 3 DB에 저장하기 / 3단계 PR
Step 4 로그인 구현 / 4단계 PR
Reviewer @wheejuni, @Dion, @Roach

 


스프링 카페 프로젝트는 간단하게 게시글을 작성할 수 있는 웹 애플리케이션이다. 

이 프로젝트로 스프링을 처음 시작했다. 당연하게도 프레임워크가 익숙하지 않고 코드에 퀄리티가 높지 않았다. 프레임워크가 제시한 강제성에 맞게 계층을 나눠 개발하니 너무나 색다른 경험이었다. 프레임워크 뒤에 숨겨진 스프링의 구조가 궁금해졌다.

 

- 스프링 프레임워크를 첫 사용해보았다.

- 프로젝트 관련 문서를 8개의 작성했다. (하단 reference 참고)

- 단위 테스트를 적용하여 총 34개의 테스트를 작성했고 Line 기준 77% 코드 커버리지를 달성했다.(하단 사진 참고)

- 단위 테스트를 보다 빠르게 작성하기 위해 라이브 템플릿을 적용했다.(문서)

- 무료 호스팅 사이트에 배포했다.


프로젝트하며 배운 

문서화

총 8개 (4개의 회고글 작성과 4개의 기술 글)을 작성했다. 그중 하나를 소개한다.

Spring에서 테스트 목적으로 사용되는 H2 DB의 공식 문서가 빈약했다. 별도로 H2를 설치하여. sh로 실행하는 것이 불편했다. H2 공식문서를 살펴보니 Spring 내에서 embedded, In-Memory Mode로 별도 설치 없이 의존성 주입을 통해 손쉽게 사용하는 방법을 발견했다. 공식 문서에 스토리를 붙여 문서를 작성했다. 글 공유 후 도움되었다는 연락을 받았다. 나와 동료의 시간을 단축시킬 수 있다는 것은 중요하다. 시간은 금이다.

 

View와 Domain 모델 구분

사용자에게 받고, 보내는 View 모델과 서비스 내에서 동작하는 Domain 모델을 구분하였다. Domain 모델 생성 위치는 Service 계층에서 생성하도록 하였다. (PR)

 

단위 테스트

- 단위 테스트 작명할 때 효율적인 방법

방법  : 테스트 명을 @DisplayName을 사용하면 띄어쓰기가 가능한 상태에서 한글로 표현하기 쉽다. 하지만 테스트 메서드 명을 별도로 생각해야 한다. 로치는 실무에서 @DisplayName을 사용하지 않고 테스트 명을 한글로 작성한다고 한다.

생각 : 개인적으론 DCI 패턴 + @DisplayName을 선호하지만 테스트 작성 시간이 오래 걸렸다. 이를 위해  라이브 템플릿을 적용하여 시간을 단축했다.

선택 : 함께하는 팀과 의논하자

 

- Controller, Service, Repository에 반복되는 테스트 코드, 리팩터링 내성

문제 : Article(글) 하나를 조회한다고 하자. MVC 패턴에 모두 적용한다면 각 계층에 동일한 테스트 코드가 반복된다. 또한 요구사항이 변경되어 메서드 시그니처가 바뀐다면 테스트를 모두 바꿔야 한다. 한 마디로 리팩터링 내성이 없다. 반복적인 테스트를 끊어내고 리팩터링 내성을 높이는 코드는 어떻게 작성해야 할까?

생각 : 컨트롤러, 서비스 계층 테스트는 통합 테스트로 한 번에 관리하고 비즈니스 로직과 리포지토리 테스트를 단위 테스트로 작성하면 어떨까 생각해본다. 테스트 중요하다. 빠르고 효율적인 테스트를 작성하도록 고민해야겠다.

 

단위 테스트 작성
코드 커버리지

프로젝트 시간 관리

프로젝트 전체 일정을 노션으로 추적했다. 주차별 무엇을 했는지 점검하기에 좋았다.

문제 :  주차별 스프린트, 데드라인 설정이 없었다. 루즈해지고 어디까지 구현해나갈 것인지 범위가 없었다.

해결 : 해야 할 업무를 정의하고, 테스크로 작게 나눠야 한다. 그래야 주차별 목표와 데드라인을 설정할 수 있다. 계획하고 실행하자.

프로젝트 시간 추적

etc

- boolean 타입 메서드는 isxxx()로 작명하여 명시적으로 표현해주자. e.g. equalId() -> isSameId() (PR)

- API url과 메서드 명의 일관성을 지키자

- PK 해당하는 자료형은 int로 사용한다면 약 21억 까지만 만들 수 있는 위험성을 인지하자.


⛓ Reference

 

2022.03.10 - [✅ 테스트 코드] - IntelliJ의 Code&Live Templates 활용하여 생산성 높이기! 테스트코드 작성 시간 줄이고 아직 구현하지 않은 메서드 예외로 확인하기

2022.03.16 - [☕️ JAVA/🍃 Spring] - Spring boot에서 H2 DB 3가지 모드 사용하기(embedded, In-Memory, Server)

2022.03.19 - [☕️ JAVA/🍃 Spring] - ./gradlew bootRun vs java -jar로 실행할 때의 차이점 (리소스 경로)

2022.03.19 - [✅ 테스트코드] - 단위 테스트란 무엇일까? 런던파와 고전파의 차이점 🆚

2022.03.07 - [📝 회고/🗓 일일, 주간 회고] - [주간 회고] 22.03. 1주차 - "스프링 시작" 🍃

2022.03.14 - [📝 회고/🗓 일일, 주간 회고] - [주간 회고] 22.03. 2주차 - "스프링"☔️🧇

2022.03.09 - [📝 회고/🗓 일일, 주간 회고] - [일일 회고] 22.03.07 ~ 03.09 - 웹 개발에서 TDD와 테스트 코드

2022.03.20 - [📝 회고/🗓 일일, 주간 회고] - [주간 회고] 22.03. 3주차 - "스프링과 뽀모도로"🧁

 

댓글