Skip to content

코딩 컨벤션

peeerr edited this page Nov 14, 2024 · 4 revisions

코딩 컨벤션

기본적으로 Wooteco Java Style Guide를 따릅니다.

아래는 저희 백엔드 팀만의 추가적인 스타일 가이드입니다.


1. 클래스 내 코드 작성 순서

  1. 상수

  2. 멤버 변수

  3. 생성자

  4. 정적 팩토리 메서드

  5. public 메서드

  6. protected 메서드

  7. private 메서드

  8. getter 및 setter 메서드

    • getter를 먼저 작성하며, 그 다음에 setter를 작성합니다.

    • 기본적으로 setter 사용을 금지하며, 의미가 명확한 별도의 메서드를 만들어 사용합니다.

  9. equals hashCode 메서드

    • equals를 먼저 작성하고 hashCode를 작성합니다.

2. 테스트 관련 규칙

2-1. @DisplayName 작성 규칙

자유롭게 작성하되, 완전한 문장으로 끝나야 합니다.

  • ❌**@DisplayName("제목이 누락되면 일기 작성에 실패해야 함")**❌
  • ⭕**@DisplayName("제목이 누락되면 일기 작성에 실패한다.")**⭕

2-2. 테스트 메서드 네이밍 규칙

  1. 테스트 메서드명에 테스트할 메서드명을 포함하지 않습니다.

    • 메서드명 변경 시 테스트 메서드명도 함께 변경해야 하는 번거로움을 줄이기 위함입니다.
  2. 테스트 메서드명은 **should_기대결과_When_조건**규칙을 따릅니다.

예시

  • should_CreateDiary_When_ValidInput()

  • should_FailToCreateDiary_When_MissingTitle()

  • should_ThrowException_When_InvalidDateFormat()

2-3. 테스트 내부 템플릿

given when then 패턴을 기반으로 테스트 코드를 작성합니다.

  • 주석으로 given, when, then을 구분지어 테스트 코드를 작성합니다.

테스트 작성 예시

@Test
@DisplayName("일기가 성공적으로 작성된다.")
void should_CreateDiary_When_ValidInput() {
		// given
		
		// when
		
		// then

}

@Test
@DisplayName("제목이 누락되면 일기 작성에 실패한다.")
void should_FailToCreateDiary_When_MissingTitle() {
		// given
		
		// when
		
		// then

}

@Test
@DisplayName("유효하지 않은 날짜 형식으로 작성하려고 하면 예외가 발생한다.")
void should_ThrowException_When_InvalidDateFormat() {
		// given
		
		// when
		
		// then

}

3. Lombok 관련 규칙

코드 가독성 및 개발 편의성을 위해 아래 메서드에 대해서는 Lombok 어노테이션을 사용합니다.

3-1. 필수 사용 어노테이션

  • 기본 생성자 → @NoArgsConstructor(access = AccessLevel.*PROTECTED*)

    • 접근 제어자는 protected이하로 제한합니다.
      • JPA Entity에서 private로 지정 시 JPA 프록시 객체 생성에 문제가 발생할 수 있으며,

        public으로 지정 시에는 객체가 무분별하게 생성될 가능성이 있습니다.

  • 모든 필드를 인자로 받는 생성자 → @AllArgsConstructor

  • final 키워드 변수만 인자로 받는 생성자 → @RequiredArgsConstructor

  • getter 메서드 → @Getter

  • 빌더 패턴 → @Builder

3-2. 사용 금지 어노테이션

  • @Setter
    • setter 메서드 대신 명확한 의도를 가진 메서드를 선언합니다.
  • @Data
    • 불필요한 메서드가 생성됩니다.
  • @EqualsAndHashCode
    • 불필요한 필드를 대상으로 만들어질 수 있기에 필요 시 직접 정의합니다.

4. 기타 규칙

4-1. 파라미터가 세 개 이상일 경우

@Transactional(readOnly = true)
public Page<DiaryResponse> getXXX(Long categoryId, PostSearchCondition condition, Pageable pageable) {
    return diaryRepository.findXXX(categoryId, condition, pageable);
}

위 메서드처럼 파라미터가 세 개 이상일 경우, 아래와 같이 포맷팅합니다.

@Transactional(readOnly = true)
public Page<DiaryResponse> getXXX(Long categoryId,
                                  PostSearchCondition condition,
                                  Pageable pageable) {
    return diaryRepository.findXXX(categoryId, condition, pageable);
}

컨벤션 관련 편리한 설정

1. 자주 쓰는 코드 템플릿화

image (1)

테스트 코드는 아래 템플릿을 사용하면 편리합니다.

@DisplayName("")
@Test
void $END$() throws Exception {
    // given
    
    // when
    
    // then
    
}

2. Save 시 불필요한 import 자동 제거 및 코드 리포맷

image (2)