Finders API๋ **๋๋ฉ์ธ ๊ธฐ๋ฐ ๊ณ์ธตํ ์ํคํ ์ฒ (Package by Feature + Layered Architecture)**๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฐธ๊ณ : ์ด ์ํคํ ์ฒ๋ DDD์ ์ผ๋ถ ์ ์ ์ ํจํด(Entity ๋น์ฆ๋์ค ๋ฉ์๋, ํฉํ ๋ฆฌ ๋ฉ์๋ ๋ฑ)์ ์ ์ฉํ์ง๋ง, ์์ DDD(Aggregate, Value Object, Domain Event, Bounded Context ๋ฑ)์๋ ๋ค๋ฆ ๋๋ค.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Controller Layer โ
โ (API ์ง์
์ , ์์ฒญ/์๋ต) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Service Layer โ
โ (๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Repository Layer โ
โ (๋ฐ์ดํฐ ์ ๊ทผ, QueryDSL) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Entity Layer โ
โ (๋๋ฉ์ธ ๋ชจ๋ธ) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
com.finders.api/
โ
โโโ domain/ # ๋๋ฉ์ธ ๋ ์ด์ด (ํต์ฌ ๋น์ฆ๋์ค)
โ โโโ {domain}/
โ โโโ controller/ # REST API ์ปจํธ๋กค๋ฌ
โ โโโ service/ # ๋น์ฆ๋์ค ๋ก์ง
โ โโโ repository/ # ๋ฐ์ดํฐ ์ ๊ทผ
โ โโโ entity/ # JPA ์ํฐํฐ
โ โโโ dto/ # ์์ฒญ/์๋ต DTO
โ โโโ enums/ # ๋๋ฉ์ธ ์์
โ
โโโ infra/ # ์ธํ๋ผ ๋ ์ด์ด (์ธ๋ถ ์์คํ
, ๊ต์ฒด ๊ฐ๋ฅ)
โ โโโ storage/ # ํ์ผ ์ ์ฅ์ (GCS)
โ โโโ oauth/ # OAuth ํด๋ผ์ด์ธํธ (Kakao, Apple)
โ โโโ payment/ # ๊ฒฐ์ (ํ ์ค ํ์ด๋จผ์ธ )
โ โโโ replicate/ # AI ์ด๋ฏธ์ง ๋ณต์ (Replicate SUPIR)
โ
โโโ global/ # ๊ธ๋ก๋ฒ ๋ ์ด์ด (๊ณตํต ๋ชจ๋)
โโโ config/ # ์ค์ ํด๋์ค
โโโ entity/ # Base Entity
โโโ response/ # ํต์ผ๋ ์๋ต ๊ตฌ์กฐ
โโโ exception/ # ์ ์ญ ์์ธ ์ฒ๋ฆฌ
- ํ์ ๊ฐ์ , ํํด, ํ๋กํ ๊ด๋ฆฌ
- ๋ฐฐ์ก์ง ๊ด๋ฆฌ
- ์์ ๋ก๊ทธ์ธ (Kakao, Apple)
- JWT ํ ํฐ ๋ฐ๊ธ/๊ฐฑ์
- ํ์์ ์ ๋ณด ๊ด๋ฆฌ
- ๊ฒ์, ํํฐ๋ง, ๋ญํน
- ํ์ ์์ฝ ๊ด๋ฆฌ
- ์๊ฐ ์ฌ๋กฏ, ์์ ์ต์
- ์ค์บ๋ ์ฌ์ง ๊ด๋ฆฌ
- AI ๋ณต์ ๊ธฐ๋ฅ (Replicate - SUPIR ์ดํด์๋ ๋ณต์)
- ์ธํ ์ฃผ๋ฌธ
- ํผ๋ ๊ฒ์๊ธ
- ์ข์์, ๋๊ธ
- 1:1 ๋ฌธ์ ๊ด๋ฆฌ
OAuth ๋ก๊ทธ์ธ ๋ฐฉ์์ ์ ์ฐํ๊ฒ ๊ต์ฒด ๊ฐ๋ฅํ๋๋ก ์ค๊ณ
public interface OAuthClient {
OAuthUserInfo getUserInfo(String code);
}
@Component
public class KakaoOAuthClient implements OAuthClient { ... }
@Component
public class AppleOAuthClient implements OAuthClient { ... }์ธ๋ถ API๋ฅผ ๋ด๋ถ ์ธํฐํ์ด์ค๋ก ์ถ์ํ
// Storage ์์ - GCS๋ฅผ S3๋ก ๊ต์ฒด ๊ฐ๋ฅ
public interface StorageService {
StorageResponse.Upload uploadPublic(MultipartFile file, StoragePath path, Object... args);
}
@Service
public class GcsStorageService implements StorageService { ... }
// ํ์์: public class S3StorageService implements StorageService { ... }๋๋ฉ์ธ ์ด๋ฒคํธ๋ฅผ ํตํ ๋์จํ ๊ฒฐํฉ
// ์ด๋ฒคํธ ๋ฐํ
eventPublisher.publishEvent(new ReservationCreatedEvent(reservation));
// ์ด๋ฒคํธ ๊ตฌ๋
@EventListener
public void handleReservationCreated(ReservationCreatedEvent event) { ... }| Service | Purpose | Package |
|---|---|---|
| Google Cloud Storage | ํ์ผ ์ ์ฅ์ | infra.storage |
| Kakao OAuth | ์์ ๋ก๊ทธ์ธ | infra.oauth.kakao |
| Apple OAuth | ์์ ๋ก๊ทธ์ธ | infra.oauth.apple |
| ํ ์ค ํ์ด๋จผ์ธ | ๊ฒฐ์ | infra.payment |
| Replicate (SUPIR) | AI ์ด๋ฏธ์ง ๋ณต์ | infra.replicate |
๋ชจ๋ ์ํฐํฐ๋ BaseEntity ๋๋ BaseTimeEntity๋ฅผ ์์
// ์์ฑ์ผ/์์ ์ผ๋ง ํ์ํ ๊ฒฝ์ฐ
public class SomeEntity extends BaseTimeEntity { }
// Soft Delete๊ฐ ํ์ํ ๊ฒฝ์ฐ
public class SomeEntity extends BaseEntity { }@CreatedDate: ์์ฑ ์์ ์๋ ๊ธฐ๋ก@LastModifiedDate: ์์ ์์ ์๋ ๊ธฐ๋กdeletedAt: Soft Delete ์ฒ๋ฆฌ