Back-End μž‘μ—…μ‹€/Spring Framework

[Spring] AppConfig λ¦¬νŒ©ν„°λ§

μ£Όλ‹ˆμ“°πŸ§‘‍πŸ’» 2021. 9. 30. 08:00
728x90
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”? μ£Όλ‹ˆν•˜λž‘μž…λ‹ˆλ‹€.

μ£Όλ‹ˆν•˜λž‘μ€ μ•žμ—μ„œ μ£Όλ¬Έ, νšŒμ›, 할인(κ³ μ • 할인)에 λŒ€ν•΄μ„œ 순수 μžλ°”λ§Œμ„ ν™œμš©ν•΄ μ—΄μ‹¬νžˆ 곡뢀λ₯Ό ν–ˆλ˜ κ²ƒμ΄μ—μš”.

μ΄λ²ˆμ—λŠ” AppCofing.javaλ₯Ό λ¦¬νŒ©ν„°λ§ ν•˜λŠ” 법에 λŒ€ν•΄μ„œ μ•Œλ €μ£Όμ…¨μ–΄μš”!

ν•¨κ»˜ 곡뢀 ν•΄ λ³΄μ‹€κ²Œμš”!

 

 

πŸ“‹ λͺ©μ°¨


01. [Spring] μŠ€ν”„λ§ 핡심 원리
02. [Spring] 쒋은 객체 μ§€ν–₯ μ„€κ³„μ˜ 5κ°€μ§€ 원칙 (SOLID)
03. 
[Spring] 객체 μ§€ν–₯ 섀계와 μŠ€ν”„λ§   
04. [Spring] OCP와 DIP κ³ λ €ν•˜κΈ°
05. [Spring] 객체 μ§€ν–₯ 원리 적용 - μƒˆλ‘œμš΄ 할인 μ •μ±… 개발
06. 
[Spring] AppConfig λ¦¬νŒ©ν„°λ§    
07. [Spring] Ioc, DI Container  
08. [Spring] μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆ 생성  
09. [Spring] 싱글톀 μ»¨ν…Œμ΄λ„ˆ  
10. [Spring] Component Scan And Auto wired Start
11. 
[Spring] μ˜μ‘΄κ΄€κ³„ μ£Όμž… 방법    
12. [Spring] Bean Life Cycle Call Back
13. 
[Spring] Bean Scope




 

 


 

πŸ“Œ AppConfig λ¦¬νŒ©ν„°λ§


μš°λ¦¬κ°€ μ•žμ—μ„œ μž‘μ„±ν•œ AppConfigλŠ” ν˜„μž¬ 쀑볡이 μžˆλŠ” μƒνƒœμ΄κ³ , 역할에 λ”°λ₯Έ κ΅¬ν˜„μ΄ 잘 보이지 μ•ŠλŠ” κ²ƒμ΄μ—μš”.

 

         πŸ‘‰ κΈ°λŒ€ν•˜λŠ” κ·Έλ¦Ό

λ°˜μ‘ν˜•

 

 

         πŸ‘‰ λ¦¬νŒ©ν„°λ§ μ „

 
package hello.core;
import hello.core.discount.FixDiscountPolicy;
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;

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

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

 

 

         πŸ‘‰ λ¦¬νŒ©ν„°λ§ ν›„

 

package hello.core;
  import hello.core.discount.DiscountPolicy;
  import hello.core.discount.FixDiscountPolicy;
  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;
  
  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();
	} 

}

μœ„μ˜ λ¦¬νŒ©ν„°λ§ 전에 μ½”λ“œμ—μ„œ 쀑볡을 μ œκ±°ν•˜κ³ , 역할에 λ”°λ₯Έ κ΅¬ν˜„μ΄ 잘 보일수 μžˆλ„λ‘ μˆ˜μ •ν•œ κ²ƒμ΄μ—μš”.

'new MemoryMemberRepository()' 이 뢀뢄에 쀑볡이 제거된 κ²ƒμ΄μ—μš”. 이제 'MemoryMemberRepository'λ₯Ό λ‹€λ₯Έ κ΅¬ν˜„μ²΄λ‘œ λ³€κ²½ν•  λ•Œ ν•œ λΆ€λΆ„λ§Œ λ³€κ²½ν•˜λ©΄ λ˜λŠ” κ²ƒμ΄μ—μš”.

 

'AppConfig'λ₯Ό 보면 μ—­ν• κ³Ό κ΅¬ν˜„ Classκ°€ ν•œ λˆˆμ— λ“€μ–΄μ˜€λŠ” κ²ƒμ΄μ—μš”. Application 전체 ꡬ성이 μ–΄λ–»κ²Œ λ˜μ–΄μžˆλŠ”μ§€ ν•œ λˆˆμ— νŒŒμ•…μ΄ κ°€λŠ₯ν•˜λ‹΅λ‹ˆλ‹€!

 

 

πŸ“Œ μƒˆλ‘œμš΄ ꡬ쑰와 할인 μ •μ±… 적용


μš°λ¦¬λŠ” λ‹€μ‹œ κ³ μ • 할인 정책을 μ •λ₯  할인 μ •μ±…μœΌλ‘œ λ³€κ²½ν•˜λŠ”λ°, 집쀑 ν•΄ 보도둝 ν•˜λŠ” κ²ƒμ΄μ—μš”.

FixDicountPolicy.javaμ—μ„œ RateDiscountPolicy.javaκ°€ μ‚¬μš©λ  수 μžˆλ„λ‘ ν•  κ²ƒμ΄μ—μš”.

 

AppConfig의 λ“±μž₯으둜 Application이 크게 μ‚¬μš© μ˜μ—­κ³Ό 객체λ₯Ό μƒμ„±ν•˜κ³ , ꡬ성(Configuration)ν•˜λŠ” μ˜μ—­μœΌλ‘œ λΆ„λ¦¬λœ κ²ƒμ΄μ—μš”.

 

 

         πŸ‘‰ μ‚¬μš©, κ΅¬μ„±μ˜ 뢄리

 

 

         πŸ‘‰ ν• μΈ μ •μ±…μ˜ λ³€κ²½

 

'FixDiscountPolicy' -> 'RateDiscountPolicy'둜 변경해도 ꡬ성 μ˜μ—­λ§Œ 영ν–₯을 λ°›λŠ” 것이고, μ‚¬μš© μ˜μ—­μ€ μ „ν˜€ 영ν–₯을 λ°›κ³  μžˆμ§€ μ•Šμ€ κ²ƒμ΄μ—μš”.

 

 

         πŸ‘‰ ν• μΈ μ •μ±… λ³€κ²½ ꡬ성 μ½”λ“œ - 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;

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();
        return new RateDiscountPolicy();
    }
}

 

'AppConfig'μ—μ„œ 할인 μ •μ±… 역할을 λ‹΄λ‹Ήν•˜λŠ” κ΅¬ν˜„μ„ 'FixDiscountPolicy'μ—μ„œ 'RateDiscountPolicy' 객체둜 λ³€κ²½ν•œ κ²ƒμ΄μ—μš”.

이제 할인 정책을 변경해도, Application ꡬ성 μ—­ν•  담당인 AppConfig만 λ³€κ²½ν•˜λ©΄ λ˜λŠ” κ²ƒμ΄μ—μš”.

λ”°λΌμ„œ Client Cod인 'OrderServiceImpl'λ₯Ό ν¬ν•¨ν•΄μ„œ μ‚¬μš© μ˜μ—­μ˜ μ–΄λ–€ Code도 λ³€κ²½ν•  ν•„μš”κ°€ μ—†λŠ” κ²ƒμ΄μ—μš”.

λ‹€λ§Œ, ꡬ성 μ˜μ—­μ€ λ‹Ήμ—°νžˆ λ³€κ²½λ˜λŠ” κ²ƒμ΄μ—μš”. ꡬ성 역할을 λ‹΄λ‹Ήν•˜λŠ” AppConfigλ₯Ό Applicationμ΄λΌλŠ” κ³΅μ—°μ˜ 기획자둜 μƒκ°ν•˜λ©΄ μ‰¬μš΄ κ²ƒμ΄μ—μš”. 곡연 κΈ°νšμžλŠ” 곡연 μ°Έμ—¬μžμΈ κ΅¬ν˜„ 객체듀을 λͺ¨λ‘ μ•Œμ•„μ•Ό ν•˜λŠ” 게 λ‹Ήμ—°ν•˜λ‹΅λ‹ˆλ‹€!

 

 

 

 

좜처 : μΈν”„λŸ° - κΉ€μ˜ν•œ κ°•μ‚¬λ‹˜μ˜ μŠ€ν”„λ§ 핡심 원리 κ°•μ˜

이 글은 κ°•μ˜ λ‚΄μš©κ³Ό κ°•μ˜ 자료λ₯Ό λ°”νƒ•μœΌλ‘œ 'μ£Όλ‹ˆν•˜λž‘'이 'μ£Όλ‹ˆν•˜λž‘' μ΄ν•΄ν•˜κΈ° 쉽기 μœ„ν•΄ μž‘μ„±ν•œ λ‚΄μš© μž„μ„ μ•Œλ €λ“œλ¦½λ‹ˆλ‹€.

 

 

 





μ£Όλ‹ˆν•˜λž‘μ˜ 글이 λ§ˆμŒμ— λ“œμ…¨λ‚˜μš”? ꡬ독과 곡감! 그리고, λŒ“κΈ€ 그리고 λ°©λͺ…둝은 μ£Όλ‹ˆν•˜λž‘μ—κ²Œ λ§Žμ€ 힘이 λ©λ‹ˆλ‹€.

728x90
λ°˜μ‘ν˜•