Search

[springboot] μŠ€ν”„λ§ μž…λ¬Έ - 4. μŠ€ν”„λ§ 빈과 μ˜μ‘΄κ΄€κ³„

νƒ€μž…
μŠ€ν„°λ””
νƒœκ·Έ
springboot
μƒνƒœ
Published
생성일
2022/07/22 09:44
μ΅œμ’… νŽΈμ§‘ μΌμ‹œ
2023/02/27 03:14
μƒμœ„ ν•­λͺ©
1 more property

μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”κ³Ό μžλ™ μ˜μ‘΄κ΄€κ³„ μ„€μ •

μŠ€ν”„λ§ 빈(Spring Bean)

Spring μ»¨ν…Œμ΄λ„ˆκ°€ κ΄€λ¦¬ν•˜λŠ” μžλ°” 객체이닀.
순수 μžλ°” λ¬Έλ²•μœΌλ‘œ μƒμ„±ν•œ κ°μ²΄λŠ” μŠ€ν”„λ§ 빈이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—, μŠ€ν”„λ§ 빈으둜 등둝을 ν•΄μ•Ό Spring μ»¨ν…Œμ΄λ„ˆκ°€ 인식할 수 μžˆλ‹€.

μŠ€ν”„λ§ λΉˆμ„ λ“±λ‘ν•˜λŠ” 2가지 방법

1.
μ–΄λ…Έν…Œμ΄μ…˜μ„ ν™œμš©ν•œ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”κ³Ό Autowired μ„€μ •
2.
μžλ°” μ½”λ“œλ‘œ 직접 μŠ€ν”„λ§ 빈 λ“±λ‘ν•˜κΈ°
μ „λ°˜μ μΈ 흐름을 μ•„λž˜μ™€ κ°™λ‹€.
memberController μ—μ„œλŠ” memberService 객체λ₯Ό μ‚¬μš©ν•΄μ•Όν•˜κ³ ,
memberService μ—μ„œλŠ” memberRepository 객체λ₯Ό μ‚¬μš©ν•΄μ•Όν•œλ‹€.
λ”°λΌμ„œ memberController κ°€ 생성될 λ•Œ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ—μ„œ memberController 에 memberService 객체λ₯Ό μ£Όμž…ν•΄μ£Όκ³ ,
memberService κ°€ 생성될 λ•ŒλŠ” memberService 에 memberRepository 객체λ₯Ό μ£Όμž…ν•΄μ€€λ‹€.
μš°μ„ μ€ 1. μ–΄λ…Έν…Œμ΄μ…˜μ„ ν™œμš©ν•œ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”κ³Ό Autowired μ„€μ • λ°©λ²•μœΌλ‘œ μŠ€ν”„λ§ λΉˆμ„ λ“±λ‘ν•˜λŠ” 방법을 μ•Œμ•„λ³΄μž.
controller νŒ¨ν‚€μ§€μ—μ„œ MemberController을 μƒμ„±ν•œλ‹€.
MemberController μ—μ„œλŠ” memberService λ₯Ό μ£Όμž…λ°›μ•„μ•Ό ν•œλ‹€.
controller/MemberController.java
@Controller // @Controller μ–΄λ…Έν…Œμ΄μ…˜μ΄ 있으면 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ ν•΄λ‹Ή 컨트둀러λ₯Ό μƒμ„±ν•΄μ„œ κ΄€λ¦¬ν•΄μ€Œ public class MemberController { private final MemberService memberService; @Autowired // @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ— μ˜ν•΄ μŠ€ν”„λ§μ΄ memberService λ₯Ό κ°€μ Έλ‹€κ°€ μ»¨νŠΈλ‘€λŸ¬μ— μ—°κ²°ν•΄μ€Œ public MemberController(MemberService memberService) { this.memberService = memberService; } }
Java
볡사
Β @Controller μ–΄λ…Έν…Œμ΄μ…˜μ„ λ‹¬μ•„μ€˜μ•Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μŠ€ν”„λ§ 빈으둜 λ“±λ‘λœλ‹€.
Β @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ„ μƒμ„±μž μœ„μ— 달아주면, ν•΄λ‹Ή 객체가 생성될 λ•Œ 인자둜 λ“€μ–΄μ˜€λŠ” μŠ€ν”„λ§ 빈 객체λ₯Ό μ˜μ‘΄μ„± μ£Όμž… μ‹œμΌœμ€€λ‹€.
β‡’ MemberController 객체가 생성될 λ•Œ μŠ€ν”„λ§ 빈으둜 λ“±λ‘λœ memberService 객체가 μ˜μ‘΄μ„± μ£Όμž…λ¨
️ 그런데 memberService μ•„λž˜μ— λΉ¨κ°„ 쀄이 쳐져 μžˆλ‹€. μ΄μœ λŠ” MemberService λŠ” ν˜„μž¬ μŠ€ν”„λ§ λΉˆμ— 등둝 μ•ˆ 된 μˆœμˆ˜ν•œ μžλ°” 클래슀 이기 λ•Œλ¬Έμ΄λ‹€. (μ•„λž˜ μ½”λ“œ μ°Έκ³ )
ν˜„μž¬ MemberService ν΄λž˜μŠ€λŠ” μŠ€ν”„λ§ λΉˆμ— 등둝이 μ•ˆ 된 μˆœμˆ˜ν•œ μžλ°” ν΄λž˜μŠ€μž„
MemberService 클래슀 μœ„μ— @Service μ–΄λ…Έν…Œμ΄μ…˜μ„ 달아주면 MemberService κ°€ μŠ€ν”„λ§ λΉˆμ— λ“±λ‘λœλ‹€.
λ˜ν•œ MemberService μ—μ„œλŠ” memberRepository λ₯Ό μ£Όμž…λ°›μ•„μ•Ό ν•˜λ―€λ‘œ MemberService μƒμ„±μžμ— @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ„ 달아쀀닀.
service/Memberservice.java
@Service public class MemberService { // ν…ŒμŠ€νŠΈμ½”λ“œμ—μ„œ μ˜μ‘΄μ„± μ£Όμž…(DI) λ°›κΈ° μœ„ν•¨ private final MemberRepository memberRepository; // μƒμ„±μž @Autowired // MemberService 객체λ₯Ό 생성할 λ•Œ, memberRepository μ˜μ‘΄μ„± μ£Όμž… public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } // μƒλž΅ .. }
Java
볡사
Β @Service @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ„ 달아쀀닀.
Β @Service μ–΄λ…Έν…Œμ΄μ…˜μ„ λ‹¬μ•„μ€˜μ•Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μŠ€ν”„λ§ 빈으둜 λ“±λ‘λœλ‹€.
λ§ˆμ§€λ§‰μœΌλ‘œ MemberRepository 의 κ΅¬ν˜„μ²΄μΈ MemoryMemberRepository.java νŒŒμΌμ—λ„ μ–΄λ…Έν…Œμ΄μ…˜μ„ 달아쀀닀.
@Repository public class MemoryMemberRepository implements MemberRepository{ // μƒλž΅ .. }
Java
볡사
μ—¬κΈ°μ„œλŠ” μ£Όμž…λ°›μ„ 객체가 μ—†μœΌλ―€λ‘œ @Autowired λŠ” ν•„μš”μ—†κ³  @Repository μ–΄λ…Έν…Œμ΄μ…˜λ§Œ 달아쀀닀.
Β @Repository μ–΄λ…Έν…Œμ΄μ…˜μ„ λ‹¬μ•„μ€˜μ•Ό μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μŠ€ν”„λ§ 빈으둜 λ“±λ‘λœλ‹€.
μ»΄ν¬λ„ŒνŠΈμ˜ μŠ€μΊ” λ²”μœ„ λ©”μΈν•¨μˆ˜κ°€ μ†ν•œ νŒ¨ν‚€μ§€λ²”μœ„κΉŒμ§€λ§Œμ΄λ‹€. (λ‚˜μ€‘μ— 섀정을 톡해 μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” λ²”μœ„λ₯Ό λ°”κΏ€ 수 μžˆκΈ΄ν•˜λ‹€.)
이 κ²½μš°λŠ” hello.hellospring λ²”μœ„μ—μ„œλ§Œ μŠ€ν”„λ§μ΄ μ»΄ν¬λ„ŒνŠΈλ₯Ό μŠ€μΊ”κ°€λŠ₯ν•˜λ‹€.
@Controller , @Service , @Repository μ–΄λ…Έν…Œμ΄μ…˜μ€ @Component μ–΄λ…Έν…Œμ΄μ…˜μ˜ νŠΉμˆ˜ν•œ μΌ€μ΄μŠ€μ΄λ‹€. μ˜ˆμ‹œ : @Controller
@Controller μ½”λ“œλ₯Ό 보면 @Component μ–΄λ…Έν…Œμ΄μ…˜μ΄ λ‹¬λ €μžˆλŠ” 것을 확인할 수 μžˆλ‹€.
μŠ€ν”„λ§ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” 클래슀의 μ–΄λ…Έν…Œμ΄μ…˜μΈ @SpringBootApplication λ‚΄λΆ€λ₯Ό μ‚΄νŽ΄λ³΄λ©΄, @ComponentScan μ΄λΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜μ΄ μžˆλ‹€. 즉, μŠ€ν”„λ§μ΄ 싀행될 λ•Œ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” λ°©μ‹μœΌλ‘œ μŠ€ν”„λ§ 빈이 λ“±λ‘λœλ‹€.
μŠ€ν”„λ§μ΄ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆμ— μŠ€ν”„λ§ λΉˆμ„ 등둝할 λ•Œ, 기본적은 μ‹±κΈ€ν†€μœΌλ‘œ λ“±λ‘ν•œλ‹€. 즉, μŠ€ν”„λ§ λΉˆμ€ 기본적으둜 각 κ°μ²΄λ§ˆλ‹€ ν•˜λ‚˜μ”©λ§Œ 등둝가λŠ₯ν•˜λ―€λ‘œ 같은 μŠ€ν”„λ§ 빈이면 같은 μΈμŠ€ν„΄μŠ€μ΄λ‹€. 섀정을 톡해 싱글톀이 μ•„λ‹ˆκ²Œ (같은 μŠ€ν”„λ§ λΉˆμ΄μ—¬λ„ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€λ‘œ) μ„€μ •ν•  수 도 μžˆμ§€λ§Œ 거의 μ“°μ§€λŠ” μ•ŠλŠ”λ‹€κ³  ν•œλ‹€.

μžλ°” μ½”λ“œλ‘œ 직접 μŠ€ν”„λ§ 빈 λ“±λ‘ν•˜κΈ°

이전 λ°©μ‹μ—μ„œμ˜ μ–΄λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•œ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” 방식 λŒ€μ‹  μžλ°”μ½”λ“œλ‘œ 직접 μŠ€ν”„λ§ λΉˆμ„ 생성할 수 μžˆλ‹€.
SpringConfig.java νŒŒμΌμ„ μƒμ„±ν•œλ‹€.
@Configuration public class SpringConfig { @Bean public MemberService memberService() { return new MemberService(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } }
Java
볡사
Β @Configuration κ³Ό @Bean μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•œλ‹€.
Β MemberService 와 MemberRepository κ°€ μŠ€ν”„λ§ λΉˆμ— λ“±λ‘λœλ‹€. ( μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” 방식을 μˆ˜λ™μœΌλ‘œ λ°”κΎΌ λ²„μ „μž„ )
Β MemberService 에 MemberRepository 객체가 μ£Όμž…λœλ‹€.
Β Controller 같은 κ²½μš°μ—λŠ” μˆ˜λ™μœΌλ‘œ λΉˆμ„ μƒμ„±ν•΄μ„œ μ£Όμž…μ‹œν‚¬ ν•„μš”κ°€ μ—†μœΌλ―€λ‘œ Configure νŒŒμΌμ—μ„œλŠ” λ”°λ‘œ κ±΄λ“œλ¦΄ ν•„μš”κ°€ μ—†λ‹€. 이전 λ°©μ‹μ²˜λŸΌ @Controller 와 @Autowired λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
Β μŠ€ν”„λ§ λΉˆμ€ ν•˜λ‚˜λ§Œ 등둝가λŠ₯(싱글톀 νŒ¨ν„΄)ν•˜λ―€λ‘œ 직접 μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•œ κ°μ²΄λŠ” μ»΄ν¬λ„ŒνŠΈ κ΄€λ ¨ μ–΄λ…Έν…Œμ΄μ…˜( ex. @Service, @Repository ) λ₯Ό μ—†μ• μ€˜μ•Ό ν•œλ‹€. μ•ˆ 그러면 μŠ€ν”„λ§ 빈이 μ€‘λ³΅μœΌλ‘œ μΈμ‹λΌμ„œ μ—λŸ¬ λ°œμƒν•¨.
MemoryMemberRepository.java
//@Repository // @Bean 으둜 λ“±λ‘ν•΄μ€¬μœΌλ―€λ‘œ μ–΄λ…Έν…Œμ΄μ…˜ 제거 public class MemoryMemberRepository implements MemberRepository { private static final Map<Long, Member> store = new HashMap<>(); // μƒλž΅ ..
Java
볡사
Β MemoryMemberRepository λŠ” SpringConfig μ—μ„œ @Bean 으둜 μˆ˜λ™ 등둝
MemberService.java
//@Service // @Bean 으둜 λ“±λ‘ν•΄μ€¬μœΌλ―€λ‘œ μ–΄λ…Έν…Œμ΄μ…˜ 제거 public class MemberService { private final MemberRepository memberRepository; @Autowired // MemberService 객체λ₯Ό 생성할 λ•Œ, memberRepository μ˜μ‘΄μ„± μ£Όμž… public MemberService(MemberRepository memberRepository) { this.memberRepository = memberRepository; } // μƒλž΅ ..
Java
볡사
Β MemberService λ₯Ό @Bean 으둜 λ“±λ‘ν–ˆμœΌλ―€λ‘œ, MemberService μƒμ„±μžμ—μ„œ @Autowired μ‚¬μš©κ°€λŠ₯
Β MemberRepository λ₯Ό @Bean 으둜 λ“±λ‘ν–ˆμœΌλ―€λ‘œ, MemberService μƒμ„±μžμ—μ„œ MemberRepository μ£Όμž…λ°›μ„ 수 있음
Β @Autowired λ₯Ό ν†΅ν•œ DI λŠ” μŠ€ν”„λ§ 빈으둜 λ“±λ‘λœ 객체(ex. MemberService, MemberController ..) μ—μ„œλ§Œ λ™μž‘ν•œλ‹€. 순수 μžλ°” 객체 (POJO) μ—μ„œλŠ” λ™μž‘ν•˜μ§€ μ•ŠλŠ”λ‹€.
MemberController.java
@Controller // μ–΄λ…Έν…Œμ΄μ…˜μ΄ 있으면 μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ ν•΄λ‹Ή 컨트둀러λ₯Ό μƒμ„±ν•΄μ„œ κ΄€λ¦¬ν•΄μ€Œ public class MemberController { private final MemberService memberService; @Autowired // @Autowired μ–΄λ…Έν…Œμ΄μ…˜μ— μ˜ν•΄ μŠ€ν”„λ§μ΄ memberService λ₯Ό κ°€μ Έμ™€μ„œ 이 객체에 μ£Όμž… μ‹œμΌœμ€Œ public MemberController(MemberService memberService) { this.memberService = memberService; }
Java
볡사
Β Controller 같은 κ²½μš°μ—λŠ” μˆ˜λ™μœΌλ‘œ λΉˆμ„ μƒμ„±ν•΄μ„œ μ£Όμž…μ‹œν‚¬ ν•„μš”κ°€ μ—†μœΌλ―€λ‘œ Configure νŒŒμΌμ—μ„œλŠ” λ”°λ‘œ κ±΄λ“œλ¦΄ ν•„μš”κ°€ μ—†λ‹€. 이전 λ°©μ‹μ²˜λŸΌ @Controller 와 @Autowired λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

직접 Bean 을 등둝할 λ•Œμ˜ μž₯점

Bean μ„€μ • 파일둜 직접 Bean 을 λ“±λ‘ν•˜λŠ” 방법도 μ•Œμ•„λ‘¬μ•Ό ν•œλ‹€.
β€’
μ •ν˜•ν™”λœ μ½”λ“œ (컨트둀러, μ„œλΉ„μŠ€, 리포지토리) : μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”μ„ μ“°λŠ” 것이 더 편리
β€’
μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀λ₯Ό λ³€κ²½ν•΄μ•Όν•˜λŠ” 상황 : 직접 μŠ€ν”„λ§ λΉˆμ„ μ„€μ •ν•˜λŠ” 것이 더 편리
κ΅¬ν˜„ 클래슀λ₯Ό λ³€κ²½ν•΄μ•Όν•˜λŠ” 상황은 μ•„λž˜μ™€ κ°™λ‹€.
SpringConfig.java
@Configuration public class SpringConfig { @Bean public MemberService memberService() { return new MemberService(memberRepository()); } @Bean public MemberRepository memberRepository() { // return new MemoryMemberRepository(); return new DBMemberRepository(); } }
Java
볡사
β€’
μΈν„°νŽ˜μ΄μŠ€ : MemberRepository
β€’
λ³€κ²½ μ „ κ΅¬ν˜„ 클래슀 : MemoryMemberRepository
β€’
λ³€κ²½ ν›„ κ΅¬ν˜„ 클래슀 : DBMemberRepository
λ§Œμ•½ κ΅¬ν˜„ 클래슀λ₯Ό μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ” λ°©μ‹μœΌλ‘œ Bean에 λ“±λ‘ν–ˆλ‹€λ©΄ μ—¬λŸ¬ μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•  수 도 μžˆλ‹€.
ν•˜μ§€λ§Œ μ„€μ •νŒŒμΌμ—μ„œ Bean 을 직접 μ„€μ •ν–ˆλ‹€λ©΄ 단 ν•œ 쀄이면 λλ‚œλ‹€.
Β μ–΄λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•œ μ»΄ν¬λ„ŒνŠΈ μŠ€μΊ”λ°©μ‹μ„ 많이 μ‚¬μš©ν•˜κΈ°λŠ” ν•˜μ§€λ§Œ, Bean μ„€μ • 파일둜 직접 Bean 을 λ“±λ‘ν•˜λŠ” 방법도 μ•Œμ•„λ‘¬μ•Ό ν•œλ‹€.