-
Notifications
You must be signed in to change notification settings - Fork 8
백엔드‐코딩 컨벤션
ashsty edited this page Jul 25, 2024
·
3 revisions
- 컨트롤러로 전달 받는 DTO는 별도 변환 작업 없이 서비스 계층에 전달한다.
- 서비스 로직 재사용 시 서비스용 DTO를 생성한다.
- DTO 네이밍은
xxxRequest
,xxxResponse
로 통일한다.- 내부 흐름 상 위에 포함되지 않는 DTO는 필요 시 논의한다.
- DTO 컬렉션 반환이 필요한 경우 wrappingDTO 를 만들어 반환한다.
-
request
와response
에 대한 validation은 DTO에서 수행한다. - DTO는
record
클래스를 이용한다. - 표준 응답 DTO는 사용하지 않는다.
- 기본적으로는
ResponseBody
를 사용하고, 필요 시 재논의한다.
- 기본적으로는
- 검증을 포함한 최소한의 로직은
일급 객체
및일급 컬렉션
을 사용한다. - 세터는 사용하지 않는다.
- 객체 추상화는 필요성이 느껴질 때 시행한다.
- 엔티티는 연관 관계를 가지는 객체, 혹은
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
}