๐Ÿƒ Spring Boot

Container / Bean DI(IoC)

date
Jan 30, 2024 09:26 AM
slug
Container-Bean DI(IoC)
author
category
๐Ÿƒ Spring Boot
status
Public
tags
Basics
summary
type
Post
thumbnail
updatedAt
Jan 30, 2024 09:53 PM

๋ฌด์—‡์„ ๊ณต๋ถ€ํ•˜์˜€๋Š”๊ฐ€ ๐Ÿค”


NestJS์—์„œ์˜ Module์„ ์‚ฌ์šฉํ•˜์—ฌ Controller์™€ Service ๊ฐ„์˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ํ•ด๊ฒฐ๊ณผ
Spring์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•œ ๋นˆ๋“ค๊ฐ„์˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ํ•ด๊ฒฐ๊ณผ ๋‹ค๋ฅธ ๊ฒƒ ๊ฐ™๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด NestJS์—์„œ๋Š” Providers ์ฃผ์ž…์„ ์–ด๋–ป๊ฒŒ ํ•œ๋‹ค๋Š” ๊ฑฐ์ง€? ๐Ÿ˜’ ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, NestJS๋Š” ์•„๋ž˜ ๊ตฌ์กฐ์ฒ˜๋Ÿผ ๊ตฌ์„ฑ๋œ๋‹ค.
  1. ๋จผ์ € ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์„œ๋น„์Šค๋“ค์„ ๋งŒ๋“ ๋‹ค.
    1. ์ด ๋•Œ, ์„œ๋น„์Šค๋Š” ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ํ˜•์„ฑ๋œ๋‹ค.
  1. ๋ชจ๋“ˆ๋“ค์„ ํ†ตํ•ด ์„œ๋น„์Šค๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์— ์ฃผ์ž…ํ•œ๋‹ค. (AppConfig์™€ ๋น„์Šทํ•˜๋‹ค. ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์˜์กด๊ด€๊ณ„๋ฅผ ํ•ด๊ฒฐํ•ด์ค€๋‹ค.)
  1. ๋งŒ์•ฝ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํŠน์ • ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ํ˜•์„ฑํ•˜์ง€ ์•Š๊ณ , ๋ชจ๋“ˆ์ด ์ƒ์„ฑํ•ด์ค€ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  1. ๋งŒ์•ฝ ๋„๋ฉ”์ธA์—์„œ ๋„๋ฉ”์ธB์— ๋Œ€ํ•ด ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด - ์˜์กดํ•ด์•ผํ•œ๋‹ค๋ฉด - ๋„๋ฉ”์ธB์˜ ๋ชจ๋“ˆ์„ importํ•ด์˜จ๋‹ค.
    1. ๋„๋ฉ”์ธ B์˜ ๋ชจ๋“ˆ์„ importํ•จ์œผ๋กœ์„œ ์ด ๋ชจ๋“ˆ์ด ๊ด€๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์™€ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ( ์˜์กดํ•  ์ˆ˜ ์žˆ๋‹ค )
 
๊ทธ๋ ‡๋‹ค๋ฉด Spring์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋นˆ๋“ค์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ํ•ด๊ฒฐํ• ๊นŒ??
์•„์ง ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ Nest์˜ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋“ค์— ์ƒ์‘ํ•˜๋Š” Spring ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
NestJS
Spring
Module
ApplicationContext
Controller
Spring MVC Controller ํด๋ž˜์Šค ๋ผ๊ณ ๋Š” ํ•˜๋Š”๋ฐโ€ฆ๊ฐ•์˜์ƒ์œผ๋กœ๋Š” ๊ทธ์ € ํด๋ž˜์Šค๋กœ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Œ
Service
Business Layer ํด๋ž˜์Šค ๋ผ๊ณ ๋Š” ํ•˜๋Š”๋ฐโ€ฆ๊ฐ•์˜ ์ƒ์œผ๋กœ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค๋กœ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Œ
์•„๋ž˜ ์‹œํ€€์Šค๋ฅผ ํ†ตํ•ด ๋นˆ์„ ๋“ฑ๋กํ•˜๊ณ  ๊ฐ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์ค€๋‹ค.
  1. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
  1. ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก
  1. ์Šคํ”„๋ง ๋นˆ ์˜์กด๊ด€๊ณ„ ์„ค์ •
 
๊ทธ๋ ‡๋‹ค๋ฉด ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ์–ด๋–ป๊ฒŒ ๋นˆ ์˜์กด๊ด€๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ๋ณด์ž.
notion image
๋“ฑ๋ก
  1. ์ปจํ…Œ์ด๋„ˆ ํด๋ž˜์Šค ์•ž์— @Configuration์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.
    1. @Configuration public class AppConfig { .. }
  1. ๋“ฑ๋กํ•  ๋นˆ์„ ๋ฐ˜ํ™˜ํ•ด์ค„ ๋ฉ”์„œ๋“œ ์•ž์— @Bean ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค.
    1. @Bean public MemberService memberService() { .. }
  1. ๋ฐ˜ํ™˜ํ•  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    1. // ์ƒ์„ฑ์ž ์ฃผ์ž…์— ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋Š” ๊ฐ ํ–‰๋™์ด ๋šœ๋ ทํžˆ ๋ณด์ด๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•˜๋„๋ก ํ•œ๋‹ค. @Bean public static MemoryMemberRepository memberRepository() { return new MemoryMemberRepository(); }
    2. AppConfig๊ฐ€ ์กฐํšŒํ•œ ๋นˆ์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์ค€๋‹ค.
      1. โ‡’ ์ด๋กœ ์ธํ•ด ์„œ๋น„์Šค๊ฐ€ ํ˜ธ์ถœ ์‹œ, ์–ด๋–ค ํŠน์ • ๊ฐ์ฒด๋ฅผ ์˜์กดํ•˜์ง€ ์•Š๊ฒŒ ํ•จ.
        โ‡’ ์ฆ‰, ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ์™€ ์„œ๋น„์Šค ๊ฐ„์˜ ์ง์ ‘์ ์ธ ์˜์กด๊ด€๊ณ„๋ฅผ ๋Š์–ด๋ƒ„
์‚ฌ์šฉ
  1. MemberApp.java์—์„œ ApplicationContext์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
    1. AnnotationConfigApplicationContextํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•œ๋‹ค.
    2. ์ด ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋นˆ์„ ์กฐํšŒํ•œ๋‹ค.
  1. ๋“ฑ๋กํ•œ ๋นˆ์˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ getBeanํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋นˆ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
    1. ์ด๋ฆ„์€ ๋“ฑ๋ก ์‹œ์— ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
AppConfig
package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; 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 { /* MemberService๊ฐ€ ์ง์ ‘ ์–ด๋–ค ๊ตฌํ˜„์ฒด๋ฅผ ์„ค์ • X * :: AppConfig๊ฐ€ ๊ทธ ์—ญํ•  ํ• ๋‹น์„ ํ•ด์ฃผ์ž * ==> "์ƒ์„ฑ์ž ์ฃผ์ž…" * */ @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } // ์ƒ์„ฑ์ž ์ฃผ์ž…์— ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋Š” ๊ฐ ํ–‰๋™์ด ๋šœ๋ ทํžˆ ๋ณด์ด๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•˜๋„๋ก ํ•œ๋‹ค. @Bean public static MemoryMemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } // ํ• ์ธ์ •์ฑ…์— ๋Œ€ํ•ด ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ๋ฉ”์„œ๋“œ ํ•œ ์ค„๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค. @Bean public DiscountPolicy discountPolicy(){ // return new FixDiscountPolicy(); return new RateDiscountPolicy(); } }
MemberApp.java
package hello.core; import hello.core.member.Grade; import hello.core.member.Member; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class MemberApp { public static void main(String[] args) { // 1. // MemberService memberService = new MemberServiceImpl(); // 2. // AppConfig appConfig = new AppConfig(); // MemberService memberService = appConfig.memberService(); ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = applicationContext.getBean("memberService", MemberService.class); /* member์ƒ์„ฑํ•˜๊ณ  join*/ 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()); } }
 

์–ด๋–ป๊ฒŒ ์“ฐ๋Š”๊ฐ€ โ˜๏ธ


 
 

์™œ ์“ฐ๋Š”๊ฐ€ โ“


 
 

๋ ˆํผ๋Ÿฐ์Šค ๐Ÿ”