- Multi-module Gradle project (Java 21, Spring Boot 4.0)
- Modules: MS-Common, MS-Auth, MS-Member, MS-Place, MS-SNS, MS-AI, MS-Web
- Controller๋
MS-Web๋ชจ๋์ ์์น XxxController๋ ๋ฐ๋์XxxControllerDocs์ธํฐํ์ด์ค๋ฅผ implementsXxxControllerDocs์ Swagger@Operation,@ApiLog์ด๋ ธํ ์ด์ ์ ์@AuthenticationPrincipal CustomUserDetails userDetails๋ก ์ธ์ฆ ์ฒ๋ฆฌ@RestController,@RequiredArgsConstructor,@Slf4j,@RequestMapping์ฌ์ฉ
- ๊ฐ API ๋ฉ์๋๋ง๋ค ๋ณ๋์ Request/Response DTO๋ฅผ ์์ฑ
- Request ๋ค์ด๋ฐ:
{๋์}{๋๋ฉ์ธ}Request(์:CreateFolderRequest,UpdateFolderRequest) - Response ๋ค์ด๋ฐ:
{๋์}{๋๋ฉ์ธ}Response(์:GetFoldersResponse,CreateFolderResponse) - Response๋ DB Entity ํ๋๋ฅผ ๊ทธ๋๋ก DTO๋ก ๋ณํํ์ฌ ๋ฐํ (๋ถํ์ํ ๊ฐ๊ณต ์์ด)
- DTO๋ ๊ฐ ๋๋ฉ์ธ ๋ชจ๋์
dtoํจํค์ง์ ์์น (์:MS-Place/...place/dto/) - Lombok:
@Getter,@Builder,@NoArgsConstructor,@AllArgsConstructor - Swagger:
@Schema์ด๋ ธํ ์ด์ ์ผ๋ก ํ๋ ์ค๋ช - ์ํฐํฐ โ DTO ๋ณํ์
from()์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋ ์ฌ์ฉ
- Service๋ ๊ฐ ๋๋ฉ์ธ ๋ชจ๋์ ์์น (์:
MS-Place/...place/service/) @Service,@RequiredArgsConstructor,@Slf4j- ํด๋์ค ๋ ๋ฒจ:
@Transactional(readOnly = true)๊ธฐ๋ณธ - ๋ณ๊ฒฝ ๋ฉ์๋๋ง:
@Transactional - Member ํ๋ผ๋ฏธํฐ์ UUID ํ๋ผ๋ฏธํฐ ์ค๋ฒ๋ก๋ ๋ฉ์๋ ํจํด
- JPA Repository,
extends JpaRepository<Entity, UUID> - Soft Delete ๊ณ ๋ ค:
deletedAtIsNull์กฐ๊ฑด ํญ์ ํฌํจ - N+1 ๋ฐฉ์ง:
@Query+JOIN FETCH์ฌ์ฉ @Repository์ด๋ ธํ ์ด์ ์ฌ์ฉ
SoftDeletableBaseEntity์์ (isDeleted, deletedAt, deletedBy)- UUID PK:
@GeneratedValue(strategy = GenerationType.UUID) - Lombok:
@Entity,@Builder,@Getter,@NoArgsConstructor(access = PROTECTED),@AllArgsConstructor(access = PRIVATE)
ErrorCodeenum์ ์๋ฌ ์ฝ๋ ์ ์ (HttpStatus + message)CustomException(ErrorCode)throwErrorResponseํ์ค ์๋ต ํ์
{์ด์ ์ ๋ชฉ} : {type} : {๋ณ๊ฒฝ ์ฌํญ ์ค๋ช } {์ด์ URL}- type: feat, fix, refactor, docs, chore, test