๐ŸƒSpring ํ•ต์‹ฌ ์›๋ฆฌ

ํ•ต์‹ฌ์›๋ฆฌ ์‹œ๋ฆฌ์ฆˆ

4 minute read

๊ทธ๋™์•ˆ Node.js, Nest.js, Django ๋“ฑ ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ณต๋ถ€ํ•ด์™”์ง€๋งŒ ์Šคํ”„๋ง์ด ๊ฐ€์ง€๋Š” ์ฐจ๋ณ„์ ์€ ๋ฌด์—‡์ผ๊นŒ? ์šฐ์„  ๋น„๊ต์˜ ์œ„์ƒ ์ž์ฒด๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค. ๋‚˜์—ดํ•œ ์œ„ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์€ Spring MVC์™€ ๋น„๊ต๋˜์–ด์•ผ ํ•  ๋…€์„๋“ค์ด๊ณ ,

์Šคํ”„๋ง์˜ ๋ณธ์งˆ์€

์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

์ด๋‹ค.

๊ตฌ์ฒด์ ์ธ ์˜ˆ๋กœ ๋ฐ”๋กœ ๋“ค์–ด๊ฐ€๋ณด์ž.

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

์ด ์ฝ”๋“œ๋Š” ๋‹คํ˜•์„ฑ์„ ์ด์šฉํ•ด์„œ(๊ทธ๊ฒƒ๋„ ์ „๋žต ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ) switch~case๋ฌธ์„ ๋Œ€์ฒดํ•˜์˜€๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ด์ •๋„๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๋งŒ์กฑ์Šค๋Ÿฌ์›Œ ํ–ˆ์ง€๋งŒ, ์ •์ฑ…์ด ๋ณ€ํ• ๋•Œ๋Š” ์ฃผ์„์ฒ˜๋ฆฌํ•œ ๋ผ์ธ์ฒ˜๋Ÿผ ๋ถ„๋ช…ํžˆ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ์ˆ˜์ •์ด ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์ถ”์ƒํ™”(interface)์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๊ตฌ์ฒดํ™”(RateDiscountPolicy)์— ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. SOLID ์›์น™ ์ค‘ DIP๋ฅผ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค. ๋˜ํ•œ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š”๋ฐ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•˜๋‹ค. ์„ธํŠธ์ธ OCP ๋˜ํ•œ ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค.

โ€œQuestionโ€
Multimode framework๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ(TODO: ํ•˜์ดํผ๋งํฌ), ์ถ”์ƒํ™” ๋ ˆ๋ฒจ์—์„œ ์˜์กด๊ด€๊ณ„๊ฐ€ ๋ชจ๋‘ ์ •์˜๋˜๊ณ  RAT๋ณ„ ๊ตฌํ˜„์ฒด์—์„œ๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ตฌ์ฒด์ ์ธ RAT์— ํ•ด๋‹นํ•˜๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋„ฃ์–ด์คฌ์—ˆ๋‹ค(bridge ํŒจํ„ด์ด๋ผ๊ณ  ์ฃผ์žฅํ–ˆ์—ˆ๋‹ค). ์‹ค์ œ ํ˜ธ์ถœ์€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜ํ•ด IoC ํ˜•ํƒœ๋กœ ์ถ”์ƒํ™” ๋ ˆ๋ฒจ์—์„œ ์ด๋ฃจ์–ด์ง„๋‹ค. ๋‹ค๋งŒ ๊ตฌํ˜„์ฒด๋Š” RAT specificํ•œ ๊ตฌํ˜„๋ถ€๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ์˜์กด๊ด€๊ณ„์— ์žˆ๋Š” ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•˜์—ฌ ๋กœ์ง์„ ์ž‘์„ฑํ•œ๋‹ค. ๊ณผ์—ฐ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์„ ์ฐธ์กฐํ•˜์—ฌ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•œ๊ฐ€? ์–ด๋– ํ•œ ์ œํ’ˆ๊ตฐ(LTE, 5G ๋“ฑ)์ด ์žˆ์„๋•Œ, ์ œํ’ˆ๊ตฐ ๋‚ด์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ๊ตฌํ˜„์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ผ๊นŒ?(๋ฌธ์žฅ์ด์ƒํ•˜๋‹ค ์ •๋ฆฌํ•˜์ž. ๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ๋‚˜์ค‘์— ์ •๋ฆฌํ•˜์ž๊ณ ํ•˜๋ฉด ์ž˜์•ˆ๋˜๋”๋ผ. ๊ทธ๋•Œ๊ทธ๋•Œ ์ง‘์ค‘ํ•ด์„œ ์ •๋ฆฌํ•ด์•ผํ•œ๋‹ค)

๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ DIP ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ธ๊ฐ€? (์‚ฌ์‹ค ์ด๋ฆ„์— ๋‹ต์ด ์žˆ๋‹ค)

public class OrderServiceImpl implements OrderService {  
      private DiscountPolicy discountPolicy;  
  
		public OrderServiceImpl(DiscountPolicy discountPolicy) {  
			this.discountPolicy = discountPolicy;  
		}  
}  

์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณณ์—์„œ ์ ์ ˆํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  ServiceImpl์€ ์ธํ„ฐํŽ˜์ด์Šค ํ˜•ํƒœ๋กœ ๋ฐ›์•„์„œ ์‚ฌ์šฉ์„ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค. ์ด๋Š” ๋น„๋‹จ ์Šคํ”„๋ง๋งŒ์˜ ํ•ด๊ฒฐ๋ฐฉ์‹์€ ์•„๋‹ˆ๋ฉฐ C++์—์„œ๋„ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์˜ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์—ด์‹ฌํžˆ ๊ตฌํ˜„์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์ „๋‹ฌํ•ด์„œ, ์œ„์™€ ๊ฐ™์€ ํ•ด๊ฒฐ์„ ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์Šคํ”„๋ง์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์„ธ๋ จ๋œ ๋ฌธ์ œํ•ด๊ฒฐ์„ ๋ณด์—ฌ์ค„ ๊ฒƒ์ธ๊ฐ€?

์šฐ์„  ์Šคํ”„๋ง์—์„œ๋Š” ๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•˜์—ฌ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋ฅผ ์ด์šฉํ•œ๋‹ค. ๊น€์˜ํ•œ๋‹˜์˜ ๋น„์œ ์— ๋”ฐ๋ฅด๋ฉด ๊ฐ์ฒด์ง€ํ–ฅ์˜ ๋‹คํ˜•์„ฑ์€ ๋กœ๋ฏธ์˜ค์™€ ์ค„๋ฆฌ์—ฃ์ด๋ผ๋Š” ๋Œ€๋ณธ์ด ์žˆ์„๋•Œ ๊ฐ ๋ฐฐ์—ญ์— ์–ด๋–ค ๋ฐฐ์šฐ๊ฐ€ ์บ์ŠคํŒ…๋˜๋”๋ผ๋„ ์ „์ฒด ๊ทน์˜ ๋‚ด์šฉ์€ ๋ณ€ํ•จ์ด ์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด๊ณ , ์—ฌ๊ธฐ์„œ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๋ž€ ๋ฐฐ์—ญ์— ๋Œ€ํ•œ ์บ์ŠคํŒ…์„ ๋ณ„๋„์˜ ์—ญํ• ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์ƒ๊ฐํ•˜์ž๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ๊ณต์—ฐ๊ธฐํš์ž์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

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

AppConfig๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ๋™์ž‘์— ํ•„์š”ํ•œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋Š” SOLID ์›์น™ ์ค‘ SRP์™€๋„ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค. ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์ฒ˜๋ฆฌ์™€ ์˜์กด๊ด€๊ณ„ ์„ค์ •์ด๋ผ๋Š” ๋‘ ๊ฐœ์˜ ์ฑ…์ž„์„ ๋‘ ๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค.

โ€œQuestionโ€
ํ•จ์ˆ˜๋ช…์„ ๊ฐ์ฒด๋ช…์œผ๋กœ ์“ฐ๋Š” ๊ฒƒ์ด ๋งž๋Š”๊ฒƒ์ธ๊ฐ€?

๋˜ํ•œ ๊ณต์—ฐ๊ธฐํš์ž๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์ž…๋ ฅ(์ฃผ์ž…)๋ฐ›๋Š”๋‹ค. ์ด๋ฅผ ํ†ตํ•ด์„œ ์„œ๋น„์Šค ๊ตฌํ˜„์ฒด๋Š” ๊ตฌ์ฒด์ ์ธ ์ •์ฑ…์„ ๋ชจ๋ฅด๊ณ ๋„ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

public static void main(String[] args) {  
          AppConfig appConfig = new AppConfig();  
          MemberService memberService = appConfig.memberService();  
          Member member = new Member(1L, "memberA", Grade.VIP);  
          memberService.join(member);  
}  

ํด๋ผ์ด์–ธํŠธ(MemberServiceImpl) ์ž…์žฅ์—์„œ ์˜์กด์„ฑ์ด ์™ธ๋ถ€์—์„œ โ€˜์ฃผ์ž…โ€™๋œ๋‹ค๊ณ  ํ•˜์—ฌ, ์ด๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž…(Dependancy Injection)์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ DL(Dependancy Lookup)์ด ์žˆ๋‹ค. ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์ง€ ์•Š๊ณ  ์ฐพ๊ธฐ๋งŒ ํ•˜๋Š” ๊ฐœ๋…์ธ๋ฐ, ๋’ค์— ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์—์„œ ์†Œ๊ฐœ๋  ๊ฒƒ์ด๋‹ค.

TODO : 38 PAGE ๊ทธ๋ฆผ ๊ทธ๋ ค๋„ฃ๊ธฐ

AppConfig์˜ ๋“ฑ์žฅ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํฌ๊ฒŒ ์‚ฌ์šฉ ์˜์—ญ๊ณผ, ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ์„ฑ(Configuration)ํ•˜๋Š” ์˜์—ญ์œผ๋กœ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค. ์ด์ œ ์Šฌ์Šฌ ์Šคํ”„๋ง์€ ์„ธํŒ…ํ•˜๋Š”๊ฒŒ ๋„ˆ๋ฌด ๋ณต์žกํ•ด๋ผ๊ณ  ์–ธ๋œป์–ธ๋œป ๋“ค์—ˆ๋˜ ์ด์•ผ๊ธฐ๊ฐ€ ๊ธฐ์–ต๋‚˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ์ ์  ์• ๋…ธํ…Œ์ด์…˜๋„ ์‚ฌ์šฉํ•˜๊ณ  ์ตœ๋Œ€ํ•œ ํŽธํ•ด์ง€๋ ค๊ณ  ๋…ธ๋ ฅํ•˜์ง€๋งŒ ๋ณธ์งˆ์€ ์˜์กด๊ด€๊ณ„๊ฐ€ ์„ค์ •์—์„œ ์ด๋ฏธ ์ •์˜๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ž˜์ƒ๊ฐํ•ด๋ณด๋ฉด ์•„์ง ์Šคํ”„๋ง์€ ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š์•˜๋‹ค. ์Šคํ”„๋ง์˜ ์ฃผ์š”๊ธฐ๋Šฅ์ธ DI๋ฅผ java๋กœ ๊ตฌํ˜„ํ–ˆ์„๋ฟ์ด๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ์ง„์งœ๋กœ ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•ด๋ณด๋„๋ก ํ•˜์ž.

@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์— ์• ๋…ธํ…Œ์ด์…˜(@๊ฐ€ ๋ถ™์€ ํ‚ค์›Œ๋“œ)์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค. ์• ๋…ธํ…Œ์ด์…˜์€ C++์—์„œ ํ•˜๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ถ€๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด์„œ ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ์• ๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋ฌธ๋ฒ•๊ณผ ๊ตฌํ˜„์€ ๋‹ค๋ฅธ ๊ธ€์„ ํ†ตํ•ด ์ •๋ฆฌํ•˜๋ ค ํ•œ๋‹ค.

K๊ต์ˆ˜์˜ ๊ฐ์ฒด์ง€ํ–ฅ ์ด์•ผ๊ธฐ ์ฑ…์„ ๋ณด๋ฉด ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋„ค๊ฐ€์ง€ ์š”์†Œ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ, ๊ทธ ์ค‘ ์ƒ์†Œํ•œ ๊ฐœ๋…์ธ ๊ณต๋ฆฌ(axiom)์ด ์žˆ๋‹ค. ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ช…์‹œ๋ฅผ ๋งํ•˜๋Š”๋ฐ ์ฑ…์—์„œ๋Š” ์ด๋ฅผ ๊ตฌํ˜„ํ•  ๋ฌธ๋ฒ•์ ์ธ ์š”์†Œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„์‹œ ์ด๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋‚˜์™€์žˆ์ง€๋งŒ, ์• ๋…ธํ…Œ์ด์…˜์ด ์ด๋Ÿฐ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

@Configuration์— ์˜ํ•ด ๊ณต์—ฐ๊ธฐํš์˜ ์ฃผ์ฒด๋Š” Spring Container๊ฐ€ ๋˜๊ณ , ๊ณต์—ฐ์˜ ๊ฐ์ฒด๋Š” @Bean์— ์˜ํ•ด ์ •์˜๋œ๋‹ค.

๋˜ํ•œ AppConfig๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

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);  
}  

โ€œQuestionโ€
getBean()์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด์ž. ๋งˆ์น˜ ์œ ๋‹ˆํ‹ฐ ๊ฒŒ์ž„์—”์ง„์—์„œ getGameObject()๋กœ ๋ฌธ์ž์—ด์„ ํ†ตํ•ด ๋‹ค๋ฅธ ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ๋ฅผ ์–ป์–ด์˜ค๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค. ๋ฌผ๋ก  ์Šคํ”„๋ง์ด ์˜ค๋ฆฌ์ง€๋„์ด๊ฒ ์ง€๋งŒ. ๊ณผ์—ฐ ์ด ๋ฐฉ์‹์€ ํ›Œ๋ฅญํ•œ ๊ฒƒ์ธ๊ฐ€? ์–ด๋–ค Bean์ด๋“  ๋ฌธ์ž์—ด์ด๋‚˜ ํƒ€์ž…์„ ํ†ตํ•ด ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ธ๊ฐ€? Bean ์ž…์žฅ์—์„œ ์ž์‹ ์„ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ํŠน์ • ๊ฐ์ฒด๋กœ ์ œํ•œํ•ด์•ผํ•˜์ง€ ์•Š์„๊นŒ?

๋‚˜์ค‘์— ๋‚˜์˜ฌ ๋‚ด์šฉ์œผ๋กœ ์ƒ์„ฑ์ž๋กœ ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ์ธ์ž๋กœ ๋ฐ›์œผ๋ฉด @Autowired๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง์ด ๋„ฃ์–ด์ฃผ๋Š” ๋‚ด์šฉ์ด ์žˆ๋‹ค. ์ƒ์„ฑ์ž ์ธ์ž๋Š” ์š”๊ตฌ์‚ฌํ•ญ์ด๋ผ๊ณ  ํ• ๋•Œ, ์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์—ฌ์ง€๊ฐ€ ์žˆ์„๊นŒ?

์„ค์ •์˜ ๋ฐฉ์‹์€ XML์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์• ๋…ธํ…Œ์ด์…˜(AnnotationConfigApplicationContext)์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ํ›„์ž๊ฐ€ ํ˜„์žฌ๋Š” ์ ˆ๋Œ€์ ์ธ ๋Œ€์„ธ์ด๋ฏ€๋กœ ์•ž์œผ๋กœ ์ด ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค.

โ€œXML ๋ฐฉ์‹โ€
XML ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์ด GenericXmlApplicationContext๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋ฐฉ์‹์€ ์ปดํŒŒ์ผ์—†์ด๋„ ์˜์กด๊ด€๊ณ„๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์•„์ฃผ ํฐ ์žฅ์ ์ด ์žˆ์ง€๋งŒ ์•„๋ž˜์—์„œ ๋ณด๋“ฏ ์ž‘์„ฑ์ด ๊ท€์ฐฎ๋‹ค. ๋˜ํ•œ working code๋ฅผ ์ค‘์š”์‹œํ•˜๋Š” ์• ์ž์ผ ๋ฌธํ™” ์†์—์„œ ์ด ๋ฐฉ์‹์€ ์• ๋…ธํ…Œ์ด์…˜์—๊ฒŒ ๋ฐ€๋ ค๋ฒ„๋ฆฌ๊ณ  ๋ง์•˜๋‹ค. ์•„์ง ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ๊ฑฐ์‹œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์•Œ์•„๋Š” ๋‘์ž.

ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");  
<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://  
  www.springframework.org/schema/beans/spring-beans.xsd">  
      <bean id="memberService" class="hello.core.member.MemberServiceImpl">  
          <constructor-arg name="memberRepository" ref="memberRepository" />  
      </bean>  
</beans>  

์ด์ œ ๋‹ค์Œ๊ธ€(TODO:LINK)์—์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์™€ Bean์˜ ๋‚ด๋ถ€๊ตฌ์กฐ ๋ฐ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์ตํ˜€๋ณด๋„๋ก ํ•˜์ž.