Super Kawaii Cute Cat Kaoani
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
{Back-end}/SpringBoot

[SpringBoot]์Šคํ”„๋ง ๊ธฐ๋ณธํŽธ - ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ (2)

by wonee1 2025. 9. 6.
728x90

 

๐Ÿ–Š๏ธ ๋ณธ ํฌ์ŠคํŠธ๋Š” ์ธํ”„๋Ÿฐ ๊น€์˜ํ•œ ์Šคํ”„๋ง ๊ธฐ๋ณธํŽธ์„ ๋ณด๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ| ๊น€์˜ํ•œ - ์ธํ”„๋Ÿฐ ๊ฐ•์˜

ํ˜„์žฌ ํ‰์  5.0์  ์ˆ˜๊ฐ•์ƒ 48,140๋ช…์ธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”. ์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง ๊ธฐ๋ณธ ๊ธฐ๋Šฅ, ์Šคํ”„

www.inflearn.com

 

 

4. ์Šคํ”„๋ง์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

 

์Šคํ”„๋ง์—์„œ์˜ IoC/DI ์ปจํ…Œ์ด๋„ˆ

  • ApplicationContext๋Š”  ์Šคํ”„๋ง์˜ ๋Œ€ํ‘œ์ ์ธ IoC/DI ์ปจํ…Œ์ด๋„ˆ
  • @Configuration + @Bean, ๋˜๋Š” @Component + @Autowired ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ & ์ฃผ์ž… ๊ด€๋ฆฌํ•œ๋‹ค. 
  • ๊ฐœ๋ฐœ์ž๋Š” ์˜ค์ง ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•œ๋‹ค → ์Šคํ”„๋ง์ด ๊ตฌํ˜„์ฒด(๊ตฌ์ฒด ํด๋ž˜์Šค) ์„ ํƒ + ์ฃผ์ž… ๋‹ด๋‹นํ•œ๋‹ค 

 

 

 

AppConfig ์Šคํ”„๋ง ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€๊ฒฝ

 

package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class AppConfig {

    @Bean 
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }
    
    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(
                memberRepository(),
                discountPolicy());
    }
    
    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    
    @Bean
    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
    }

}

 

 

AppConfig์— ์„ค์ •์„ ๊ตฌ์„ฑํ•œ๋‹ค๋Š” ๋œป์˜ @Configuration์„ ๋ถ™์—ฌ์ค€๋‹ค.

๋˜ํ•œ ๊ฐ ๋ฉ”์„œ๋“œ์— @Bean ์„ ๋ถ™์—ฌ์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค

 

 

โญ ์–ด๋…ธํ…Œ์ด์…˜ ์ƒ์„ธ ์„ค๋ช… 

๋”๋ณด๊ธฐ

@Configuration

  • ํด๋ž˜์Šค์— ๋ถ™์ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜
  • ์ด ํด๋ž˜์Šค๊ฐ€ ์Šคํ”„๋ง ์„ค์ • ํด๋ž˜์Šค(= AppConfig ์—ญํ• )์ž„์„ ๋‚˜ํƒ€๋ƒ„
  • ์Šคํ”„๋ง์€ @Configuration์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์ฝ๊ณ , ์•ˆ์— ์žˆ๋Š” @Bean ๋ฉ”์„œ๋“œ๋“ค์„ ๋ชจ๋‘ ์‹คํ–‰ํ•ด์„œ ๋ฆฌํ„ด๋œ ๊ฐ์ฒด๋“ค์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•จ
  • ์ด๋ ‡๊ฒŒ ๋“ฑ๋ก๋œ ๊ฐ์ฒด๋“ค์„ ์Šคํ”„๋ง ๋นˆ(Bean)์ด๋ผ๊ณ  ๋ถ€๋ฆ„



@Bean

  • ๋ฉ”์„œ๋“œ์— ๋ถ™์ด๋Š” ์–ด๋…ธํ…Œ์ด์…˜
  • ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•  ๋นˆ(Bean)์œผ๋กœ ๋“ฑ๋ก
  • ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋นˆ์˜ ์ด๋ฆ„์ด ๋จ (ํ•„์š”ํ•˜๋ฉด @Bean(name="์ด๋ฆ„")์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)

 

 

 

 

 

MemberApp์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ ์šฉ

 

public class MemberApp {
    public static void main(String[] args) {
       // AppConfig appConfig = new AppConfig();
       // MemberService memberService = appConfig.memberService();

        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
       
        Member member = new Member(1L, "memberA", Grade.VIP);
        memberService.join(member);
        Member findMember = memberService.findMember(1L);
        System.out.println("new member = " + member.getName());
        System.out.println("find Member = " + findMember.getName());
    }
}

 

  • ApplicationContext
    • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ(= IoC/DI ์ปจํ…Œ์ด๋„ˆ) ์ธํ„ฐํŽ˜์ด์Šค๋‹ค. 
    • ์—ฌ๊ธฐ์„œ๋Š” AnnotationConfigApplicationContext ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉ → @Configuration ๊ธฐ๋ฐ˜ ์„ค์ • ํด๋ž˜์Šค(AppConfig) ์ฝ์–ด๋“ค์ธ๋‹ค. 
  • AppConfig.class ์ „๋‹ฌ
    • AppConfig ์„ค์ • ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํ”„๋ง์ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ, ๊ด€๋ฆฌ, ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…
  • getBean("memberService", MemberService.class)
    • AppConfig์—์„œ @Bean์œผ๋กœ ๋“ฑ๋กํ•œ "memberService" ๋นˆ์„ ๊ฐ€์ ธ์˜จ๋‹ค

 

 

 

 

OrderApp์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ ์šฉ

public class OrderApp {
    public static void main(String[] args) {
        //        AppConfig appConfig = new AppConfig();
        //        MemberService memberService = appConfig.memberService();
        //        OrderService orderService = appConfig.orderService();
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
        
        OrderService orderService = applicationContext.getBean("orderService",
                OrderService.class);
        long memberId = 1L;
        Member member = new Member(memberId, "memberA", Grade.VIP);
        memberService.join(member);
        Order order = orderService.createOrder(memberId, "itemA", 10000);
        System.out.println("order = " + order);
    }
}

 

 

 

 

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ž€? 

 

ApplicationContext๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ํ•œ๋‹ค. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์ด ์žˆ๋‹ค. 

 

1. ๊ฐ์ฒด ๊ด€๋ฆฌ ์ž๋™ํ™”

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ์ผ์ด new ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ํ•„์š” ์—†๋‹ค
  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋นˆ ์ƒ์„ฑ → ๊ด€๋ฆฌ → ์†Œ๋ฉธ๊นŒ์ง€ ์ „๋ถ€ ์ฑ…์ž„์ง„๋‹ค 
  • ๊ฐ™์€ ๋นˆ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์š”์ฒญํ•ด๋„ ํ•˜๋‚˜๋งŒ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ, ์„ฑ๋Šฅ ์ตœ์ ํ™”

 

2. ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(DI) ์ž๋™ํ™”

  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•„์š”ํ•œ ์˜์กด๊ด€๊ณ„๋ฅผ ์•Œ์•„์„œ ์ฃผ์ž…ํ•ด ์คŒ
  • ๊ฐœ๋ฐœ์ž๋Š” ์ธํ„ฐํŽ˜์ด์Šค(์—ญํ• )๋งŒ ์˜์กด → ๊ตฌ์ฒด ํด๋ž˜์Šค(๊ตฌํ˜„์ฒด) ์„ ํƒ์€ ์Šคํ”„๋ง์ด ๋‹ด๋‹นํ•œ๋‹ค 
  • DIP, OCP ์›์น™์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋‹ค 

 

3. ์„ค์ • ์ •๋ณด์˜ ์ผ์›ํ™”

  • @Configuration + @Bean์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด ๊ตฌ์กฐ(๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๊ด€๊ณ„ ์—ฐ๊ฒฐ)๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋‹ค
  • "์–ด๋–ค ๊ตฌํ˜„์ฒด๊ฐ€ ์ฃผ์ž…๋˜๋Š”๊ฐ€?"๋ฅผ ์ฝ”๋“œ ์—ฌ๊ธฐ์ €๊ธฐ ๋’ค์งˆ ํ•„์š” ์—†์ด ์„ค์ • ํด๋ž˜์Šค๋งŒ ๋ณด๋ฉด ๋œ๋‹ค

 

4. ์œ ์—ฐํ•œ ํ™•์žฅ์„ฑ

  • ๊ตฌํ˜„์ฒด๋ฅผ ๊ต์ฒดํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ ์ˆ˜์ •์ด ํ•„์š” ์—†๋‹ค
    • FixDiscountPolicy → RateDiscountPolicy ๊ต์ฒด ์‹œ AppConfig๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค
  • ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ(๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ์šด์˜)์— ๋งž๊ฒŒ ๋นˆ ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์‰ฝ๋‹ค 

 

 

 

 

 

728x90