JAN's History

์Šคํ”„๋ง๊ณผ JPA๋ฅผ ์ด์šฉํ•œ ์›น๊ฐœ๋ฐœ_์˜์กด์„ฑ ์ฃผ์ž… ๋ณธ๋ฌธ

์Šคํ”„๋ง

์Šคํ”„๋ง๊ณผ JPA๋ฅผ ์ด์šฉํ•œ ์›น๊ฐœ๋ฐœ_์˜์กด์„ฑ ์ฃผ์ž…

JANNNNNN 2024. 4. 1. 11:24

๐Ÿค”์˜์กด์„ฑ ์ฃผ์ž… ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ ์ฃผ์ž…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

์ด๋Ÿฐ์‹์œผ๋กœ MemberPrint๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๊ฐ€ KoreanMemberPrint, EnglishMemberPrint ๋‘๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  PrintInfo๋ผ๋Š” class์—์„œ ์ฒ˜์Œ์— KoreanMemberPrint๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ EnglishMemberPrint ๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ์ƒํ™ฉ์ด๋‹ค!

โžก๏ธ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿด ๋•Œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋˜ ์ˆ˜์ •ํ•ด์ค˜์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๊ณ , ์ด๋Š” ์ฝ”๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š” ๋ฐ์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ๋ถ€ํ’ˆ์„ ๊ฐˆ์•„๋ผ์šด๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค~

โžก๏ธ๊ทธ๋ž˜์„œ ๋™์ž‘ํ•˜๋Š” ํด๋ž˜์Šค์™€ ๋ณ„๊ฐœ๋กœ ๊ฐ์ฒด๋“ค์˜ ์˜์กด์„ฑ์„ ์„ค์ •ํ•˜๋Š” ์™ธ๋ถ€ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค!

๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ "์˜์กด๊ด€๊ณ„ ์ฃผ์ž… (IoC ์ œ์–ด์˜ ์—ญ์ „)"

  • ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•(Autowired์˜ ์œ„์น˜์— ๋”ฐ๋ฅธ ์ฃผ์ž… ๋ฐฉ๋ฒ• ๊ตฌ๋ถ„)
    • ์ƒ์„ฑ์ž ์ฃผ์ž…(๊ฐ€์žฅ ์ถ”์ฒœ๋˜๋Š” ๋ฐฉ๋ฒ•)
    • ์ˆ˜์ •์ž ์ฃผ์ž…
    • ํ•„๋“œ ์ฃผ์ž…

โž•IoC ์ œ์–ด์˜ ์—ญ์ „์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ด์œ ๋Š” ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ ์ฑ…์ž„์„ ๊ฐœ๋ฐœ์ž์—์„œ ํ”„๋ ˆ์ž„์›Œํฌ์— ์œ„์ž„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค!

๐Ÿค”์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•(์ƒ์„ฑ์ž ์ฃผ์ž…)์€ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฑธ๊นŒ?

@Autowired๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ์ž์ฃผ์ž…์„ ํ•ด์ค๋‹ˆ๋‹ค!

์ฆ‰, @Autowired๋ฅผ ์œ„์— ๋ถ™์ด๋ฉด ๊ทธ ํด๋ž˜์Šค๋Š” ์ด์ œ ()์•ˆ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์ฃผ์ž…๋ฐ›๊ฒ ๋‹ค๋Š” ๋ช…์‹œํ•˜๋Š” ๊ฒƒ!

๊ทธ๋Ÿฌ๋ฉด, ์ดํ›„์— ์œ„์—์ฒ˜๋Ÿผ ์ง์ ‘์ ์œผ๋กœ ์ฃผ์ž…ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ์ฃผ์ž…์ด ๋ฉ๋‹ˆ๋‹ค.

  • ์ƒ์„ฑ์‚ฌ์ž ํ•˜๋‚˜์ผ ๊ฒฝ์šฐ Autowired๊ฐ€ ์ƒ๋žต๊ฐ€๋Šฅํ•˜์ง€๋งŒ,
  • ๊ธฐ๋ณธ ์ƒ์„ฑ์ž์ฒ˜๋Ÿผ ์ƒ์„ฑ์ž๊ฐ€ 2๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ์—๋Š” ์ƒ๋žต์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค!

์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•(์ˆ˜์ •์ž(setter) ์ฃผ์ž…)

setter๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

  • ์„ ํƒ, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์˜์กด๊ด€๊ณ„์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โž•๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ์—์„œ set์ฒ˜๋Ÿผ ์ˆ˜์ •ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” ์œ ์ง€๋ณด์Šค ์ธก๋ฉด์—์„œ ์ข‹์ง€์•Š๊ธฐ๋•Œ๋ฌธ์— ์ง€์–‘ํ•œ๋‹ค.

์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•: ํ•„๋“œ(field) ์ฃผ์ž…

ํ•„๋“œ์— @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ํ‘œ๊ธฐ

  • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ…Œ์ŠคํŠธ ์‹œ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์ด ์…‹์ค‘์— ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์จ๋ผ!

  1. final ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹คsetter๋ฅผ public์œผ๋กœ ์ง€์ •ํ•  ํ•„์š” ์—†์Œ
  2. ํ…Œ์ŠคํŠธ์ฝ”๋“œ ์ž‘์„ฑ์ด ํŽธ๋ฆฌํ•˜๋‹ค
  3. ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ ๋งŽ์€ ์˜์กด์„ฑ ์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ํด๋ž˜์Šค ์„ค๊ณ„๊ฐ€ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” signal๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ๋‹ค.
    • (ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„์„ ๊ฐ€์ ธ์•ผ ํ•จ)
  4. ์ˆœํ™˜ ์ฐธ์กฐ๋ฅผ ๋ฐฉ์ง€ํ•ด์ค€๋‹ค
    • ํ•„๋“œ/์ˆ˜์ •์ž ์ฃผ์ž…์€ Runtime์‹œ์—, ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ์ปดํŒŒ์ผ ์‹œ์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ๊ฒฌ!

์ˆœํ™˜์ฐธ์กฐ

์ˆœํ™˜์ฐธ์กฐ๋ž€? โžก๏ธA ๊ฐ์ฒด๋ฅผ B, C ๋ชจ๋‘๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ด€๊ณ„

  • ์ด๋Š” ์œ ์ง€๋ณด์Šค ์ธก๋ฉด์—์„œ ์•„์ฃผ ์ข‹์ง€ ์•Š์Œ

์˜์กด ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ์‹œ๊ธฐ๋Š” ์–ธ์ œ์ธ๊ฐ€์š”?

์ˆ˜์ •์ž ์ฃผ์ž…, ํ•„๋“œ ์ฃผ์ž…

  • ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ดํ›„์— ์˜์กด ๊ด€๊ณ„ ์„ค์ •
  • โžก๏ธ๊ทธ๋ž˜์„œ Runtime ์‹œ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ!

์ƒ์„ฑ์ž ์ฃผ์ž…

  • ์ž์‹ ์˜ ์ƒ์„ฑ๊ณผ ์—ฐ๊ด€๊ด€๊ณ„ ์„ค์ •์ด ๋™์‹œ์— ๋ฐœ์ƒ๋œ๋‹ค.
  • A๋Š” B๊ฐ€ ํ•„์š”ํ•˜๊ณ  B๋Š” A๊ฐ€ ํ•„์š”
  • A๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด B๋ฅผ ์ƒ์„ฑํ•˜๋Ÿฌ ๊ฐ→B๋ฅผ ์ƒ์„ฑํ•˜๋Ÿฌ ๊ฐ€๋‹ˆ A๊ฐ€ ํ•„์š”ํ•˜์—ฌ A๋ฅผ ์ƒ์„ฑํ•˜๋Ÿฌ ๊ฐ → …
    • ๋‹ญ์ด ๋จผ์ €๋ƒ ๋‹ฌ๊ฑ€์ด ๋จผ์ €๋ƒ ์ฒ˜๋Ÿผ..
  • โžก๏ธ๊ทธ๋ž˜์„œ ์ปดํŒŒ์ผ ์‹œ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค!

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•!

  • @Lazy autowiring์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

@Autowired

  • ์ด๋ฆ„์„ ํ†ตํ•ด ๋นˆ์„ ๊ฒ€์ƒ‰
  • Spring์—๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • @Autowired๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŠน์ • ๋นˆ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง(๋‹จ, required ์†์„ฑ์œผ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)

@Resource

  • ์ž๋ฐ” ์ง„์˜์—์„œ @Autowired๋ฅผ ์ฐธ๊ณ ํ•ด ๋งŒ๋“  ์–ด๋…ธํ…Œ์ด์…˜
  • ์ด๋ฆ„์„ ํ†ตํ•œ ๊ฒ€์ƒ‰ ๋ฐฉ์‹ → POJO๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ ๋Œ€์ƒ์ด ๋ชจํ˜ธํ•˜์ง€ ์•Š๊ณ , ๋ช…ํ™•
  • @Autowired + @Qualifier

@Inject

  • ์ž๋ฐ” ์ง„์˜์—์„œ @Autowired๋ฅผ ์ฐธ๊ณ ํ•ด ๋งŒ๋“  ์–ด๋…ธํ…Œ์ด์…˜
  • ํƒ€์ž…์„ ํ†ตํ•œ ๊ฒ€์ƒ‰๋ฐฉ์‹
  • ํƒ€์ž…์ด ๊ฐ™์€ POJO๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜(custom annotation)์„ ์ž‘์„ฑ
    • ํƒ€์ž…์ด ๊ฐ™์€ POJO๋ž€ ? ์˜ˆ์‹œ๋กœ ํ•˜๋‚˜์˜ MemberPrint์— koreanPrint, englishPrint๊ฐ€ ์žˆ๋Š” ๊ฒƒ 

โžก๏ธ๊ทธ๋Ÿฌ๋‚˜ ์Šคํ”„๋ง์€ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋ƒฅ @Autowired๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค

์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ• : Lombok ์ด์šฉ

@RequiredArgsConstructor

  • ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ final ํ•„๋“œ์™€ @NonNull ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํ•„๋“œ(๋ฐ˜๋“œ์‹œ ๊ฐ’์ด ์ฑ„์›Œ์ ธ ์žˆ์–ด์•ผํ•˜๋Š” ๋ถ€๋ถ„)์— ๋Œ€ํ•œ ์ƒ์„ฑ์ž๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.
@Autowired
public PrintInfo(MemberPrint memberPrint) {
	this.memberPrint= memberPrint;
}

์œ„์™€ ๊ฐ™์€ ์ƒ์„ฑ์ž๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ @RequiredArgsConstructor๋ฅผ ๋ถ™์ด๋ฉด ์•Œ์•„์„œ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.


์ปดํฌ๋„ŒํŠธ ์Šค์บ”

โ–ช ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ด€๋ฆฌ๋  ๋นˆ๋“ค์„ ์ฐพ์Œ

โ–ช ํด๋ž˜์Šค๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜์ง€๋งŒ ์ตœ๊ทผ์—๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋นˆ์œผ๋กœ ๊ด€๋ฆฌ๋  ํด๋ž˜์Šค๋ฅผ ์ง€์ •

โ–ช @ComponentScan ์–ด๋…ธํ…Œ์ด์…˜์€ ์Šคํ”„๋ง์—๊ฒŒ ์Šคํ”„๋ง ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ์•„์•ผ ํ•  ์œ„์น˜๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์•Œ๋ ค์คŒ

โ–ช @ComponentScan์€ @Configuration๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋จ

@Component๋ฅผ ๋ถ™์˜€๋”๋‹ˆ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด์„œ ์•„๋ž˜ ์ชฝ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

โž•DB ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•  ๋•Œ @Entity๋ฅผ ๋“ฑ๋กํ•ด์•ผํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” ํ–‰์œ„๊ฐ€ ๋น„์Šท!

 

SpringBoot์—์„œ์˜ Component Scan

@SpringBootApplication

  • @Configuration
  • @EnableAutoConfiguration
  • @ComponentScan

@SpringBootApplication์ด ๋ถ™์€ ํด๋ž˜์Šค์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜์œ„ ํด๋ž˜์Šค ์Šค์บ” ๋Œ€์ƒ์ด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ, @SpringBootApplication์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์ƒ๋‹จ์— ๋‘๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค!

โžก๏ธ์ฆ‰, ์Šคํ”„๋ง์—์„œ @SpringBootApplication์„ ๋ถ™์ด๋ฉด ์•Œ์•„์„œ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์‹ค ๊นŠ์ด ์•Œ ํ•„์š”๊นŒ์ง„ ์—†๋‹ค! ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…๋งŒ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ€์ž~