Skip to content

[BE] 개발 문서

JUHA edited this page Jul 12, 2024 · 3 revisions

기술 스택

Java 버전: 17

  • 스프링 부트 3부터 Java 17이 필수이기 때문에 선정했습니다.
  • 장기 지원(LTS)이 2029년까지 제공되어 안정적인 유지보수가 가능합니다.

Spring Boot 버전: 3.3.1

  • 최신 기능과 보안 패치를 적용받을 수 있어 안정성과 성능이 향상됩니다.

API 문서: 노션, Swagger

  • 초기에 프론트엔드 개발자와 함께 노션으로 API 문서화 작업
  • 이후 개발 과정에서 Swagger 사용
    • 실행 가능한 API 문서입니다.
    • 자동화된 문서 생성합니다.
    • 사용이 편리한 UI를 제공합니다.

MySQL: 8.x.x

  • 현재 대용량 처리가 필요하지 않아 NoSQL 대신 RDBMS(관계형 데이터베이스)를 선택했습니다.
  • 데이터 정합성을 중시하기 때문에 MySQL을 선택했습니다.
  • MySQL은 오픈소스 데이터베이스로 무료로 사용할 수 있고, 커뮤니티 활성도가 높아 다양한 레퍼런스를 찾기 용이합니다.

CI/CD: Github Actions

  • GitHub와의 원활한 통합으로 CI/CD 파이프라인 구축이 간편합니다.

ORM: JPA

  • 관계형 데이터베이스를 사용할 때 SQL을 통해 데이터를 저장하고 조회해야 하는데, JPA를 사용하면 이를 추상화하여 개발자가 SQL에 종속되지 않고 개발할 수 있습니다.
  • 객체지향 개념과 관계형 데이터베이스 간의 패러다임 불일치를 해결할 수 있습니다.
  • Spring Data JPA를 사용하면 구현체(Hibernate 등) 교체가 용이하며, 저장소를 다른 형태로 변경하는 것도 간편합니다.
  • Spring 팀에서 권장하는 방식으로, JPA를 더 쉽게 사용할 수 있습니다.

로깅 프레임워크: 미정

  • 추후 결정 예정

코드 컨벤션

기본 코드 스타일

상세 코드 컨벤션

롬복(Lombok)

  • @Getter
  • @Builder
  • @EqualsAndHashCode
  • @NoArgsConstructor
  • @RequiredArgsConstructor

클래스

  • 클래스 첫 줄 개행
  • 클래스 마지막에 개행 X

정적 팩토리 메서드

  • 파라미터 개수 상관 없이 of() 네이밍 사용

엔티티

  • 엔티티 객체 필드 간 개행
  • return 전 개행

DTO와 VO

  • DTO는 record로 정의
    • Controller DTO는 validation 있는 경우 필드 간 개행
  • VO는 class로 정의

메서드 파라미터 개행

  • 120이 넘어가는 경우 다음과 같이 개행
public boolean sendMail(String fromEmail,
                        String toEmail,
                        String subject,
                        String content) {
  ...
}

enum 클래스 형식

@Getter
@RequiredArgsConstructor
public enum OrderStatus { // enum은 첫 줄 공백 x
    INIT("주문생성"),
    CANCELED("주문취소"),
    PAYMENT_COMPLETED("결제완료"),
    PAYMENT_FAILED("결제실패"),
    RECEIVED("주문접수"),
    COMPLETED("처리완료"), // 마지막 값에 콤마 포함 세미콜론은 줄 분리
    ;

    private final String text;
}

클래스 구성 순서

  1. 상수
  2. 멤버 변수(필드)
  3. 생성자
  4. 정적 팩토리 메서드
  5. 일반 메서드
  6. getter
  7. equals & hashcode

애플리케이션 메서드 순서

  1. Read
  2. Create
  3. Update
  4. Delete

어노테이션 순서

중요도 높을수록 클래스에 가깝게

@RequiredArgsConstructor
@Transactional(readOnly = true)
@Service
public class ProductService {
  ...
}

@DisplayName("테스트 이름")
@Test
public class ProductTest {
  ...
}

트랜잭션 Annotation

  • 클래스 레벨에 @Transactional(readOnly = true) 명시
  • 메서드 레벨에 @Transactional 명시

테스트

  • 메서드 네이밍
    • @DisplayName에 구체적으로 작성
    • 메서드 이름은 호출하는 메서드로 (중복될 경우 뒤에 숫자 추가해서 구분)
  • 테스트 어노테이션 순서
    • @DisplayName
    • @ParameterizedTest
    • @Value
    • @Test
  • given-when-then 주석 대신 개행 사용

테스트 방식

  • Controller: 추후 작성
  • Service: 추후 작성
  • Repository
    • query creation으로 작성된 부분은 테스트 X
    • JPQL 작성한 부분만 테스트
  • Domain: 추후 작성