⭐ contents ⭐

<aside> 💍 안녕하세요! 투명한 가격으로 웨딩 플래너와 예비 부부를 연결하는 매칭 플랫폼**,** 순수웨딩 팀의 백엔드입니다.

해당 문서에서는 작성한 코드와 테스트 결과를 중심으로 컨벤션, 모듈화와 재사용성, 보안, 성능 등을 어떻게 개선하였는지와 테스트 결과에 대해 설명합니다.

회색 기울임 글씨는 관련 코드 위치와 내용입니다.

Slide Title (4).jpg

</aside>

1️⃣ 코드 컨벤션


API


<aside> ❓ API 구성은 어떻게 되어있나요?

저희 순수웨딩 팀은 기능에 따라 회원(/user), 이메일(/email), 결제(/payments), 포트폴리오(/portfolios), 채팅(/chat), 매칭(/match), 견적서(/quotations), 리뷰(/reviews), 찜하기(/favorites) 의 9개의 카테고리별로 분류하여 API를 구성하였습니다.

</aside>

<aside> ❗ Restful API를 사용했어요

GET, POST, DELETE, PUT 등 적재적소에 알맞는 메서드를 사용하여 서비스의 확장성, 유연성, 독립성을 높였습니다.

</aside>

<aside> ❓ 견적서의 엔드포인트에 chatId는 왜 쿼리문이죠?

견적서의 경우 quotationIdchatId가 모두 필요하기 때문에 직관성을 위해 quotationId는 path로, chatId는 쿼리로 넘겨주도록 설정하였습니다. ex) /quotations/{quotationId}?chatId={chatId}

</aside>

코드


4명이 함께 프로젝트를 진행하다보니 코드 컨벤션을 맞추는 일이 중요했습니다. 순수웨딩-백엔드 팀의 코드 컨벤션을 정해두고 점점 확장시켰습니다.

<aside> 📌 순수웨딩 - BE 컨벤션

  1. 폴더 이름은 소문자로, 파일명, 변수명, 메서드명은 CamelCase로, 엔티티의 필드네임은 snake_case로, 상수는UPPER_CASE 로, 테이블 이름은 snake_case_tb 로 통일
  2. 클래스 대신 record 사용하기, RequestDTO와 ResponseDTO는 따로 묶고 DTOConverter에서 변환하기
  3. CRUD 네이밍 통일 (생성 → save / 조회 → find / 수정 → update / 삭제 → delete)
  4. Annotation 순서 설정: 클래스 → 필드 → 생성자 → 메서드
  5. Class 전체에 @Transactional(readOnly = true)를 사용하고 필요한 메서드에 @Transactional 사용하기
  6. 상태, 등급 등 constant한 값을 가지고 있는 내용은 enum 타입으로 분리하기
  7. DB를 잘못 삭제하는 걸 방지하기 위해서 각 table마다 is_active 필드를 통해 SQLDelete활용하기
  8. 테스트할 때 Assertions.assertThat, assertThrows는 static import하기
  9. 테스트할 때 RepositoryTest는 DummyEntity에서 생성해서, ControllerTest는 teardown.sql에서 가져와서 테스트 하기
  10. 테스트할 때 logResult() 함수를 따로 빼서 중복 코드 줄이기 </aside>

2️⃣ 코드 모듈화 & 재사용성