Skip to content

백엔드‐코딩 컨벤션

ashsty edited this page Jul 25, 2024 · 3 revisions

📦 DTO 관련

  • 컨트롤러로 전달 받는 DTO는 별도 변환 작업 없이 서비스 계층에 전달한다.
    • 서비스 로직 재사용 시 서비스용 DTO를 생성한다.
  • DTO 네이밍은 xxxRequest, xxxResponse 로 통일한다.
    • 내부 흐름 상 위에 포함되지 않는 DTO는 필요 시 논의한다.
  • DTO 컬렉션 반환이 필요한 경우 wrappingDTO 를 만들어 반환한다.
  • requestresponse에 대한 validation은 DTO에서 수행한다.
  • DTO는 record 클래스를 이용한다.
  • 표준 응답 DTO는 사용하지 않는다.
    • 기본적으로는 ResponseBody를 사용하고, 필요 시 재논의한다.

🎁 객체 관련

  • 검증을 포함한 최소한의 로직은 일급 객체일급 컬렉션을 사용한다.
  • 세터는 사용하지 않는다.
  • 객체 추상화는 필요성이 느껴질 때 시행한다.

🖥️ JPA 관련

  • 엔티티는 연관 관계를 가지는 객체, 혹은 id로 저장한다. 연관 관계를 가지는 객체는 사용하지 않는다.
    • 엔티티는 id가 동일하면 동등한 경우로 판단한다.
  • 외래키(foreign key)의 사용은 지양한다.
    • 데이터 생성 순서 제약, 잘못된 설정 시 부모 테이블의 데이터도 날아갈 수 있음 등의 디메리트를 고려하였다.
    • 민감한 연관 관계(e.g. 결제 로직)가 성립된 경우 사용 차후 논의한다.

🕹 테스트 관련

  • 외부 API 테스트를 제외하면 mock 사용은 지양한다.
  • 로직이 없는 컨트롤러의 경우도 기본적으로는 단위 테스트를 작성한다. 로직이 없는 컨트롤러는 단위 테스트를 작성하지 않는다.
    • 단, 필요시 작성하지 않는 경우도 컨벤션에 어긋나지 않는 것으로 한다.
  • RestAssured 를 통해 실제 요청 기반 인수 테스트를 작성한다.
  • 테스트 fixture를 통해 테스트 코드의 가독성을 높인다.
    • domain과 관련된 fixture method는 이름만 봐도 용도를 정확하게 짐작할 수 있도록 명명한다. (e.g. MEMBER_PORORO)
      • DTO의 fixture method는 모호한 이름을 허용한다. (e.g. CREATE_MEMBER)
    • 매개변수의 사용은 최대한 지양한다.
  • 테스트 메서드 이름은 테스트할 메서드명을 그대로 사용, test와 같은 문구는 추가로 붙이지 않는다.
    • 성공과 실패 테스트로 인한 메서드 중복 시
      • 성공은 메서드명 그대로
      • 실패는 xxxException_[숫자]로 네이밍한다.
  • 테스트 설명은 @DisplayName 에 국문으로 명시한다.
  • 테스트 어노테이션 순서는 아래와 같다.
  @Test
  @DisplayName("사용자가 지원서를 신청했으면 어드민이 지원서를_승인한다.")
  @ParameterizedTest
  @ValueSource(strings = {"11"})
  @DisplayName("사용자가 지원서를 신청했으면 어드민이 지원서를_승인한다.")

💥 에러 & 응답 코드 관련

  • 에러는 커스텀 에러(CoreaException)로 처리한다.
  • 응답 코드는 아래와 같이 사용한다.
    • 성공 코드: 200(OK), 201(CREATE), 204(DELETE)
    • 실패 코드: 400(BAD REQUEST), 이외 자율
      • 필요한 경우 코드 리뷰에서 각각의 분기에 대해 이야기할 수 있다.

✔ 커밋 관련

  • TDD 사이클은 '테스트 작성' - '코드 작성' - '테스트 통과'를 한 사이클로 한다.
    • 한 사이클이 끝나면 커밋한다.
  • 커밋 단위는 하나의 기능으로 한다.
    • Entity, Domain, Repository, Service, Controller까지 하나의 커밋에 포함된다.

📝 코드 스타일 관련

명시하지 않은 부분은 우테코 스타일을 따라간다!

  • @Transactional(readOnly = True)은 클래스 레벨에 명시한다.
  • @RequestMapping을 활용할 수 있는 경우 적극적으로 활용한다.
  • Controller, Service 단에서는 @AllArgsConstructor가 아닌 @RequiredArgsConstructor를 사용한다.
  • final 예약어는 사용하지 않는다. final 예약어는 메서드의 파라미터와 내부 변수 선언에 사용한다.
  • 개행 관련 스타일은 다음과 같다.
    • 어노테이션이 붙어 있는 변수의 경우 다음 줄을 개행하고, 없는 경우 개행하지 않는다.
    • 클래스 선언 이후 다음 줄을 개행하고, 메서드 선언 이후 개행하지 않는다.
  • 패키지 구분은 다음과 같다.
    • 도메인 별, exception, global config로 상위 패키지를 구분한다.
    • controller, service, repository, entity, domain 등으로 하위 패키지를 구분한다.
  • 클래스 내 메서드 순서는 다음과 같다.
    • 동등한 메서드 사이에서 CRUD 순서로 정렬한다.
class 클래스 {
	static 메소드

	abstract 메소드

	public 로직 메소드

	public 로직 메소드에서 사용하는 private 메소드

	public 로직 메소드

	getter 

	equals & hashCode
}
Clone this wiki locally