๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ›๏ธ Architecture

[๋งŒ๋“ค๋ฉด์„œ ๋ฐฐ์šฐ๋Š” ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜] Chapter9. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์กฐ๋ฆฝํ•˜๊ธฐ

by GroovyArea 2022. 11. 11.

9. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์กฐ๋ฆฝํ•˜๊ธฐ

1. ์กฐ๋ฆฝ๊นŒ์ง€ ์‹ ๊ฒฝ ์จ์•ผ ํ•˜๋Š” ์ด์œ 

  • ์ฝ”๋“œ์˜ ์˜์กด์„ฑ์€ ํ•ญ์ƒ ์•ˆ์ชฝ์œผ๋กœ,
    • ๋„๋ฉ”์ธ ์ฝ”๋“œ ๋ฐฉํ–ฅ์œผ๋กœ ํ–ฅํ•ด์•ผ ์•ˆ์ „ํ•จ.
  • ์„ค์ • ์ปดํฌ๋„ŒํŠธ (configuration component)๊ฐ€ ํ•„์š”
    • ์•„ํ‚คํ…์ฒ˜์— ์ค‘๋ฆฝ์ 
    • ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์„ ์œ„ํ•ด ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์˜์กด์„ฑ์„ ๊ฐ€์ง


์„ค์ • ์ปดํฌ๋„ŒํŠธ์˜ ์—ญํ• 

  • ์›น ์–ด๋Œ‘ํ„ฐ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
  • HTTP ์š”์ฒญ์ด ์‹ค์ œ๋กœ ์›น ์–ด๋Œ‘ํ„ฐ๋กœ ์ „๋‹ฌ๋˜๋„๋ก ๋ณด์žฅ
  • ์œ ์Šค์ผ€์ด์Šค ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
  • ์›น ์–ด๋Œ‘ํ„ฐ์— ์œ ์Šค์ผ€์ด์Šค ์ธ์Šคํ„ด์Šค ์ œ๊ณต
  • ์˜์†์„ฑ ์–ด๋Œ‘ํ„ฐ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
  • ์œ ์Šค์ผ€์ด์Šค์— ์˜์†์„ฑ ์–ด๋Œ‘ํ„ฐ ์ธ์Šคํ„ด์Šค ์ œ๊ณต
  • ์˜์†์„ฑ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅ

์ด๋Ÿฌํ•œ ์ž‘์—…์€ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์œ„๋ฐ˜ํ•˜๋Š”๊ฒŒ ๋งž๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๋ถ€ํ’ˆ์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ.


2. ํ‰๋ฒ”ํ•œ ์ฝ”๋“œ๋กœ ์กฐ๋ฆฝํ•˜๊ธฐ

package com.book.cleanarchitecture.buckpal;

import com.book.cleanarchitecture.buckpal.account.adapter.in.web.SendMoneyController;
import com.book.cleanarchitecture.buckpal.account.adapter.out.persistence.AccountPersistenceAdapter;
import com.book.cleanarchitecture.buckpal.account.application.port.in.SendMoneyUseCase;
import com.book.cleanarchitecture.buckpal.account.application.service.SendMoneyService;

public class Application {
    public static void main(String[] args) {
        AccountRepository accountRepository = new AccountRepository();
        ActivityRepository activityRepository = new ActivityRepository();

        AccountPersistenceAdapter accountPersistenceAdapter = new AccountPersistenceAdapter(accountRepository, activityRepository);

        SendMoneyUseCase sendMoneyUseCase = new SendMoneyService(
                accountPersistenceAdapter,
                accountPersistenceAdapter
        );

        SendMoneyController sendMoneyController = new SendMoneyController(sendMoneyUseCase);

        startProcessingWebRequests(sendMoneyController);
    }
}
  • ์„ค์ • ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ„๋žตํ•œ ์˜ˆ์‹œ
    • main ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ ํ›„ ์—ฐ๊ฒฐํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์™„์ „ํ•ด์งˆ ๊ฒฝ์šฐ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๋Š์ž„ ์—†์ด ์ƒ์„ฑํ•ด์•ผ ํ•จ.
  • ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์€ ๋ชจ๋“  ํด๋ž˜์Šค public ์ด์–ด์•ผ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•จ. => ์ตœ์•…
  • package-private (default) ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ์ž๋ฐ”์˜ ์˜์กด์„ฑ ์ฃผ์ž… ํ”„๋ ˆ์ž„์›Œํฌ์ธ ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

3. ์Šคํ”„๋ง์˜ ํด๋ž˜์ŠคํŒจ์Šค ์Šค์บ๋‹์œผ๋กœ ์กฐ๋ฆฝํ•˜๊ธฐ

  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•ด ์กฐ๋ฆฝํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฒฐ๊ณผ๋ฌผ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ผ๊ณ  ๋ถ€๋ฆ„.
    • ๊ตฌ์„ฑ ๊ฐ์ฒด๋Š” bean.
  • ์Šคํ”„๋ง์€ ํด๋ž˜์ŠคํŒจ์Šค ์Šค์บ๋‹์œผ๋กœ ํด๋ž˜์ŠคํŒจ์Šค์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ํด๋ž˜์Šค๋ฅผ ํ™•์ธํ•ด์„œ @Component ์• ๋„ˆํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.

์Šคํ”„๋ง ์ธ์‹ ์šฉ ์ปค์Šคํ…€ ์• ๋…ธํ…Œ์ด์…˜

package com.book.cleanarchitecture.buckpal.shared;

import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

import java.lang.annotation.*;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface UseCase {

    @AliasFor(annotation = Component.class)
    String value() default "";
}
  • ์Šคํ”„๋ง์ด ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ์ปค์Šคํ…€ ์• ๋…ธํ…Œ์ด์…˜๋„ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๋‹ค.

    ๋‹จ์ 

  1. ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์— ๋งค์šฐ ์˜์กด์ ์ž„.
  2. ํ‘๋งˆ๋ฒ•์ด ์ผ์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ.
    • ๋‹น์žฅ Bean์œผ๋กœ ๋“ฑ๋กํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ๋ง‰์ง€ ๋ชปํ•จ.
    • ์•…์˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์šด ์—๋Ÿฌ๋ฅผ ์ผ์œผํ‚ฌ ์šฐ๋ ค๊ฐ€ ์žˆ๋‹ค.

4. ์Šคํ”„๋ง์˜ ์ž๋ฐ” ์ปจํ”ผ๊ทธ๋กœ ์กฐ๋ฆฝํ•˜๊ธฐ

  • @Configuration ์„ ํ†ตํ•ด ์Šค์บ๋‹์„ ๊ฐ€์ง€๊ณ  ์ฐพ์•„์•ผ ํ•˜๋Š” ์„ค์ • ํด๋ž˜์Šค์ž„์„ ํ‘œ์‹œ.
  • ๋ชจ๋“  Bean์„ ์ฐพ์•„์˜ค๋Š”๊ฑด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งˆ๋ฒ•์ด ์ผ์–ด๋‚  ์ผ์€ ์ ๋‹ค.
  • ์„ค์ • ํด๋ž˜์Šค์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€์— ๋„ฃ์–ด๋†“์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— public์œผ๋กœ ํ•ด์•ผ ํ•œ๋‹ค. -> ๋‹จ์ 
  • ํŒจํ‚ค์ง€๋ฅผ ๋ชจ๋“ˆ ๊ฒฝ๊ณ„๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ ํŒจํ‚ค์ง€ ์•ˆ์— ์ „์šฉ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•˜์œ„ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆœ ์—†๋‹ค.

5. ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€?

  • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ํŽธ๋ฆฌํ•˜๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์กฐ๋ฆฝ ๊ฐ€๋Šฅ.
  • ์ฝ”๋“œ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ ๊ฒฝ์šฐ ํˆฌ๋ช…์„ฑ์ด ๋‚ฎ์•„์ง.
    • ์–ด๋–ค Bean์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ์— ์˜ฌ๋ผ์˜ค๋Š”์ง€ ์ •ํ™•ํžˆ ํŒŒ์•… ๋ถˆ๊ฐ€.
  • ๋…๋ฆฝ์ ์ธ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆ๊ฐ€.
๋ฐ˜์‘ํ˜•