공지
20(수)
까지 각자 기획서 간단하게 작성해서 노션 페이지에 등록
6시 ~ 7시30분
세션
스크럼
- 용수
- Flyway 삽질 중
- 클린 아키텍처 읽고 정리
- 민환
- swagger 해보는 중
- 클린 아키텍처 읽고 정리
- 노션 정리
- 재욱
- CI/CD 파이프라인 알아보고 실습하고 정리.
- 클린아키텍처 읽고 정리
- 우진
회의 안건
- 엔드포인트 규칙(api 버저닝, /api/.. 붙여 줄지?)
- 테스트 커버리지(jacoco), 테스트 전략(단위, 통합)
- 깃 브랜치 규칙
- 메소드 명 규칙
- 팀 문화 , 목표
- 레디스 쓰고 싶어욤
- 노션 정리 합시다.
결정
- Dto
- 라이브러리 사용하지 않고 DTO 자체 구현하여 사용
- web에서 받은 request, response를 그대로 사용
- 변환 위치
- DTO에서 반환하도록
- from, toEntity
- 후에 리팩토링 하는 식으로
- 폴더 구조 → 아키텍처 스타일로
Presentation - Application - Domain - Infrastructure
- domain폴더에 → memberRepository extends JpaRepository
- 도메인에는 레포 인터페이스, 구현체는 인프라에 놓자
- repository의 경우 예외
- 예외 처리
- Enum errocode
- (A001 , HttpStatus.NotFound , “존재하지 않은 유저입니다” )
- 보내는 메시지의 경우 예외 안에 있는 메시지를 보내도록
public class BusinessException extends RuntimeException { private ErrorCode errorCode; public BusinessException(String message, ErrorCode errorCode) { super(message); this.errorCode = errorCode; } public BusinessException(ErrorCode errorCode) { super(errorCode.getMessage()); this.errorCode = errorCode; } public ErrorCode getErrorCode() { return errorCode; } } @JsonFormat(shape = JsonFormat.Shape.OBJECT) public enum ErrorCode { // Common INVALID_INPUT_VALUE(400, "C001", " Invalid Input Value"), METHOD_NOT_ALLOWED(405, "C002", " Invalid Input Value"), ENTITY_NOT_FOUND(400, "C003", " Entity Not Found"), INTERNAL_SERVER_ERROR(500, "C004", "Server Error"), INVALID_TYPE_VALUE(400, "C005", " Invalid Type Value"), HANDLE_ACCESS_DENIED(403, "C006", "Access is Denied"), // Member EMAIL_DUPLICATION(400, "M001", "Email is Duplication"), LOGIN_INPUT_INVALID(400, "M002", "Login input is invalid"), // Coupon COUPON_ALREADY_USE(400, "CO001", "Coupon was already used"), COUPON_EXPIRE(400, "CO002", "Coupon was already expired") ; private final String code; private final String message; private int status; ErrorCode(final int status, final String code, final String message) { this.status = status; this.message = message; this.code = code; } public String getMessage() { return this.message; } public String getCode() { return code; } public int getStatus() { return status; } }
- 최상위 예외 : BusinessException
- 도메인 예외 : UserException
- 상세 예외 : UserDuplicateException , UserInvalidException
로깅 전략
- 커스텀 예외는 어떤 레벨로 찍을까 ?
- error → Exception
- warn → 커스텀 예외
- SQL 로깅까지
- 비동기 로깅 → logback , log4j
cloudwatch 로그 연동
및 슬랙에 error시 알람 올 수 있도록
기술스택
자바 11
- 현업에서 많이 사용
- 17을 사용해봤지만 많이 활용하진 못하여서 버전 내려서 진행합니다.
- Rest docs vs Swagger
(세션끝나고 정하기)
- swagger 팀원 모두가 학습해야함
- 베포가 빠르게 진행된다?
- rest docs 테스트를 작성해야 해서 조금 느릴수도 있다.
- 테스트를 통해 문서 정확성이 높아진다.
- docs 만들꺼면 documentTest @WebMvcTest
- Rest docs → swagger 만들어주는 것 있긴 함
QueryDsl
Security 사용 X
- 인터셉터 , 아규먼트 리졸버, AOP
- 롬복
- flyway
(세션끝나고 정하기)
- spring boot 최신버전
- java 11
- gradle 최신버전
- junit5 , mockito
- mysql
- api 문서 ( 생각 )
- notion
- slack
- git
- 협업툴 ( 프론트랑 얘기 )
테스트 전략
테스트 전략 (최대한 하도록)
E2E(mockMvc) + 유닛(도메인, 서비스(모킹) , 레포(커스텀 쿼리))
E2E + 통합 + 유닛 + // DOCS(@WebMvcTest)
테스트 템플릿
- given when then 주석붙이기
필수적으로 붙이는 게 좋을 듯합니다
- Fixture 관리
- 서비스 단에서 Mockito로 구현할건지?
@SpringBootTest
- 멘토님께 여쭤보겠습니다.
- 테스트 커버리지 →
jacoco , sonarcloud , sonarqube, codedev
- 도입하면 좋다.
- 초반에 구축해놓기?