Spring

Spring ํ•ต์‹ฌ

์กฐ๋ฐˆ๋ฐ 2022. 4. 11. 18:18

๐Ÿ“Œ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•ด์„œ ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค -> ์ž์œ ๋กญ๊ฒŒ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค

 

๐Ÿ“Œ "์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค" 

     : ๊ตฌ์ฒด ํด๋ž˜์Šค๊นŒ์ง€ ํ•จ๊ป˜ ์˜์กดํ•œ๋‹ค๋ฉด, ๊ตฌ์ฒด ํด๋ž˜์Šค ๋ณ€๊ฒฝ์‹œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค => DIP ์œ„๋ฐ˜

    => ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค

ex) ํ• ์ธ๋ฐฉ์‹ 2์ข…๋ฅ˜ : ๊ณ ์ •ํ• ์ธ, ์ •๋ฅ ํ• ์ธ

* ์ƒˆ๋กœ์šด ํ• ์ธ์ •์ฑ…์„ ๋งŒ๋“  ํ›„ FixDiscountPolicy -> RateDiscountPolicy๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ˆœ๊ฐ„

  OrderServiceImpl๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค => OCP ์œ„๋ฐ˜

public class OrderServiceImpl implements OrderService {
	//private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
	private DiscountPolicy discountPolicy;
}

* ๋”์ด์ƒ FixDiscountPolicy์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค -> ๋‹จ์ง€ DiscountPolicy ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ์˜์กดํ•œ๋‹ค

* ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ -> ๊ตฌํ˜„์ฒด๊ฐ€ ์—†๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ• ๊นŒ? => AppConfig ๋“ฑ์žฅ

 

๐Ÿ“Œ AppConfig ๋“ฑ์žฅ <- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํฌ๊ฒŒ ์‚ฌ์šฉ ์˜์—ญ & ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑ(Configuration)ํ•˜๋Š” ์˜์—ญ์œผ๋กœ ๋ถ„๋ฆฌ

: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ๋™์ž‘ ๋ฐฉ์‹์„ ๊ตฌ์„ฑ(config)ํ•˜๊ธฐ ์œ„ํ•ด,

  ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ + ์—ฐ๊ฒฐํ•˜๋Š” ์ฑ…์ž„์„ ๊ฐ€์ง€๋Š” ๋ณ„๋„์˜ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ž => AppConfig.class

: AppConfig๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ๋™์ž‘์— ํ•„์š”ํ•œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค

: AppConfig๋Š” ์ƒ์„ฑํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ(๋ ˆํผ๋Ÿฐ์Šค)๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์ฃผ์ž…(์—ฐ๊ฒฐ)ํ•ด์ค€๋‹ค.

* ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ• ์ง€๋Š” AppConfig์—์„œ ๊ฒฐ์ •ํ•œ๋‹ค

 

public class AppConfig {
    public MemberService memberService() {
    	return new MemberServiceImpl(new MemoryMemberRepository());
    }

    public OrderService orderService() {
        return new OrderServiceImpl(new MemoryMemberRepository(),
                                    new FixDiscountPolicy());
    }
}

* OrderServiceImpl์—๋Š” MemoryMemberRepository, FixDiscountPolicy๊ฐ์ฒด์˜ ์˜์กด๊ด€๊ณ„๊ฐ€ ์ฃผ์ž…๋œ๋‹ค

* MemoryMemberRepository, FixDiscountPolicy๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,

  ๊ทธ ์ฐธ์กฐ๊ฐ’์„ OrderServiceImpl์„ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ƒ์„ฑ์ž๋กœ ์ „๋‹ฌํ•œ๋‹ค

 

public class OrderServiceImpl implements OrderService{
	
    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;

    public OrderServiceImpl(MemberRepository memberRepository, 
    			DiscountPolicy discountPolicy) {
        this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }
}

* OrderServiceImpl ์ž…์žฅ์—์„œ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค => ์˜ค์ง AppConfig์—์„œ ๊ฒฐ์ •

* ํด๋ผ์ด์–ธํŠธ์ธ OrderServiceImpl ์ž…์žฅ์—์„œ ๋ณด๋ฉด ์˜์กด๊ด€๊ณ„๋ฅผ ๋งˆ์น˜ ์™ธ๋ถ€์—์„œ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•˜์—ฌ,

   DI(Dependency Injection) == ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… == ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ผ๊ณ  ํ•œ๋‹ค

 

<์‚ฌ์šฉ์˜์—ญ>

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

* AppConfig ๊ฐ์ฒด ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค

 

 

๐Ÿ“Œ ์ตœ๋Œ€ํ•œ์˜ ์ค‘๋ณต์˜ ์ œ๊ฑฐํ•˜๊ณ , ์—ญํ• ์— ๋”ฐ๋ฅธ ๊ตฌํ˜„์ด ๋ณด์ด๋„๋ก ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค

public class AppConfig {
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(),
                                    discountPolicy());
    }
    
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
    
    public DiscountPolicy discountPolicy() {
        return new FixDiscountPolicy();
    }
}

----------- ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์ฝ”๋“œ๋งŒ์œผ๋กœ DI ์ ์šฉ---------------

 

 


 

๐Ÿ› ๏ธ ์Šคํ”„๋ง์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ

: ApplicatonContext == ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ

: ๊ธฐ์กด์—๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ AppConfig๋ฅผ ์‚ฌ์šฉํ•ด ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  DI๋ฅผ ํ–ˆ์ง€๋งŒ,

  ์ด์ œ๋ถ€ํ„ฐ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค

: ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ , ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ์Šคํ”„๋ง ๋นˆ์„ ์ฐพ์•„์„œ ์‚ฌ์šฉํ•œ๋‹ค

 

@Configuration
public class AppConfig {
    
    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }
    
}

โ˜ž @Configuration : AppConfig๋ฅผ ์„ค์ •(๊ตฌ์„ฑ)์ •๋ณด๋กœ ์‚ฌ์šฉํ•œ๋‹ค, AppConfig์—์„œ ์„ค์ •์„ ๊ตฌ์„ฑํ•œ๋‹ค

โ˜ž @Bean : @Bean์ด ์ ํžŒ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ํ˜ธ์ถœํ•ด์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•œ๋‹ค

            : ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋œ ๋นˆ => ์Šคํ”„๋ง ๋นˆ

โ˜ž ์Šคํ”„๋ง ๋นˆ : @Bean์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ๋ช…์„ ์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค

                 ex) memberService

* ์ „์—๋Š” ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ AppConfig๋ฅผ ์‚ฌ์šฉํ•ด ์ง์ ‘ ์กฐํšŒํ–ˆ๋‹ค

-> ์ด์ œ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ์Šคํ”„๋ง ๋นˆ(๊ฐ์ฒด)๋ฅผ ์ฐพ์•„์•ผํ•œ๋‹ค 

* applicationContext.getBean() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค

 

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

        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
        Member member = new Member(1L, "userA", Grade.VIP);
        memberService.join(member);
}

 

* new AnnotationConfigApplicationContext(AppConfig.class);

  -> ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผํ•œ๋‹ค

  => AppConfig.class๋ฅผ ๊ตฌ์„ฑ ์ •๋ณด๋กœ ์ง€์ •ํ–ˆ๋‹ค.