Skip to content

백엔드 코드 컨벤션

스플릿 edited this page Aug 14, 2023 · 15 revisions

Code Style

  • 구글 자바 컨벤션

  • tab character 를 사용하지 않고, indent size는 공백 4로 한다.

  • 불변해야될 변수에는 final 키워드를 붙힌다. ( 메서드 파라미터 포함 )

    • 설정 방법 ( cmd + option + v )
image

개발 컨벤션

기본

  • 예외나 Fixture는 static import 하지 않는다.
  • return 하기 전 개행을 한다.
  • 상수 아래에 개행을 한다.
  • 정적 팩토리 메서드의 이름은 List 하나만 받으면 of 를 사용한다.

Entity

  • 기본 Getter의 경우 Lombok @Getter 어노테이션을 사용한다.
  • 기본 생성자의 경우 Lombok @NoArgsConstructor(access = AccessLevel.PROTECTED) 를 사용한다.
  • Foreign Key는 사용하지 않는다. 양방향 매핑인 경우, 한 쪽의 getter만 열어둔다.
@JoinColumn (name = "", foreignKey = @ForeignKey(name = "none"))
@Getter(AccessLevel.NONE)
  • @PrePersist 메서드는 가독성을 위해 적용되는 필드아래에 위치시킨다.
  • 생성자의 매개변수가 한 줄이 넘어가는 경우, 각 매개변수에 개행을 적용한다.
public KillingPart (
    final Long id,
    final String name,
    ...
) {
    // ...
}
  • ID를 포함하는 생성자는 없어야 한다.
  • 다대일 관계에서는 @ManyToOne(fetch = FetchType.LAZY)를 사용한다.

Service

  • 클래스 최상단에 @Transactional(readOnly = true) 를 붙이고, 트랜잭션이 필요한 메서드에 @Transactional을 붙인다.
  • 의존성 주입이 되는 필드로만 이루어져 있는 객체에 한해서 @RequiredArgsConstructor 를 사용한다.

DTO

  • DTO suffix는 생략한다.
  • Request DTO에서 @Getter, @AllArgsConstructor, @NoArgsConstructor(access = AccessLevel.PRIVATE) 를 사용한다.
  • Request DTO에서 도메인 객체를 리턴하는 getter를 사용할 수 있다.
  • Response DTO 에서 RestAssured를 위해, 필드가 하나인 클래스에만 @NoArgsConstructor(access = AccessLevel.PRIVATE) 를 사용한다. 그 외 Response DTO 에는 @NoArgsConstructor 를 붙이지 않는다.

Repository

  • 클래스 상단에 @Repository 어노테이션을 붙인다.
  • createdAt은 밀리초를 제거한 뒤 저장한다.

테스트

  • 테스트 메서드, 변수 이름은 영문으로 작성한다.
  • 테스트마다 @DisplayName을 사용하고, 행동과 결과를 모두 명시한다.
    • Ex. 예외가 발생하는 경우, "~일 때 예외가 발생한다." 와 같이 명시한다.
  • given, when, then 주석을 붙인다. 각 given, when, then에 코드가 존재하지 않는 경우, 위 주석에 붙여서 작성한다.
// given
// when
...
// then
...
  • 한 테스트 클래스 안에 전체 테스트 메서드가 5개 이상일 때, 같은 종류의 테스트 메서드는 @Nested로 묶어 표시한다.
  • date 관련 테스트를 할 때는 밀리초를 제거하여 테스트한다.
LocalDateTime.now().truncateTo(ChronoUnit.MILLIS);
  • 인수 테스트

  • 단위 테스트

    • Layer
      • Domain
      • Repository
      • JPA를 사용하는 Repository 기본 제공 CRUD에 대한 테스트는 제외한다.
      • @DataJpaTest를 사용하여 진행한다.
    • Service
      • Mock 테스트를 우선적으로 택한다.
      • SpringBoot 테스트가 필요하다 생각하는 경우 공유하고 사용한다.
    • etc : Interceptor, ArgumentResolver 의 테스트
    • 단순히 의존 객체의 메서드를 호출만 하는 경우는 테스트를 생략한다.
      • 코드 리뷰과정에서 적절한지 판단 가능할 것으로 예상
Clone this wiki locally