Skip to content

BE Code Convention

Junyong Moon edited this page Dec 21, 2023 · 3 revisions

일반

  • 클래스 선언부와 필드 사이에 공백 하나를 추가한다.
  • 어노테이션은 클래스 혹은 메서드와 가장 관련된 것을 선언부와 가깝게 위치한다.
  • 객체 필드와 메소드 파라미터에 final 무조건 붙인다.
  • 메서드가 한가지 일만 담당하도록 구현한다.
  • 패키지명은 단수로 한다.
  • DTO는 매개변수가 3개 이상일 경우 생성한다.
    • DTO 이름은 REST의 CRUD operation과 같게 한다. (Create, Read, Update, Delete)
    • ex) 게시글 등록에 관한 DTO -> PostCreateRequest / 게시글 수정에 관한 DTO -> PostUpdateRequest
  • getter/setter 없이 구현한다.
    • 핵심 로직을 구현하는 도메인 객체에 getter/setter를 쓰지 않고 구현한다.
    • 단, DTO는 허용한다.
  • 도메인 객체 - 생성자 선언 순서
    • 기본 생성자
    • 모든 파라미터를 받는 생성자
    • 이후 파라미터가 많은 생성자가 상단에 오도록 선언

JPA

  • 클래스 이름이 MySQL 예약어와 겹치면 매핑되는 테이블 이름은 복수형으로 지정한다.
    • ex) Entity Class 이름 = Member -> @Table(name = "members")
  • 엔티티의 no-args constructor 는 protected 로 지정하고, 최상단에 선언
  • @Column 어노테이션의 맨 마지막에 nullable 옵션 추가

디렉토리 구조

  • 도메인형(기능별 패키지 분리) - 기능별 안에 계층별로 구성한다.
    • ex) 회원(Member), 프로필(Profile), 게시글(Post)이라는 기능이 있다면
    • 회원(Member)이라는 패키지 안에 controller, service, repository, dto, exception 가 있다.

예외 처리

  • 엔티티 단위로 예외 클래스를 생성한다. (예외 존재)

테스트

공통

  • 테스트 메서드명은 한글로 작성한다.
    • 한글로 작성 시, 테스트 메소드의 @DisplayName 어노테이션을 생략한다.
  • (중요) given, when, then 주석을 명시적으로 붙인다.
    • 나누기 곤란한 경우에는 given, when & then과 같이 &으로 합쳐서 작성한다.
// given & when
// when & then
// given & when & then
  • 예외 케이스에 대한 테스트 메서드 명은 ~하면 예외가 발생한다. 같이 통일한다.
    • 메서드 명을 작성할 때, 띄어쓰는 경우 _으로 구분한다.
@Test
void 회원의_email_형식이_맞지_않으면_예외가_발생한다.(final String email) {
      // given
      String name = "Moon Junyong";
      String profileImageUrl = "https://avatars.githubusercontent.com/u/83820185?v=4";
      Role role = Role.USER;

      // when & then
      assertThatThrownBy(() -> new Member(email, name, profileImageUrl, role))
          .isInstanceOf(InvalidMemberException.class)
          .hasMessage("이메일 형식이 올바르지 않습니다.");
    }
}
  • 생성 로직에 대한 테스트 명은 ~ 생성한다.로 통일한다.
@Test
void 회원을_생성한다() {
    //given
    String email = "[email protected]";
    String name = "Moon Junyong";
    String profileImageUrl = "https://avatars.githubusercontent.com/u/83820185?v=4";
    Role role = Role.USER;


    // when & then
    assertDoesNotThrow(() -> new Member(email, name, profileImageUrl, role));
}

통합 테스트

  • 테스트의 given 데이터를 문장형 테스트로 작성한다.
  • 테스트를 위한 Dto 객체는 TestClass의 필드로 선언한다.

Clone this wiki locally