Skip to content

백엔드 코드 컨벤션

백승주 edited this page Mar 29, 2023 · 1 revision

일반


  • 클래스 선언부와 필드 사이에 공백 하나 추가
  • 클래스 내부 마지막 줄 공백 스페이스 제거
  • Static 변수 -> Instance 변수 -> 생성자(Builder) -> Static 메서드 -> 일반 메서드 -> equals , hashCode 순서로 정렬
  • 코드 정렬(Ctrl + Alt + l) 기준으로 포메팅(CheckStyle + Naver HackDay Convention)
  • Add static import 금지(static 풀어서 쓰기)
  • DTO는 레코드 사용하기
public record SampleRecord(
   String name,
   Integer age,
   Address address
) {}
  • 객체 필드와 메소드 파라미터에 final 무조건 붙이기(불변 객체를 보장하기 위해서)
  • 패키지명은 단수로
  • DTO는 매개변수가 3개 이상일 경우 생성한다. -> (TBD : 케이스가 있을 경우 규칙을 다시 만드는건?)
  • 생성자 선언 순서 NoArgs -> Requrie -> All
  • private 메서드 아래로 넣는걸로
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@RequiredArgsConstructor
@AllArgsConstructor
  • Entity에서 equals(), hashcode()를 구현

JPA

  • 클래스 이름이 MySQL 예약어와 겹치면 매핑되는 테이블 이름은 복수형으로 지정한다.
  • 엔티티의 no-args constructor 는 protected 로 지정하고, 최상단에 선언
  • @Query 어노테이션에서 JPQL 작성시 SELECT, FROM, WHERE 단위로 즉, 절 혹은 구 단위로 개행한다.
  • @Column 어노테이션의 맨 마지막에 nullable 옵션 추가
@ToString(exclude = {})
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(
	name = "member",
	indexes = {})
@Entity
public class Member extends BaseEntity {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@Column(columnDefinition = "varchar(255)", unique = true, nullable = false)
	private String email;

	@Column(columnDefinition = "char(11)", unique = true)
	private String phoneNumber;

	@Column(columnDefinition = "varchar(100)", nullable = false)
	private String name;

	@Enumerated(value = EnumType.STRING)
	@Column(columnDefinition = "char(6)", nullable = false)
	private MemberRole role;

	@Enumerated(value = EnumType.STRING)
	@Column(columnDefinition = "varchar(8)", nullable = false)
	private MemberGrade grade;

	@Column(columnDefinition = "varchar(255)", unique = true, nullable = false)
	private String hiworksId;

	@Column(name = "profile_image_url", nullable = false)
	private String profileImageUrl;

	@Builder
	private Member(final Long id, final String email, final String phoneNumber, final String name,
		final MemberRole role, final MemberGrade grade, final String hiworksId, final String profileImageUrl) {
		this.id = id;
		this.email = email;
		this.phoneNumber = phoneNumber;
		this.name = name;
		this.role = role;
		this.grade = grade;
		this.hiworksId = hiworksId;
		this.profileImageUrl = profileImageUrl;
	}

	public void updateEmailAndNameAndHiworksId(final Member updateMember) {
		updateEmail(updateMember.email);
		updateName(updateMember.name);
		updateHiworksId(updateMember.hiworksId);
	}

	public void updateProfile(final String phoneNumber, final String profileImageUrl) {
		this.phoneNumber = phoneNumber;
		this.profileImageUrl = profileImageUrl;
	}

	public void setDefaultProfileImageUrl(final String profileImageUrl) {
		this.profileImageUrl = profileImageUrl;
	}

	public void updateGrade(final MemberGrade grade) {
		if (grade != null) {
			this.grade = grade;
		}
	}

	private void updateHiworksId(final String hiworksId) {
		if (hiworksId != null) {
			this.hiworksId = hiworksId;
		}
	}

	private void updateEmail(final String email) {
		if (email != null) {
			this.email = email;
		}
	}

	private void updateName(final String name) {
		if (name != null) {
			this.name = name;
		}
	}

	public boolean isAdmin() {
		return role == ADMIN;
	}

	@Override
	public boolean equals(final Object that) {
		if (this == that) {
			return true;
		}
		if (that == null || getClass() != that.getClass()) {
			return false;
		}
		final Member member = (Member)that;
		return Objects.equals(id, member.getId());
	}

	@Override
	public int hashCode() {
		return Objects.hash(getId());
	}
}

디렉토리 구조

  • 계층형 구조
com
 ㄴ example
     ㄴ g_shop
         ㄴ config
         ㄴ controller
         ㄴ domain
            ㄴ enum
         ㄴ repository
         ㄴ service
         ㄴ exception
         ㄴ dto
            ㄴ request
            ㄴ response
         ㄴ util

예외처리

  • spring 제공 exception을 사용하고 아니면 Custom excption을 사용
  • Custom excption으로 통일

테스트


공통


  • 테스트 메서드명을 한글로 작성한다.

  • 테스트 메서드의 @DisplayName 애노테이션을 사용하여 메서드명을 영어로 적는다.(변경)

  • 테스트 클래스의 빈 주입은 필드 주입을 사용한다.(@AutoWired , @Mock, ...)

  • 테스트 픽스쳐는 원시값 만을 Constants 객체에서 관리한다.

  • given, when, then 주석을 명시적으로 붙인다. 생략하지 않는다.

  • given, when, then 절을 나누기 곤란한 경우 given, when & then 과 같이 & 으로 합쳐 작성한다.

// given & when
// when & then
// given & when & then
  • 예외케이스에 대한 테스트 메서드 네이밍은 ~ 하면 예외가 발생한다.로을 통일한다.
  • 생성로직에 대한 테스트 메서드 명은 "~ 생성한다."로 통일한다.
Clone this wiki locally