푸시 서비스가 필요해서 사용해본 NHN Cloud의 TOAST 푸시 서비스,
TOAST 푸시 서비스를 사용하면서 느꼈던 불편한 점을 개선하여
모두가 사용할 수 있는 푸시 서비스를 만드는 것이 목표인 프로젝트!
- 푸시
- 단일 / 대량 푸시 발송
- 템플릿 푸시 발송
- 그룹 푸시 발송
- 예약 발송
- 사용자
- 사용자 관리
- 사용자별 프로젝트 관리
- 푸시 대상자
- 푸시 대상자 관리
- 푸시 대상자 그룹화
- 최대한 Kotlin Convention에 의거하여 코드를 작성한다.
- creationRequest/response class는 Controller Layer에서만 사용하며, Service Layer에 넘겨주지 않는다.
- Service Layer는 SRP 원칙을 엄격하게 취급하여 CRUD, Retrofit을 통한 요청 등 하나의 일을 하도록 한다.
(따라서 TemplateService와 같은 Service 객체를 만들지 않는다.) - 모든 Request는 validation을 적용하며 Kotlin 자체 에러를 피하기 위해 null check도 한다.
- creationRequest/response class는 data class로 작성하고 하나의 JSON을 표현할 때는 하나의 class만 사용하도록 static inner class를 사용한다.
- 생성자는 매개변수마다 행을 나누고 트레일링 콤마를 사용한다.
(단, 매개변수가 하나이고 어노테이션이 없는 경우에는 행을 나누지 않고 트레일링 콤마(trailing comma)도 사용하지 않는다.) - 확장이 용이한 경우에는 인터페이스를 사용하고, 외부(External) API를 사용하는 경우에는 반드시 인터페이스를 사용한다.
- class의 본문이 시작하는 중괄호와 첫 함수 사이는 한 칸 띄운다.
(단, 함수가 하나일 경우에는 하지 않고 인터페이스는 함수끼리 모두 붙인다.)
- entity class에 절대 data class를 사용하지 않는다.
- 생성자에 있는 var 변수들은 private set이 불가능하므로 var 인스턴스 변수는 선언을 본체에 둔다.
- id가 인조키인 경우 nullable 하고 반드시 클래스 본문에 둔다.
- 본문에 entity attribute가 있더라도 최대한 private set을 지향하고 의미있는 setter를 만든다.
- 모든 에러는 code(에러의 종류를 나타내는 고유의 문자 코드), message(에러의 사유), status(HttpStatus)를 가진다.
- Spring Boot에서 관리하는 MethodArgumentNotValidException 에러를 제외한 비지니스 에러는 CommonException으로 관리한다.
- 이에 해당하지 않는 경우 Internal Server Error [500]을 띄우고 서버 로그에는 stack trace를 남긴다.
src
ㄴmain
| ㄴkotlin
| | ㄴcom
| | ㄴdsm
| | ㄴclematis
| | ㄴdomain
| | | ㄴaccount
| | | | ㄴcontroller
| | | | | ㄴrequest
| | | | | ㄴresponse
| | | | ㄴdomain
| | | | ㄴexception
| | | | ㄴrepository
| | | | ㄴservice
| | | ㄴaffiliation
| | | | ㄴ...
| | | ㄴauthentication
| | | | ㄴ...
| | | ㄴgroup
| | | | ㄴ...
| | | ㄴproject
| | | | ㄴ...
| | | ㄴpush
| | | | ㄴ...
| | | ㄴtarget
| | | | ㄴ...
| | | ㄴtemplate
| | | ㄴ...
| | ㄴglobal
| | | ㄴattribute
| | | ㄴconfiguration
| | | ㄴconverter
| | | ㄴexception
| | | | ㄴentrypoint
| | | | ㄴhandler
| | | | ㄴresponse
| | | ㄴsecurity
| | | | ㄴconfiguration
| | | | ㄴfilter
| | | | ㄴprovider
| | | ㄴvalidation
| | ㄴClematisApplicationKt.kt
| ㄴresources
| ㄴapplication.yml
ㄴtest
ㄴkotlin
| ㄴcom
| ㄴdsm
| ㄴclematis
| ㄴdomain
| | ㄴaccount
| | | ㄴcontrolle - Integration Test
| | | ㄴrepository - Repository Layer Unit Test
| | | ㄴservice - Service Layer Unit Test
| | ㄴaffiliation
| | | ㄴ...
| | ㄴauthentication
| | | ㄴ...
| | ㄴgroup
| | | ㄴ...
| | ㄴproject
| | | ㄴ...
| | ㄴpush
| | | ㄴ...
| | ㄴtarget
| | | ㄴ...
| | ㄴtemplate
| | ㄴ...
| ㄴglobal
| ㄴconfiguration
| ㄴsecurity
| ㄴprovider
ㄴresources
ㄴapplication.yml
ㄴdata.sql
- Kotlin Document Coding Convention
- Kotlin Document Private set field in Constructor
- Firebase Cloud Messaging
- Spring Boot 2.4.1
- Kotlin 1.4.21
- Gradle 6.7.1
- Spring Security
- Spring Data JPA
- Spring Data Redis
- Retrofit 2.9.0
- Kotlin Coroutine 1.4.2
- Firebase Admin 6.8.1
- MySQL
- Redis