HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
[New] 아만드팀
[New] 아만드팀
/
⚖️
최종 프로젝트 - 준비
/일일 회의 기록 /
22.07.19(화)

22.07.19(화)

태그
백엔드
회의 날짜
Jul 19, 2022

공지

  • 20(수) 까지 각자 기획서 간단하게 작성해서 노션 페이지에 등록
    • 💡
      기획서 모음집
  • 6시 ~ 7시30분 세션
 

스크럼

  • 용수
    • Flyway 삽질 중
    • 클린 아키텍처 읽고 정리
  • 민환
    • swagger 해보는 중
    • 클린 아키텍처 읽고 정리
    • 노션 정리
  • 재욱
    • CI/CD 파이프라인 알아보고 실습하고 정리.
    • 클린아키텍처 읽고 정리
  • 우진
 

회의 안건

  • 엔드포인트 규칙(api 버저닝, /api/.. 붙여 줄지?)
  • 테스트 커버리지(jacoco), 테스트 전략(단위, 통합)
  • 공유오피스
    • http://www.lsbz.kr/#close
  • 깃 브랜치 규칙
  • 메소드 명 규칙
  • 팀 문화 , 목표
  • 레디스 쓰고 싶어욤
  • 노션 정리 합시다.
 
 

결정

  • Dto
    • 라이브러리 사용하지 않고 DTO 자체 구현하여 사용
    • web에서 받은 request, response를 그대로 사용
    • 변환 위치
      • DTO에서 반환하도록
        • from, toEntity
    • 후에 리팩토링 하는 식으로
    • 변경에 유연한 설계, 우리는 2가지 종류의 DTO를 쓴다!
      안녕하세요 깃-들다의 손너잘 입니다. 이번 글에서는 깃들다의 설계중에 DTO와 관련된 이야기를 해보고자 합니다. 여러분은 DTO를 어떤식으로 많이 사용하시나요? 아마 많은 프로젝트에서 View ↔ Controller ↔ Service, 혹은 DAO ↔ Service 와 데이터를 주고받을 때 사용하실겁니다. 저희도 역시 마찬가지로 View ↔ Controller ↔ Service 간의 데이터 이동시 DTO를 이용하는데요, 깃들다의 경우 View ↔ Controller, Controller ↔ Service 에서 각각 서로 다른 DTO를 사용합니다.
      변경에 유연한 설계, 우리는 2가지 종류의 DTO를 쓴다!
      http://tech.pick-git.com/%EB%B3%80%EA%B2%BD%EC%97%90-%EC%9C%A0%EC%97%B0%ED%95%9C-%EC%84%A4%EA%B3%84,-%EC%9A%B0%EB%A6%AC%EB%8A%94-2%EA%B0%80%EC%A7%80-%EC%A2%85%EB%A5%98%EC%9D%98-DTO%EB%A5%BC-%EC%93%B4%EB%8B%A4/
      변경에 유연한 설계, 우리는 2가지 종류의 DTO를 쓴다!
 
  • 폴더 구조 → 아키텍처 스타일로
    • Presentation - Application - Domain - Infrastructure
      • domain폴더에 → memberRepository extends JpaRepository
      2021-pick-git/backend/pick-git/src/main/java/com/woowacourse/pickgit/post at develop · woowacourse-teams/2021-pick-git
      💻 Github Repo 기반 개발 장려 SNS. Contribute to woowacourse-teams/2021-pick-git development by creating an account on GitHub.
      2021-pick-git/backend/pick-git/src/main/java/com/woowacourse/pickgit/post at develop · woowacourse-teams/2021-pick-git
      https://github.com/woowacourse-teams/2021-pick-git/tree/develop/backend/pick-git/src/main/java/com/woowacourse/pickgit/post
      2021-pick-git/backend/pick-git/src/main/java/com/woowacourse/pickgit/post at develop · woowacourse-teams/2021-pick-git
    • 도메인에는 레포 인터페이스, 구현체는 인프라에 놓자
      • 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
spring-guide/exception-guide.md at master · cheese10yun/spring-guide
스프링은 예외처리를 위해 다양하고 막강한 어노테이션을 제공하고 있습니다. 일관성 있는 코드 스타일을 유지하면서 Exception을 처리하는 방법에 대해서 소개하겠습니다. Error Response 객체는 항상 동일한 Error Response를 가져야 합니다. 그렇지 않으면 클라이언트에서 예외 처리를 항상 동일한 로직으로 처리하기 어렵습니다. Error Response 객체를 유연하게 처리하기 위해서 간혹 Map 형식으로 처리하는데 이는 좋지 않다고 생각합니다.
spring-guide/exception-guide.md at master · cheese10yun/spring-guide
https://github.com/cheese10yun/spring-guide/blob/master/docs/exception-guide.md
spring-guide/exception-guide.md at master · cheese10yun/spring-guide
Team_i6_comepet_BE/ExceptionMessage.java at c23d43e46b59ae99fa5cb271f66c2f90391ac44b · prgrms-web-devcourse/Team_i6_comepet_BE
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters You can't perform that action at this time. You signed in with another tab or window.
Team_i6_comepet_BE/ExceptionMessage.java at c23d43e46b59ae99fa5cb271f66c2f90391ac44b · prgrms-web-devcourse/Team_i6_comepet_BE
https://github.com/prgrms-web-devcourse/Team_i6_comepet_BE/blob/c23d43e46b59ae99fa5cb271f66c2f90391ac44b/src/main/java/com/pet/common/exception/ExceptionMessage.java
Team_i6_comepet_BE/ExceptionMessage.java at c23d43e46b59ae99fa5cb271f66c2f90391ac44b · prgrms-web-devcourse/Team_i6_comepet_BE
 

로깅 전략

  • 커스텀 예외는 어떤 레벨로 찍을까 ?
    • error → Exception
    • warn → 커스텀 예외
  • SQL 로깅까지
  • 비동기 로깅 → logback , log4j
  • cloudwatch 로그 연동 및 슬랙에 error시 알람 올 수 있도록
AWS CloudWatch Logs Dashboard 구성
다음과 같은 기능들을 제공한다. 애플리케이션 모니터링 시스템 전반의 성능 변경 사항에 대응 리소스 사용률 최적화 운영 상태에 대한 통합된 보기를 확보하는데 필요한 데이터 제공 로그, 지표 및 이벤트 형태로 모니터링 및 운영 데이터를 수집 AWS 리소스, 어플리케이션 및 서비스에 대한 통합된 뷰 제공 좌측 대시보드에서 대시보드 생성하기를 선택한다.
AWS CloudWatch Logs Dashboard 구성
https://xlffm3.github.io/devops/cloudwatch/
AWS CloudWatch Logs Dashboard 구성
Log4j2 및 Logback의 Async Logging 성능 테스트 비교
이 글은 Pick-Git 기술 블로그 에 업로드한 글입니다. Java 및 Spring 진영에서 사용할 수 있는 Logging Framework는 Log4j와 Logback 및 Log4j2 등 다양합니다. Pick-Git을 개발하면서 팀원들과 어떤 Logging Framework를 선택해야할지 고믾이 많았습니다. Logging Framework 종류별 특징을 학습하는 것에서 그치지 않고, 직접 Logging Framework들의 비동기 로깅(Async Logging) 성능을 테스트해보고 결과를 비교했습니다.
Log4j2 및 Logback의 Async Logging 성능 테스트 비교
https://xlffm3.github.io/spring%20&%20spring%20boot/async-logger-performance/
Log4j2 및 Logback의 Async Logging 성능 테스트 비교
 

기술스택

  • 자바 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
    • 도입하면 좋다.
    • 초반에 구축해놓기?
    •