๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Back-end ๋ฐ๋ธŒ์ฝ”์Šค/week 03 - 05 TIL (Spring)

[TIL] 221101 - SpringBoot Part1 : IoC, DDD, ApplicationContext

by young-ji 2022. 11. 3.

SpringBoot Part1 (2)

 

IoC (์ œ์–ด์˜ ์—ญ์ „)

Inversion of Control

: ์ž์‹ ์ด ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์Šค์Šค๋กœ ์„ ํƒํ•˜์ง€๋„, ์ƒ์„ฑํ•˜์ง€๋„ ์•Š๋Š”๋‹ค.

: ์„œ๋ธ”๋ฆฟ, ์Šคํ”„๋ง๊ณผ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ œ์–ด ๊ถŒํ•œ์ด ๊ฐ์ฒด ์ž์‹ ์—๊ฒŒ ์—†๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ์— ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‹จ์ง€ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘” ๋ฐ˜ ์ œํ’ˆ์ด๋‚˜ ํ™•์žฅํ•ด์„œ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๊ฒŒ ์ค€๋น„๋œ ๋ฐ˜์ œํ’ˆ์ด ์•„๋‹Œ ์ „์ฒด ํ๋ฆ„์„ ์ œ์–ด์˜ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ฒŒ ๋œ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ๋ฆ„์„ ์ง์ ‘ ์ œ์–ดํ•˜์ง€๋งŒ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฑฐ๊พธ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

์ฆ‰, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์งœ๋†“์€ ํ‹€์—์„œ ์ˆ˜๋™์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋‚ด๊ฐ€ ํ˜ธ์ถœํ•˜์ง€์•Š๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ํ˜ธ์ถœํ• ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

 

  • OrderContext : ์ฃผ๋ฌธ์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ด ๋„๋ฉ”์ธ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„์„ค์ •์„ ์ฑ…์ž„ ์ง„๋‹ค.
  • OrderService : ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด์€ ํด๋ž˜์Šค(order ์ƒ์„ฑ). ์ž์‹ ์ด ์–ด๋–ค OrderRepository๋ฅผ ์‚ฌ์šฉํ•ญ์ง€ VocherService๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์ง์ ‘ ์„ ํƒ, ์ƒ์„ฑํ•˜์ง€์•Š๊ณ  OrderContext์—๊ฒŒ ์ œ์–ด๊ถŒ์„ ๋„˜๊ธด๋‹ค

⇒ IoC๊ฐ€ ์ผ์–ด๋‚œ ์ƒํ™ฉ. IoC๊ฐ€ ์ผ์–ด๋‚˜๋Š” ์žฅ์†Œ(OrderContext)๋ฅผ IoC ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•œ ์ƒ์„ฑ๊ณผ ํŒŒ๊ดด๋ฅผ ๋ชจ๋‘ ๊ด€์žฅํ•œ๋‹ค. ( ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜์กด๊ด€๊ณ„๋ฅผ ๋งบ์–ด์คŒ.)

 

 

repository๊ฐ€ interface์ธ ์ด์œ  ?

 

reference. ํ† ๋น„์˜ ์Šคํ”„๋ง 3.1.1๋ถ€ 1์žฅ ์˜ค๋ธŒ์ ํŠธ์˜ ์˜์กด๊ด€๊ณ„

 

 


DDD (๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„)

- Repository patten

์ถœ์ฒ˜ : https://learn.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/infrastructure-persistence-layer-design

 

 

Aggregate

: ๊ฐ€์žฅ ์ž‘์€ ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ๋ชจ๋“ˆ ๋‹จ์œ„.

: ๋„๋ฉ”์ธ์˜ ์‹ค์ฒด ๊ฐœ๋…์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ์ฒด(Entity)๋“ค์˜ ์ง‘ํ•ฉ

: ๊ฐ๊ฐ์˜ Aggregate์— Root๊ฐ€ ์กด์žฌ. Aggregate Root๋Š” ๊ณง ํ•˜๋‚˜์˜ Entity

: Aggregate ๋‹จ์œ„๋กœ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋ณด์žฅ๋˜์–ด์•ผํ•œ๋‹ค.

 

Service

: Aggregate์™€ ๋‹ฌ๋ฆฌ ์ƒํƒœ(Data)๊ฐ€ ์—†๋‹ค.

: ๋น„์ง€๋‹ˆ์Šค์—์„œ ์ค‘์š”ํ•œ ํ”„๋กœ์„ธ์Šค, ํ˜น์€ ๋น„์ง€๋‹ˆ์Šค ๋ฃฐ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ํŠน์ •ํ•œ *ํ–‰์œ„(Behavior)*๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. (๋ฉ”์„œ๋“œ๋งŒ ๊ฐ€์ง)

: ๊ฐ๊ฐ์˜ Aggregate๋ฅผ ๊ฐ€์ง€๊ณ  ํŠธ๋žœ์žญ์…˜์„ ์ผ์œผํ‚ค๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ service์—์„œ ๋ณด์žฅ์„ ํ•œ๋‹ค.

: Domain Model Layer์— ์กด์žฌ

 

Repository

: Entity๋ฅผ ์ €์žฅํ•˜๋Š” ์ €์žฅ์†Œ

: order์— ๋Œ€ํ•œ ์ƒํƒœ(Data)๋ฅผ ๋ณต๊ตฌํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

 


ApplicationContext

์ผ์ข…์˜ IoC ์ปจํ…Œ์ด๋„ˆ

์–ด๋– ํ•œ class๋“ค์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค๋ผ๊ณ  registerํ•˜๋ฉด ํ•„์š”์— ์˜ํ•ด ์˜์กด๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๊ณ  ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ Managing ํ•˜๋ฉฐ ๊ฐ์ฒด๋“ค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

Spring์—์„œ ์ œ๊ณตํ•˜๋Š” ApplicationContext๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด IoC Container ์ œ๊ณต

BeanFactory๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. → BeanFactory : ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ƒ์„ฑ๊ณผ ์กฐํ•ฉ, ์˜์กด ๊ด€๊ณ„ ์„ค์ •์„ ์ œ์–ดํ•˜๋Š” IoC ๊ธฐ๋ณธ๊ธฐ๋Šฅ ์ œ๊ณต

 

๐Ÿ”ˆ Bean
→ ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” ApplicationContext,  BeanFactory, IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์–ด์ง€๋Š” ๊ฐ์ฒด
→ JVM์— ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฐ์ฒด๋“ค ์ค‘ IoC์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด์™€ ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ Bean์ด๋ผ๋Š” ์šฉ์–ด ์ œ๊ณตํ•œ๋‹ค.
→ Bean ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ• @Bean

BeanFactory์™€ ApplicationContext์˜ ์ฐจ์ด

https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-beanfactory

 

 

Configuration Metadata

์Šคํ”„๋ง์˜ ApplicationContext๋Š” ์‹ค์ œ ๋งŒ๋“ค์–ด์•ผํ•  ๋นˆ ์ •๋ณด๋ฅผ Configuration Metadata(์„ค์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)๋กœ ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ๋‹ค.

์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด IoC ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑํ•œ๋‹ค. ๊ฐ์ฒด๋“ค์„ ๋„๋ฉด์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

XML ์ด๋‚˜ Java ํŒŒ์ผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๊ฐ€๋Šฅ.

XML ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ → GenericXmlApplicationContext ๊ตฌํ˜„์ฒด

Java ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ → AnnotationConfigApplicationContext ๊ตฌํ˜„์ฒด๋ฅผ ํ†ตํ•ด ApplicationContext ๊ตฌํ˜„

 

 

 

๋ณ€๊ฒฝ ์ „

public static void main(String[] args) {
    var customId = UUID.randomUUID();
    var orderContext = new OrderContext();
    var orderService = orderContext.orderService();
    var order = orderService.createOrder(customId,new ArrayList<OrderItem>() {{
        add(new OrderItem(UUID.randomUUID(), 100L, 1));
    }});

    Assert.isTrue(order.totalAmount() == 100L, MessageFormat.format("totalAmount {0} is not 90L",order.totalAmount()));
}

 

๋ณ€๊ฒฝ ํ›„ (OrderContext๋ฅผ AppConfiguration(@Configuration)๋กœ ๋ณ€๊ฒฝ )

public static void main(String[] args) {

    var applicationContext = new AnnotationConfigApplicationContext(AppConfiguration.class);

    var customId = UUID.randomUUID();
    var orderService = applicationContext.getBean(OrderService.class);
    var order = orderService.createOrder(customId,new ArrayList<OrderItem>() {{
        add(new OrderItem(UUID.randomUUID(), 100L, 1));
    }});

    Assert.isTrue(order.totalAmount() == 100L, MessageFormat.format("totalAmount {0} is not 90L",order.totalAmount()));
}

 


Dependecy Injection

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…ํŒจํ„ด

Order๊ฐ€ ์–ด๋–ค Voucher ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ• ์ง€, ์–ด๋–ค OrderRepository ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ• ์ง€ ์Šค์Šค๋กœ ๊ฒฐ์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›๋Š” ํŒจํ„ด ⇒ ์ƒ์„ฑ์ž ์ฃผ์ž… ํŒจํ„ด

Spring์€ ์ƒ์„ฑ์ž ์ฃผ์ž… ํŒจํ„ด ์™ธ์— ์„ธํ„ฐ ๊ธฐ๋ฐ˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…๋„ ์ง€์›ํ•œ๋‹ค.

@Configuration
public class AppConfiguration {

    @Bean
    public VoucherRepository voucherRepository(){
        return new VoucherRepository() {
            @Override
            public Optional<Voucher> findById(UUID voucherId) {
                return Optional.empty();
            }
        };
    }

    @Bean
    public OrderRepository orderRepository(){
        return new OrderRepository() {
            @Override
            public void insert(Order order) {

            }
        };
    }

// ์˜์กด๊ด€๊ณ„์— ์žˆ๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ž‘์„ฑํ•ด์ฃผ๋ฉด spring์ด ๋นˆ์— ํ•œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋•Œ ์•Œ์•„์„œ ์ „๋‹ฌํ•ด์คŒ
    @Bean
    public VoucherService voucherService(VoucherRepository voucherRepository){ 
        return new VoucherService(voucherRepository);
    }

    @Bean
    public OrderService orderService(VoucherService voucherService,OrderRepository orderRepository){
        return new OrderService(voucherService,orderRepository);
    }
}

 


 

 

Daliy Mission

๋ฐ”์šฐ์ฒ˜ ๊ด€๋ฆฌ Command-line Application ์ถ”๊ฐ€

  • CommandLineApplication ํด๋ž˜์Šค ์ž‘์„ฑ
  • AnnotationConfigApplicationContext๋ฅผ ์ด์šฉํ•ด์„œ IoC ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์„œ๋น„์Šค, ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋ก
  • create ์ปค๋งจ๋“œ : ๋ฐ”์šฐ์ฒ˜ ์ƒ์„ฑ / list ์ปค๋งจ๋“œ : ์ปค๋ฉ˜๋“œ๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์กฐํšŒ

 

 

์ถœ์ฒ˜ - ํ•ด๋ฆฌ : SpringBoot Part1

๋Œ“๊ธ€