Skip to content

Latest commit

ย 

History

History
154 lines (121 loc) ยท 5.46 KB

File metadata and controls

154 lines (121 loc) ยท 5.46 KB

Architecture

Overview

Finders API๋Š” **๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜ (Package by Feature + Layered Architecture)**๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ์ด ์•„ํ‚คํ…์ฒ˜๋Š” DDD์˜ ์ผ๋ถ€ ์ „์ˆ ์  ํŒจํ„ด(Entity ๋น„์ฆˆ๋‹ˆ์Šค ๋ฉ”์„œ๋“œ, ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ๋“ฑ)์„ ์ ์šฉํ•˜์ง€๋งŒ, ์ˆœ์ˆ˜ DDD(Aggregate, Value Object, Domain Event, Bounded Context ๋“ฑ)์™€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Layer Structure

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      Controller Layer                        โ”‚
โ”‚                    (API ์ง„์ž…์ , ์š”์ฒญ/์‘๋‹ต)                      โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                       Service Layer                          โ”‚
โ”‚                    (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ)                         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                      Repository Layer                        โ”‚
โ”‚                    (๋ฐ์ดํ„ฐ ์ ‘๊ทผ, QueryDSL)                     โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                       Entity Layer                           โ”‚
โ”‚                      (๋„๋ฉ”์ธ ๋ชจ๋ธ)                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Package Structure

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/          # ์ „์—ญ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

Domain Structure

1. Member (ํšŒ์›)

  • ํšŒ์› ๊ฐ€์ž…, ํƒˆํ‡ด, ํ”„๋กœํ•„ ๊ด€๋ฆฌ
  • ๋ฐฐ์†ก์ง€ ๊ด€๋ฆฌ

2. Auth (์ธ์ฆ)

  • ์†Œ์…œ ๋กœ๊ทธ์ธ (Kakao, Apple)
  • JWT ํ† ํฐ ๋ฐœ๊ธ‰/๊ฐฑ์‹ 

3. Store (ํ˜„์ƒ์†Œ)

  • ํ˜„์ƒ์†Œ ์ •๋ณด ๊ด€๋ฆฌ
  • ๊ฒ€์ƒ‰, ํ•„ํ„ฐ๋ง, ๋žญํ‚น

4. Reservation (์˜ˆ์•ฝ)

  • ํ˜„์ƒ ์˜ˆ์•ฝ ๊ด€๋ฆฌ
  • ์‹œ๊ฐ„ ์Šฌ๋กฏ, ์ž‘์—… ์˜ต์…˜

5. Photo (์‚ฌ์ง„)

  • ์Šค์บ”๋œ ์‚ฌ์ง„ ๊ด€๋ฆฌ
  • AI ๋ณต์› ๊ธฐ๋Šฅ (Replicate - SUPIR ์ดˆํ•ด์ƒ๋„ ๋ณต์›)
  • ์ธํ™” ์ฃผ๋ฌธ

6. Community (์ปค๋ฎค๋‹ˆํ‹ฐ)

  • ํ”ผ๋“œ ๊ฒŒ์‹œ๊ธ€
  • ์ข‹์•„์š”, ๋Œ“๊ธ€

7. Inquiry (๋ฌธ์˜)

  • 1:1 ๋ฌธ์˜ ๊ด€๋ฆฌ

Design Patterns

1. Strategy Pattern

OAuth ๋กœ๊ทธ์ธ ๋ฐฉ์‹์„ ์œ ์—ฐํ•˜๊ฒŒ ๊ต์ฒด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„

public interface OAuthClient {
    OAuthUserInfo getUserInfo(String code);
}

@Component
public class KakaoOAuthClient implements OAuthClient { ... }

@Component
public class AppleOAuthClient implements OAuthClient { ... }

2. Adapter Pattern

์™ธ๋ถ€ 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 { ... }

3. Observer Pattern (Spring Event)

๋„๋ฉ”์ธ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•œ ๋А์Šจํ•œ ๊ฒฐํ•ฉ

// ์ด๋ฒคํŠธ ๋ฐœํ–‰
eventPublisher.publishEvent(new ReservationCreatedEvent(reservation));

// ์ด๋ฒคํŠธ ๊ตฌ๋…
@EventListener
public void handleReservationCreated(ReservationCreatedEvent event) { ... }

External Services

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

Database Design

Base Entity

๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ๋Š” BaseEntity ๋˜๋Š” BaseTimeEntity๋ฅผ ์ƒ์†

// ์ƒ์„ฑ์ผ/์ˆ˜์ •์ผ๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
public class SomeEntity extends BaseTimeEntity { }

// Soft Delete๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
public class SomeEntity extends BaseEntity { }

Auditing

  • @CreatedDate: ์ƒ์„ฑ ์‹œ์  ์ž๋™ ๊ธฐ๋ก
  • @LastModifiedDate: ์ˆ˜์ • ์‹œ์  ์ž๋™ ๊ธฐ๋ก
  • deletedAt: Soft Delete ์ฒ˜๋ฆฌ