๐Ÿ“š Spring DI ์ •๋ฆฌ โ€“ ์˜์กด์„ฑ ์ฃผ์ž…, Autowired, RequiredArgsConstructor, Mock ์ดํ•ด

๊น€์ •๊ทœยท2025๋…„ 7์›” 29์ผ

โœ… ์˜์กด์„ฑ ์ฃผ์ž…(DI, Dependency Injection)์ด๋ž€?


๋‚ด๊ฐ€ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , Spring์ด ํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋Œ€์‹  ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฐœ๋…

โ†’ ๊ฐ์ฒด ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์„ ๋†’์ž„


๐Ÿ”ฅ DI ๋ฐฉ์‹ 3๊ฐ€์ง€

๋ฐฉ์‹์„ค๋ช…์‹ค๋ฌด ์ถ”์ฒœ
ํ•„๋“œ ์ฃผ์ž…@Autowired๊ฐ์ฒด๋ฅผ ๋งŒ๋“  ํ›„ ํ•„๋“œ์— ๊ฐ’ ์ฃผ์ž…โŒ ์ง€์–‘
์ƒ์„ฑ์ž ์ฃผ์ž…@RequiredArgsConstructor๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์ ์— ์ฃผ์ž…โœ… ํ‘œ์ค€
์„ธํ„ฐ ์ฃผ์ž…setX(...)ํ•„์š”ํ•  ๋•Œ ์ฃผ์ž… ๊ฐ€๋ŠฅโŒ ์ง€์–‘ (๋ถˆ๋ณ€ ๊นจ์ง)

๐Ÿ†š @Autowired vs @RequiredArgsConstructor

ํ•ญ๋ชฉ@Autowired (ํ•„๋“œ ์ฃผ์ž…)์ƒ์„ฑ์ž ์ฃผ์ž… (@RequiredArgsConstructor)
์ฃผ์ž… ์‹œ์ ๊ฐ์ฒด ๋งŒ๋“  ํ›„ ๋‚˜์ค‘์— ์ฃผ์ž…๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์ ์— ์ฃผ์ž…
final ์‚ฌ์šฉโŒ ๋ถˆ๊ฐ€๋Šฅโœ… ๊ฐ€๋Šฅ (๋ถˆ๋ณ€์„ฑ ์œ ์ง€)
ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑโŒ ์–ด๋ ต๋‹คโœ… Mock ์ฃผ์ž… ์‰ฌ์›€
๊ฐ€๋…์„ฑโŒ ์ˆจ๊ฒจ์ ธ ์žˆ์–ด ์ถ”์  ์–ด๋ ค์›€โœ… ์ƒ์„ฑ์ž์— ๋ช…์‹œ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚จ
์˜ค๋ฅ˜ ํƒ์ง€โŒ ์‹คํ–‰ ์‹œ์  ์˜ค๋ฅ˜ (NPE ๋“ฑ)โœ… ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜๋กœ ๋น ๋ฅด๊ฒŒ ํ™•์ธ
Spring ๊ณต์‹ ๊ถŒ์žฅโŒ ์•„๋‹˜โœ… ๊ณต์‹ ์ถ”์ฒœ ๋ฐฉ์‹

๐Ÿช ๊ฐœ๋ฐœ์ž ๊ฐ๊ฐ ๋น„์œ 

  • @Autowired = ์Ÿ๋ฐ˜: ๋จผ์ € ์Ÿ๋ฐ˜ ๋†“๊ณ  ๋‚˜์ค‘์— ์ด๊ฒƒ์ €๊ฒƒ ์˜ฌ๋ฆผ (์ค‘๊ฐ„์— ์ด์ƒํ•œ ๊ฑฐ ์„ž์ผ ์ˆ˜ ์žˆ์Œ)
  • ์ƒ์„ฑ์ž ์ฃผ์ž… = ์ฟ ํ‚คํ‹€: ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ์žฌ๋ฃŒ๋งŒ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ํ‹€, ์•ˆ์ „ํ•˜๊ณ  ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

โŒ @Setter๋Š” ์™œ ์ง€์–‘ํ• ๊นŒ?

์ด์œ ์„ค๋ช…
๋ณด์•ˆ ๋ฌธ์ œ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ด๋ฉ”์ผ ๋“ฑ ๋ฏผ๊ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ
๋ถˆ๋ณ€์„ฑ ๊นจ์งfinal ๋ถˆ๊ฐ€, ์ค‘๊ฐ„์— ๊ฐ’์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ์Œ
๊ฐ์ฒด ์•ˆ์ •์„ฑ ์ €ํ•˜๋Ÿฐํƒ€์ž„์— ์˜ˆ์ƒ ๋ชป ํ•œ ๋™์ž‘ ๋ฐœ์ƒ ์œ„ํ—˜

โœ… ์‹ค๋ฌด์—์„  @Getter + @Builder ์กฐํ•ฉ + ๋ถˆ๋ณ€ ๊ฐ์ฒด ์„ค๊ณ„๋ฅผ ์„ ํ˜ธ


๐Ÿงช Mock์ด๋ž€?

ํ…Œ์ŠคํŠธ์šฉ ๊ฐ€์งœ ๊ฐ์ฒด

์‹ค์ œ ๋™์ž‘์€ ํ•˜์ง€ ์•Š์ง€๋งŒ ํ˜ธ์ถœ ์—ฌ๋ถ€ / ๋ฐ˜ํ™˜๊ฐ’ ์„ค์ • ๋“ฑ์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ

๋„๊ตฌ์—ญํ• 
Mockito.mock(...)์ง„์งœ ๊ฐ์ฒด ๋Œ€์‹  ๊ฐ€์งœ ๊ฐ์ฒด ์ƒ์„ฑ
when(...).thenReturn(...)์›ํ•˜๋Š” ๊ฐ’ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •
verify(...)๋ฉ”์„œ๋“œ๊ฐ€ ๋ช‡ ๋ฒˆ ํ˜ธ์ถœ๋๋Š”์ง€ ๊ฒ€์ฆ

โœ… JUnit + Mockito ์กฐํ•ฉ์€ Spring Boot ํ…Œ์ŠคํŠธ์˜ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€


โœ… ์‹ค๋ฌด ๊ธฐ์ค€ ์š”์•ฝ

ํ•ญ๋ชฉ๊ถŒ์žฅ ์—ฌ๋ถ€์ด์œ 
@AutowiredโŒ๋ณ€๊ฒฝ ์œ„ํ—˜, ํ…Œ์ŠคํŠธ ์–ด๋ ค์›€
์ƒ์„ฑ์ž ์ฃผ์ž… + @RequiredArgsConstructorโœ…๋ถˆ๋ณ€์„ฑ, ์•ˆ์ •์„ฑ, ๊ฐ€๋…์„ฑ ์šฐ์ˆ˜
@SetterโŒ์™ธ๋ถ€ ๋ณ€๊ฒฝ ์œ„ํ—˜, ๋ถˆ๋ณ€ ๊ฐ์ฒด ์„ค๊ณ„์™€ ์ถฉ๋Œ
Mock ํ…Œ์ŠคํŠธโœ…์™ธ๋ถ€ ์˜ํ–ฅ ์—†์ด ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
profile
๊ธฐํš๊ณผ ์„ค๊ณ„ ๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„๊นŒ์ง€ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€