๐ 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๋ ์๋ ๊ตฌ์กฐ์ฒ๋ผ ๊ตฌ์ฑ๋๋ค.
- ๋จผ์ ๋น์ฆ๋์ค ๋ก์ง ์๋น์ค๋ค์ ๋ง๋ ๋ค.
- ์ด ๋, ์๋น์ค๋ ์ฑ๊ธํค์ผ๋ก ํ์ฑ๋๋ค.
- ๋ชจ๋๋ค์ ํตํด ์๋น์ค๋ฅผ ์ปจํธ๋กค๋ฌ์ ์ฃผ์ ํ๋ค. (AppConfig์ ๋น์ทํ๋ค. ์๋น์ค์ ๋ํ ์์กด๊ด๊ณ๋ฅผ ํด๊ฒฐํด์ค๋ค.)
- ๋ง์ฝ ์ปจํธ๋กค๋ฌ์์ ํน์ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ฉด, ์ง์ ๊ฐ์ฒด๋ฅผ ํ์ฑํ์ง ์๊ณ , ๋ชจ๋์ด ์์ฑํด์ค ๊ฐ์ฒด๋ฅผ ํตํด ์ฌ์ฉํ๋ค.
- ๋ง์ฝ ๋๋ฉ์ธA์์ ๋๋ฉ์ธB์ ๋ํด ์ฌ์ฉํด์ผ ํ๋ค๋ฉด - ์์กดํด์ผํ๋ค๋ฉด - ๋๋ฉ์ธB์ ๋ชจ๋์ importํด์จ๋ค.
- ๋๋ฉ์ธ B์ ๋ชจ๋์ importํจ์ผ๋ก์ ์ด ๋ชจ๋์ด ๊ด๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ์ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ( ์์กดํ ์ ์๋ค )
๊ทธ๋ ๋ค๋ฉด Spring์์๋ ์ด๋ป๊ฒ ๋น๋ค์ ์์กด๊ด๊ณ๋ฅผ ํด๊ฒฐํ ๊น??
์์ง ๊น๊ฒ ๊ณต๋ถํ์ง ์์์ง๋ง Nest์ ๊ฐ ์ปดํฌ๋ํธ๋ค์ ์์ํ๋ Spring ์ปดํฌ๋ํธ๋ค์ ์๋์ ๊ฐ๋ค.
NestJS | Spring |
Module | ApplicationContext |
Controller | Spring MVC Controller ํด๋์ค |
Service | Business Layer ํด๋์ค |
์๋ ์ํ์ค๋ฅผ ํตํด ๋น์ ๋ฑ๋กํ๊ณ ๊ฐ ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํด์ค๋ค.
- ์คํ๋ง ์ปจํ ์ด๋ ์์ฑ
- ์คํ๋ง ๋น ๋ฑ๋ก
- ์คํ๋ง ๋น ์์กด๊ด๊ณ ์ค์
๊ทธ๋ ๋ค๋ฉด ์ค์ ๋ก ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ์ด๋ป๊ฒ ๋น ์์กด๊ด๊ณ๋ฅผ ํด๊ฒฐํ๋์ง ๋ณด์.

๋ฑ๋ก
- ์ปจํ
์ด๋ ํด๋์ค ์์
@Configuration
์ด๋ ธํ ์ด์ ์ ๋ถ์ธ๋ค.
@Configuration public class AppConfig { .. }
- ๋ฑ๋กํ ๋น์ ๋ฐํํด์ค ๋ฉ์๋ ์์
@Bean
์ด๋ ธํ ์ด์ ์ ๋ถ์ธ๋ค.
@Bean public MemberService memberService() { .. }
- ๋ฐํํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
- AppConfig๊ฐ ์กฐํํ ๋น์ ๋ํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํด์ค๋ค.
// ์์ฑ์ ์ฃผ์ ์ ๊ด๋ จ๋ ๋ฉ์๋๋ ๊ฐ ํ๋์ด ๋๋ ทํ ๋ณด์ด๊ฒ ๋ฆฌํฉํ ๋งํ๋๋ก ํ๋ค. @Bean public static MemoryMemberRepository memberRepository() { return new MemoryMemberRepository(); }
โ ์ด๋ก ์ธํด ์๋น์ค๊ฐ ํธ์ถ ์, ์ด๋ค ํน์ ๊ฐ์ฒด๋ฅผ ์์กดํ์ง ์๊ฒ ํจ.
โ ์ฆ, ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ์ปจํธ๋กค๋ฌ์ ์๋น์ค ๊ฐ์ ์ง์ ์ ์ธ ์์กด๊ด๊ณ๋ฅผ ๋์ด๋
์ฌ์ฉ
MemberApp.java
์์ApplicationContext
์ธํฐํ์ด์ค ๊ตฌํ์ฒด๋ฅผ ์์ฑํ์ฌ ์ปจํ ์ด๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.AnnotationConfigApplicationContext
ํด๋์ค๋ฅผ ํตํด ์์ฑํ๋ค.- ์ด ๊ฐ์ฒด๋ก๋ถํฐ ๋น์ ์กฐํํ๋ค.
- ๋ฑ๋กํ ๋น์ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ
getBean
ํจ์๋ฅผ ํตํด ๋น ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค. - ์ด๋ฆ์ ๋ฑ๋ก ์์ ๋ค๋ฅด๊ฒ ํ ์ ์๋ค.
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()); } }