/Backend-Clematis

TOAST 푸시 서비스를 사용하면서 느꼈던 불편한 점을 개선하여 모두가 사용할 수 있는 푸시 서비스를 만드는 것이 목표인 프로젝트

Primary LanguageKotlin

꼬리별 [KKoribyeol]

백엔드 (Clematis)

Clematis

푸시 서비스가 필요해서 사용해본 NHN Cloud의 TOAST 푸시 서비스,
TOAST 푸시 서비스를 사용하면서 느꼈던 불편한 점을 개선하여
모두가 사용할 수 있는 푸시 서비스를 만드는 것이 목표인 프로젝트!

Feature

  • 푸시
    • 단일 / 대량 푸시 발송
    • 템플릿 푸시 발송
    • 그룹 푸시 발송
    • 예약 발송
  • 사용자
    • 사용자 관리
    • 사용자별 프로젝트 관리
  • 푸시 대상자
    • 푸시 대상자 관리
    • 푸시 대상자 그룹화

Coding Convention

Common

  • 최대한 Kotlin Convention에 의거하여 코드를 작성한다.

Layer

  • creationRequest/response class는 Controller Layer에서만 사용하며, Service Layer에 넘겨주지 않는다.
  • Service Layer는 SRP 원칙을 엄격하게 취급하여 CRUD, Retrofit을 통한 요청 등 하나의 일을 하도록 한다.
    (따라서 TemplateService와 같은 Service 객체를 만들지 않는다.)
  • 모든 Request는 validation을 적용하며 Kotlin 자체 에러를 피하기 위해 null check도 한다.

Class

  • creationRequest/response class는 data class로 작성하고 하나의 JSON을 표현할 때는 하나의 class만 사용하도록 static inner class를 사용한다.
  • 생성자는 매개변수마다 행을 나누고 트레일링 콤마를 사용한다.
    (단, 매개변수가 하나이고 어노테이션이 없는 경우에는 행을 나누지 않고 트레일링 콤마(trailing comma)도 사용하지 않는다.)
  • 확장이 용이한 경우에는 인터페이스를 사용하고, 외부(External) API를 사용하는 경우에는 반드시 인터페이스를 사용한다.
  • class의 본문이 시작하는 중괄호와 첫 함수 사이는 한 칸 띄운다.
    (단, 함수가 하나일 경우에는 하지 않고 인터페이스는 함수끼리 모두 붙인다.)

Entity

  • entity class에 절대 data class를 사용하지 않는다.
  • 생성자에 있는 var 변수들은 private set이 불가능하므로 var 인스턴스 변수는 선언을 본체에 둔다.
  • id가 인조키인 경우 nullable 하고 반드시 클래스 본문에 둔다.
  • 본문에 entity attribute가 있더라도 최대한 private set을 지향하고 의미있는 setter를 만든다.

Error Handling

  • 모든 에러는 code(에러의 종류를 나타내는 고유의 문자 코드), message(에러의 사유), status(HttpStatus)를 가진다.
  • Spring Boot에서 관리하는 MethodArgumentNotValidException 에러를 제외한 비지니스 에러는 CommonException으로 관리한다.
  • 이에 해당하지 않는 경우 Internal Server Error [500]을 띄우고 서버 로그에는 stack trace를 남긴다.

Reference

External API

  • Firebase Cloud Messaging

Library & Framework

  • Spring Boot 2.4.1
  • Kotlin 1.4.21
  • Gradle 6.7.1
  • Spring Security
  • Spring Data JPA
  • Spring Data Mongo
  • Retrofit 2.9.0
  • Kotlin Coroutine 1.4.2
  • Firebase Admin 6.8.1

Database

  • MySQL
  • MongoDB

Review