Skip to content

Latest commit

ย 

History

History
428 lines (319 loc) ยท 25.4 KB

File metadata and controls

428 lines (319 loc) ยท 25.4 KB

SpringStudy

์Šคํ”„๋ง

์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐ€์น˜๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ

  • ํ•ต์‹ฌ ๊ธฐ์ˆ  : DI, AOP
  • ์›น ๊ธฐ์ˆ  : MVC, WebFlux
  • ๋ฐ์ดํ„ฐ ์ ‘๊ทผ : DBC,ORM, XML
  • ๊ธฐ์ˆ  ํ†ตํ•ฉ : ์บ์‹œ, ์ด๋ฉ”์ผ, ์Šค์ผ€์ฅด๋ง
  • ํ…Œ์ŠคํŠธ : ์Šคํ”„๋ง ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์ง€์›

์Šคํ”„๋ง ๋ถ€ํŠธ

  • ์Šคํ”„๋ง์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›
  • ์›น ์„œ๋ฒ„(tomcat)๋ฅผ ๋‚ด์žฅํ•ด์„œ ๋ณ„๋„์˜ ์›น ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค
  • starter ์ข…์†์„ฑ ์ œ๊ณต
  • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž๋™ ๊ตฌ์„ฑ

์Šคํ”„๋ง์˜ ํ•ต์‹ฌ

  • ์ž๋ฐ” ์–ธ์–ด ๊ธฐ๋ฐ˜์˜ ํ”„๋ ˆ์ž„ ์›Œํฌ
  • ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํŠน์ง•

์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ช…๋ น์–ด์˜ ๋ชฉ๋ก์œผ๋กœ ๋ณด๋Š” ์‹œ๊ฐ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋…๋ฆฝ๋œ ๋‹จ์œ„, ์ฆ‰ ๊ฐ์ฒด๋“ค์˜ ๋ชจ์ž„์œผ๋กœ ํŒŒ์•… ์„œ๋กœ ๋ฉ”์„ธ์ง€๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ

์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๋‹ค -> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‰ฝ๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•

๋‹คํ˜•์„ฑ

์—ญํ• ๊ณผ ๊ตฌํ˜„์œผ๋กœ ์„ธ์ƒ์„ ๊ตฌ๋ถ„

์šด์ „์ž์™€ ์ž๋™์ฐจ์˜ ๊ด€๊ณ„๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž ์šด์ „์ž๋Š” ์ž๋™์ฐจ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ๋ชฐ๋ผ๋„ ์šด์ „ ๊ฐ€๋Šฅํ•˜๊ณ  ์ž๋™์ฐจ๊ฐ€ ๋‹ค๋ฅธ ์ž๋™์ฐจ๋กœ ๋ฐ”๋€Œ์–ด๋„ ์šด์ „์ด ๊ฐ€๋Šฅํ•˜๋‹ค ์ฆ‰, ์šด์ „์ž์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ณต์—ฐ์˜ ๋ฌด๋Œ€๋„ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋กœ๋ฏธ์™€ ์ค„๋ฆฌ์—ฃ์ด๋ผ๋Š” ์—ญํ• ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ•ด๋‹น ๋ฐฐ์—ญ์€ ๋ฐ”๋€Œ์–ด๋„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

์—ญํ•  : ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„ : ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค, ๊ตฌํ˜„ ๊ฐ์ฒด ๊ฐ์ฒด ์„ค๊ณ„ ์‹œ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•œ๋‹ค.

์ž๋ฐ”์˜ ๋‹คํ˜•์„ฑ์€ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค

ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์„œ๋ฒ„์˜ ๊ตฌํ˜„ ๊ธฐ๋Šฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. -> ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„ค๊ณ„

SOLID

  1. SRP : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (Single Responsibility principle) ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ง„๋‹ค ์ฑ…์ž„์˜ ํฌ๊ธฐ์— ๋Œ€ํ•œ ๊ธฐ์ค€์€ ๋ณ€๊ฒฝ์ด๋‹ค. ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํŒŒ๊ธ‰ ํšจ๊ณผ๊ฐ€ ์ ์œผ๋ฉด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ž˜ ๋”ฐ๋ฅธ ๊ฒƒ์ด๋‹ค ex) UI ๋ณ€๊ฒฝ, ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ์„ ๋ถ„๋ฆฌ
  2. OCP : ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™ (Open/Closed principle) ์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ณ„๋„์˜ ์กฐ๋ฆฝ, ์„ค์ •์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค
  3. LSP : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ํ˜•์‹ ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค. ๋‹คํ˜•์„ฑ์—์„œ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ทœ์•ฝ์„ ๋‹ค ์ง€์ผœ์•ผ ํ•œ๋‹ค.
  4. ISP : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค. -> ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ณ , ๋Œ€์ฒด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค. ์‚ฌ์šฉ์ž ํด๋ผ์ด์–ธํŠธ -> ์šด์ „์ž ํด๋ผ์ด์–ธํŠธ, ์ •๋น„์‚ฌ ํด๋ผ์ด์–ธํŠธ
  5. DIP : ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (dependency Inversion) ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๋ผ๋Š” ๋œป ์—ญํ• ์— ์ง‘์ค‘์„ ํ•˜์ž
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();

์œ„ ์ฝ”๋“œ๋Š” OrderServiceImpl์˜ ์ฝ”๋“œ ์ค‘ ํ•œ ๋ถ€๋ถ„์ธ๋ฐ
ํ• ์ธ ์ •์ฑ…์˜ ๋ณ€๊ฒฝ์œผ๋กœ DiscountPolicy์˜ ๊ตฌํ˜„์ฒด๋“ค์„ ๋ณ€๊ฒฝ, ์ฆ‰ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผํ•œ๋‹ค. ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ DIP๋Š” ์œ„๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค. OrderService๋Š” ํ˜„์žฌ ์ถ”์ƒ(์ธํ„ฐํŽ˜์ด์Šค)์ธ DiscountPolciy๋ฅผ ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค(Okay), ํ•˜์ง€๋งŒ ๊ตฌํ˜„์ฒด์ธ Fix,RateDsicountPolicy์—๋„ ์˜์กดํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ DIP๋ฅผ ์ค€์ˆ˜ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค.

๋ฎค์ง€์ปฌ์ด๋ผ๊ณ  ํ•˜๋ฉด ๋กœ๋ฏธ์˜ค์™€ ์ค„๋ฆฌ์—ฃ์˜ ์—ญํ• ์ด ์žˆ๋Š”๋ฐ ๋กœ๋ฏธ์˜ค๊ฐ€ ์Šค์Šค๋กœ ์ค„๋ฆฌ์—ฃ์ด ๋ˆ„๊ตฌ์ธ์ง€๋ฅผ ๊ณ ๋ฅด๊ณ  ์žˆ๋Š” ์ค‘์ด๋‹ค. DIP๋ฅผ ์œ„๋ฐ˜ํ•˜๊ณ  ๋กœ๋ฏธ์˜ค์˜ ์—ญํ•  ์™ธ์˜ ๋‹ค์–‘ํ•œ ์ฑ…์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
private DiscountPolicy discountPolicy;
์ด DiscountPolicy์˜ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋Œ€์‹  ์ƒ์„ฑํ•ด์ฃผ๊ณ  ์ฃผ์ž…์„ ํ•ด์ค˜์•ผํ•œ๋‹ค. 
์ƒ์„ฑ์ž์—์„œ๋Š” ๊ตฌํ˜„์ฒด์„ ์ฃผ์ž…๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

AppConfig๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.
AppConfig๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ๋™์ž‘์— ํ•„์š”ํ•œ *๊ตฌํ˜„๊ฐ์ฒด*๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์ƒ์„ฑํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ๋ฅผ *์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด์„œ ์ฃผ์ž…*ํ•œ๋‹ค.

AppConfig๋Š” ์บ์ŠคํŒ… ๋งค๋‹ˆ์ €๋‹ค. ๋ฐฐ์šฐ๋“ค์€ ์ƒ๋Œ€ ์—ญ์ด ๋ˆ„๊ฐ€ ์˜ค๋“  ์ƒ๊ด€์ด ์—†์–ด์•ผ ํ•˜๋ฏ€๋กœ AppConfig๊ฐ€ ๋‹ค ๋ฐฐ์—ญ์„ ๊ณจ๋ผ์ค€๋‹ค.
์ด์ œ OrderServiceImpl์€ ์˜์กด๊ด€๊ณ„์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์€ ์™ธ๋ถ€์— ๋งก๊ธฐ๊ณ  ์‹คํ–‰์—๋งŒ ์ง‘์ค‘ํ•˜๋ฉด ๋œ๋‹ค.

public class AppConfig {

    public MemberService memberService() {
        return new MemberServiceImpl(new MemoryMemberRepository());
    }

    public OrderService orderService(){
        return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy());
    }
}
ํ•˜์ง€๋งŒ ์œ„์˜ ์ฝ”๋“œ์—์„œ Repository์˜ ์—ญํ• ์ด ์ž˜ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.
๋ฆฌํŒฉํ† ๋ง์„ ํ•ด๋ณด์ž
private static MemoryMemberRepository memberRepository() {
    return new MemoryMemberRepository();
}
new MemoryMemberRepoitory๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋”ฐ๋กœ ๋นผ์ฃผ๊ณ 
new FixDiscountPolicy๋กœ ๋”ฐ๋กœ ๋นผ์ฃผ๋ฉด ๋œ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ์š”๊ตฌ์‚ฌํ•ญ ์„ค๊ณ„์™€ ์ž˜ ๋งž๋Š”๋‹ค.
  • AppConfig๋ฅผ ํ†ตํ•ด ๊ด€์‹ฌ์‚ฌ๋ฅผ ํ™•์‹คํ•˜๊ฒŒ ๋ถ„๋ฆฌํ–ˆ๋‹ค. ์‚ฌ์šฉ์˜์—ญ๊ณผ ๊ตฌ์„ฑ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์กŒ๋‹ค.

๋‹คํ˜•์„ฑ๋งŒ์œผ๋กœ OCP, DIP๋ฅผ ๋งŒ์กฑํ•  ์ˆ˜ ์—†๋‹ค


์ œ์–ด์˜ ์—ญ์ „ (Inversion of Control)

  1. ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์€ ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ์Šค์Šค๋กœ ํ•„์š”ํ•œ ์„œ๋ฒ„ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ฒฐํ•˜๊ณ  ์‹คํ–‰ํ–ˆ๋‹ค. ์ฆ‰, ๊ตฌํ˜„ ๊ฐ์ฒด๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์„ ์Šค์Šค๋กœ ์กฐ์ข…ํ–ˆ๋‹ค.
  2. AppConfig๋ฅผ ์‚ฌ์šฉํ•œ ์ดํ›„๋กœ, ๊ตฌํ˜„ ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ ๋กœ์ง์„ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ๋งŒ ๋‹ด๋‹นํ•œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด๋Š” AppConfig๊ฐ€ ๊ฐ€์ ธ๊ฐ„๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ์ œ์–ด ํ๋ฆ„์„ ์ง์ ‘ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ œ์–ด์˜ ์—ญ์ „์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ : ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์‹คํ–‰๊ณผ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: ๋‚ด๊ฐ€ ์ง์ ‘ ์ œ์–ด์˜ ํ๋ฆ„์„ ๋‹ด๋‹นํ•œ๋‹ค.

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

  • ์˜์กด๊ด€๊ณ„๋Š” ์ •์ ์ธ ํด๋ž˜์Šค ์˜์กด๊ด€๊ณ„,๋Ÿฐํƒ€์ž„ ์‹œ ๊ฒฐ์ •๋˜๋Š” ๋™์ ์ธ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค) ์˜์กด ๊ด€๊ณ„ ์ด ๋‘๊ฐœ๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค.
  • ํด๋ž˜์Šค ์˜์กด๊ด€๊ณ„ : import ์ฝ”๋“œ๋งŒ ๋ณด๊ณ  ํŒ๋‹จ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. ์ฝ”๋“œ๋งŒ ๋ณด๋ฉด ํ•ด๋‹น ๊ตฌํ˜„์ฒด์— ์–ด๋–ค ํด๋ž˜์Šค๊ฐ€ ๋“ค์–ด๊ฐˆ์ง€ ๋ชจ๋ฅธ๋‹ค. ์ด๋Š” ์‹คํ–‰ ์‹œ๊ฐ„์— ๋™์ ์œผ๋กœ AppConfig๋ฅผ ํ†ตํ•ด ๊ฒฐ์ •๋˜๋ฉฐ ์ด ๋•Œ ์˜์กด๊ด€๊ณ„๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, ์ด๋ฅผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

IoC, Di Container -> AppConfig ๊ฐ™์ด ์˜์กด์„ฑ ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ฑฐ

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ

  • ApplicationContext : ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ
  • @Bean์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ํ˜ธ์ถœํ•ด์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•˜๊ณ , ์ด๋ฅผ ์Šคํ”„๋ง ๋นˆ์ด๋ผ๊ณ  ํ•œ๋‹ค.
  • applicationContext.getBean()์„ ํ†ตํ•ด ์Šคํ”„๋ง ๋นˆ์„ ์ฐพ๋Š”๋‹ค

๋นˆ ํŒฉํ† ๋ฆฌ

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ตœ์ƒ์œ„ ์ธํ„ฐํŽ˜์ด์Šค
  • ์Šค๋ฅดํ•‘ ๋นˆ ๊ด€๋ฆฌ ๋ฐ ์กฐํšŒ
  • getBean()

ApplicationContext

  • ๋นˆ ํŒฉํ† ๋ฆฌ๋ฅผ ์ƒ์†๋ฐ›์•„ ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„๋‹ค
  • ๋ฉ”์„ธ์ง€ ์†Œ์Šค๋ฅผ ํ™œ์šฉํ•œ ๊ตญ์ œํ™” ๊ธฐ๋Šฅ : ์–ธ์–ด ๊ตญ์ œํ™” ๊ธฐ๋Šฅ
  • ํ™˜๊ฒฝ๋ณ€์ˆ˜ : ๋กœ์ปฌ,๊ฐœ๋ฐœ,์šด์˜๋“ฑ์„ ๊ตฌ๋ถ„ํ•ด์„œ ์ฒ ;
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฒคํŠธ : ์ด๋ฒคํŠธ ๋ฐœํ–‰,๊ตฌ๋… ๋ชจ๋ธ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ง€์›
  • ํŽธ๋ฆฌํ•œ ๋ฆฌ์†Œ์Šค ์กฐํšŒ

Singleton Pattern

์šฐ๋ฆฌ๊ฐ€ ์—ฌํƒœ๊นŒ์ง€ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ์€ ์Šคํ”„๋ง์ด ์—†๋Š” ์ˆœ์ˆ˜ํ•œ DI ์ปจํ…Œ์ด๋„ˆ๋‹ค. ์ฆ‰, ์š”์ฒญ์„ ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ํ• ๋‹น์„ ํ•œ๋‹ค ๋งŒ์•ฝ ์š”์ฒญ์ด ์ดˆ ๋‹น 100์ด๋ผ๋ฉด, ์ดˆ ๋‹น 100๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ์ด ๋˜๋Š” ๊ฒƒ์ด๋ฉฐ ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ์•ผ๊ธฐํ•œ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋‹จ 1๊ฐœ๋งŒ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ Only 1๊ฐœ๋งŒ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

๋ฌธ์ œ์ 

  • ์˜์กด๊ด€๊ณ„์ƒ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌ์ฒด ํด๋ž˜์Šค์— ์˜์กดํ•œ๋‹ค -> DIP ์œ„๋ฐ˜, OCP ์œ„๋ฐ˜ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค
  • ๋‚ด๋ถ€ ์†์„ฑ ๋ณ€๊ฒฝ ๋ฐ ์ดˆ๊ธฐํ™”๊ฐ€ ์–ด๋ ต๋‹ค
  • ์ž์‹ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์–ด๋ ต๋‹ค
  • ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค

ํ•˜์ง€๋งŒ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ”„๋ง์—์„œ ์•Œ์•„์„œ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๊ทธ๋ž˜์„œ ์ด์ œ ์š”์ฒญ์ด ์˜ฌ๋•Œ๋งˆ๋‹ค ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์„ ์žฌ์‚ฌ์šฉํ•ด์„œ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ ์„ค์ •์€ ์‹ฑ๊ธ€ํ†ค์ด์ง€๋งŒ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋Š” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ์ตœ๋Œ€ํ•œ statelessํ•˜๊ฒŒ ์„ค๊ณ„ํ•ด์•ผํ•œ๋‹ค.

  • ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐ™์€ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • Therefore
    • ํŠน์ • ํด๋ผ์ด์–ธํŠธ์— ์˜์กด์ ์ธ ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค
    • ํŠน์ • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋œ๋‹ค
    • ๊ฐ€๊ธ‰์  ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค
    • ํ•„๋“œ ๋Œ€์‹  ์ž๋ฐ”์—์„œ ๊ณต์œ ๋˜์ง€ ์•Š๋Š” ,์ง€์—ญ๋ณ€์ˆ˜, ํŒŒ๋ผ๋ฉ”ํ„ฐ ,์“ฐ๋ ˆ๋“œ๋ฝ ๋“ฑ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์Šคํ”„๋ง ๋นˆ์˜ ํ•„๋“œ์—์„œ ๊ณต์œ  ๊ฐ’์„ ์„ค์ •ํ•˜๋ฉด ์ •๋ง ํฐ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šคํ”„๋ง์€ ํ•ญ์ƒ ๋ฌด์ƒํƒœ๋กœ ์„ค๊ณ„๋ฅผ ํ•˜์ž

private int price; // ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ํ•„๋“œ

public void order(String name,int price){
    System.out.println("name = " + name + ", price = " + price);
    this.price = price;
}
--> X
// private int price -> X
public int order(String name,int price){
    System.out.println("name = " + name + ", price = " + price);
    return price;
}

AppConfig <- AppConfig@CGLIB ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—๋Š” ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด๊ฐ€ AppConfig@CGLIB์ด ๋“ฑ๋ก๋œ๋‹ค.

  • ์ด ์ž„์˜์˜ ๋‹ค๋ฅธ ํด๋ž˜์Šค๊ฐ€ ์‹ฑ๊ธ€ํ†ค์ด ๋ณด์žฅ๋˜๋„๋ก ํ•ด์ค€๋‹ค.

  • @Bean์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ๋งˆ๋‹ค ์ด๋ฏธ ์Šคํ”„๋ง ๋นˆ์ด ์กด์žฌํ•˜๋ฉด ์กด์žฌํ•˜๋Š” ๋นˆ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์Šคํ”„๋ง ๋นˆ์ด ์—†์œผ๋ฉด ์ƒ์„œ์•ป์„œ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.

  • @Configuration ์—†์ด @Bean๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์ˆœ์ˆ˜ํ•œ ๊ฐ์ฒด์ธ AppConfig ๊ฐ์ฒด๊ฐ€ ๋“ฑ๋ก์ด ๋œ๋‹ค -> ์‹ฑ๊ธ€ํ†ค์ด ๊นจ์ง„๋‹ค ( ๋ณด์žฅ์ด ์•ˆ๋œ๋‹ค) : ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ํ•„์š”ํ•ด์„œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ๋•Œ -> ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ ๊ทธ๋ƒฅ ์„ค์ • ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๊ณณ์—๋Š” ํ•ญ์ƒ Configuration์„ ๋„ฃ์ž

ํ•˜๋‹ค๊ฐ€ ๋ฐœ๊ฒฌํ•œ ํฅ๋ฏธ๋กœ์šด ์ 

ConfigurationTest๋ฅผ ํ•˜๋‹ค๊ฐ€ ๊ฐ•์˜ ์ฒ˜๋Ÿผ memberRepository๊ฐ€ ๋™์ผํ•˜์ง€ ์•Š๊ณ  ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ๋‚˜์™”์—ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ญ์˜€๋Š”์ง€ ์ฐพ๋‹ค๊ฐ€ ๋‚˜์˜ AppConfig ํด๋ž˜์Šค์—์„œ MemberRepository๊ฐ€ static์œผ๋กœ ์„ ์–ธ์ด ๋˜์–ด์žˆ์—ˆ๋‹ค(์˜คํƒ€์˜€๋‹ค)

๋ฌผ๋ก  @Bean์„ ์“ฐ๊ณ  ๋ฐ‘์— static์„ ์“ฐ๋Š” ๊ฒฝ์šฐ๋Š” ์—†์„ ๊ฒƒ์ด๋‹ค. static์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์ด๊ณ  @Bean์— ๋“ฑ๋ก์„ ํ•˜๋Š” ๊ฒƒ์€ ๋Ÿฐํƒ€์ž„์‹œ์— ๊ฒฐ์ •์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ static์œผ๋กœ ๋œ ๋ฉ”์†Œ๋“œ๋Š” @Bean์„ ์จ๋„ proxy๋˜์ง€๊ฐ€ ์•Š์•„์„œ ์šฐํšŒํ•ด์„œ ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๊ทธ๋ž˜์„œ ์˜์กด์„ฑ ์ฃผ์ž…์ด ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค.


์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์˜์กด๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž… ์—ฌํƒœ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” @Bean์ด๋‚˜ XML์„ ํ†ตํ•ด ์„ค์ • ์ •๋ณด์— ์ง์ ‘ ๋“ฑ๋กํ•  ์Šคํ”„๋ง ๋นˆ์„ ๋‚˜์—ดํ–ˆ์—ˆ๋‹ค.

์Šคํ”„๋ง์— ๋นˆ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ๋ฐ˜๋ณต ์ฝ”๋“œ๋„ ๋งŽ์•„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง์—์„œ ์ž๋™์œผ๋กœ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ์‚ฌ์šฉํ•ด๋ณด์ž.

  • @Configuration ์•„๋ž˜์— @ComponentScan์„ ์ถ”๊ฐ€ํ•˜์ž ์—ฌํƒœ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฃฌ ์˜ˆ์ œ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ @Configuration์ด ์žˆ๋Š”๋ฐ ์ด ๊ฒƒ๋„ ์Šค์บ”๋˜๋ฉด์„œ ๋“ฑ๋ก์ด ๋˜๋ฏ€๋กœ ๋นผ์ฃผ์–ด์•ผํ•œ๋‹ค

-> excludeFilters = @ComponentScan.Filter(type= FilterType./ANNOTATION/,classes = Configuration.class)

  • @Component๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์Šค์บ”ํ•ด์„œ Bean์— ๋“ฑ๋กํ•œ๋‹ค
  • ์šฐ๋ฆฌ๋Š” ์›๋ž˜ AppConfig์—์„œ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž… ํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด์ œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋นˆ์— ์˜ฌ๋ฆฐ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…์€ ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„ ๊นŒ??

-> ์ž๋™ ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์ƒ์„ฑ์ž์— @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

  • ์Šคํ”„๋ง ๋นˆ์˜ ๊ธฐ๋ณธ์ด๋ฆ„์€ ํด๋ž˜์Šค๋ช…์„ ์‚ฌ์šฉํ•˜๋˜ ๋งจ ์•ž๊ธ€์ž๋งŒ ์†Œ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

  • MemberServiceImpl -> memberServiceImpl

  • ์ง์ ‘ ์ง€์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค @Component(โ€œ์ด๋ฆ„โ€)

  • ์ƒ์„ฑ์ž์— @Autowired๋ฅผ ์ง€์ •ํ•˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด๋‹น ์Šคํ”„๋ง ๋นˆ์„ ์ฐพ์•„์„œ ์ฃผ์ž…ํ•œ๋‹ค.

  • ๊ธฐ๋ณธ ์กฐํšŒ ์ „๋žต์€ ํƒ€์ž…์ด ๊ฐ™์€ ๋นˆ์„ ์ฐพ๋Š”๋‹ค.

  • ์ž๋™ ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ์‹œ basePackages๋ฅผ ํ†ตํ•ด ์Šค์บ” ์‹œ์ž‘ํ•˜๋Š” ์œ„์น˜๋ฅผ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์—†์œผ๋ฉด ๋ชจ๋“  ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ๋‹ค ํƒ์ƒ‰ํ•ด์•ผํ•œ๋‹ค.

  • basePackagesClass๋ฅผ ํ†ตํ•ด ํŠน์ • ํด๋ž˜์Šค๋ถ€ํ„ฐ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค

    • ๋งŒ์•ฝ์— ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด?? -> @ComponentScan์„ ๋ถ™์ธ ํŒจํ‚ค์ง€๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ์„ค์ • ์ •๋ณด ํด๋ž˜์Šค์˜ ์œ„์น˜๋ฅผ ํ”„๋กœ์ ํŠธ ์ตœ์ƒ๋‹จ์— ๋‘๋Š” ๊ฒƒ

์ฒ˜์Œ์— ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๋ฉด ์ตœ์ƒ๋‹จ์— ์žˆ๋Š” CoreApplication์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์— SpringbootApplication์ด ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์— ๋“ค์–ด๊ฐ€๋ณด๋ฉด ComponentScan์ด ์กด์žฌํ•œ๋‹ค.

์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๊ธฐ๋ณธ ๋Œ€์ƒ

  • @Component : ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์— ์‚ฌ์šฉ
  • @Controller : ์Šคํ”„๋ง MVC ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‚ฌ์šฉ
  • @Service: ์Šคํ”„๋ง ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ์‚ฌ์šฉ
  • @Reposiotry : ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต์—์„œ ์‚ฌ์šฉ
  • @Configuration : ์Šคํ”„๋ง ์„ค์ • ์ •๋ณด์—์„œ ์‚ฌ์šฉ

์ž๋™ ๋นˆ ๋“ฑ๋ก vs ์ž๋™ ๋นˆ ๋“ฑ๋ก -> ์ถฉ๋Œ ์ˆ˜๋™ ๋นˆ ๋“ฑ๋ก vs ์ž๋™ ๋นˆ ๋“ฑ๋ก -> ์ˆ˜๋™ ๋นˆ์ด ์šฐ์„ ๊ถŒ์„ ๊ฐ€์ง„๋‹ค ์ž๋™๋นˆ์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•ด๋ฒ„๋ฆฐ๋‹ค.

์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•

  1. ์ƒ์„ฑ์ž ์ฃผ์ž…: ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ์ ์— 1๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅ. ์ƒ์„ฑ์ž๊ฐ€ ๋‹จ ํ•œ๊ฐœ๋งŒ ์žˆ์œผ๋ฉด @Autowired๋ฅผ ๋นผ๋„ ๋œ๋‹ค.
  2. ์ˆ˜์ •์ž(Setter) ์ฃผ์ž… : ์›๋ž˜ ํ•„๋“œ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ๋Š” setํ•„๋“œ๋ช…์œผ๋กœ ์“ด๋‹ค. ์—ฌ๊ธฐ์— Autowired๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์„ ํƒ, ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
  3. ํ•„๋“œ ์ฃผ์ž… : ์‹ค์ œ ํ•„๋“œ์— ๋ฐ”๋กœ ์ฃผ์ž…์„ ์‹œํ‚ค๋Š” ๊ฒƒ. ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด ํ…Œ์ŠคํŠธํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.
  4. ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž…

  • ์ฃผ์ž…ํ•  ์Šคํ”„๋ง ๋นˆ์ด ์—†์–ด๋„ ๋™์ž‘ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.
  1. @Autowired(required = false)๋กœ ์ง€์ •
    • ์˜์กด๊ด€๊ณ„๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์†Œ๋“œ ์ž์ฒด๊ฐ€ ํ˜ธ์ถœ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
  2. @Nullable : ํ˜ธ์ถœ์€ ๋˜์ง€๋งŒ ๋ฐ˜ํ™˜ ๊ฐ’์€ null
  3. @Optional<> : Optional.empty

์™œ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•˜๋Š”๊ฐ€?

๋ถˆ๋ณ€ ๋จผ์ € ๋Œ€๋ถ€๋ถ„์˜ ์˜์กด๊ด€๊ณ„๋Š” ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ์ „๊นŒ์ง€ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๊ฒŒ ์ข‹๋‹ค.

์ˆ˜์ •์ž ์ฃผ์ž…์œผ๋กœ ์˜์กด๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋ฉด ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ public์œผ๋กœ ๊ณต๊ฐœ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.

๋ˆ„๋ฝ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜์ •์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์ฝ”๋“œ ํ…Œ์ŠคํŠธ์—์„œ ๊ฐ ์ฝ”๋“œ์˜ ์˜์กด์„ฑ์„ ์•Œ์•„๋ณด๊ธฐ ์–ด๋ ต๋‹ค.

๋งŒ์•ฝ์— ์ƒ์„ฑ์ž ์ฃผ์ž…์œผ๋กœ ๊ตฌ์„ฑ์ด ๋˜์–ด์žˆ๋‹ค๋ฉด ์ปดํŒŒ์ผ ๋‹จ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋œฐ ๊ฒƒ์ด๋‹ค.

final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค final ํ‚ค์›Œ๋“œ๋Š” ํ•œ๋ฒˆ๋งŒ ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ํ†ตํ•ด final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋”ฐ. ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ์ž์—์„œ ์ฝ”๋“œ๊ฐ€ ๋ˆ„๋ฝ์ด ๋˜์—ˆ๋‹ค๋ฉด ๋‚ด๊ฐ€ ํ•ด๋‹น ์ƒ์„ฑ์ž ๋ณ€์ˆ˜๋ฅผ final๋กœ ์ง€์ •ํ–ˆ์œผ๋ฉด ์ปดํŒŒ์ผ ๋‹จ์—์„œ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


Lombok ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ getter๋‚˜ setter ์ฝ”๋“œ๋ฅผ ์งœ์ง€ ๋ง์ž.

  • @Getter, @Setter ์‚ฌ์šฉํ•˜๋ฉด ๋!!!
  • @RequiredArgsConstructor : ๋‚ด ํด๋ž˜์Šค ๋‚ด์— final ๋ณ€์ˆ˜๋“ค์„ ๊ฐ€์ง€๊ณ  ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.
    • ์ด ๋•Œ ๋ณ€์ˆ˜ ๋‚˜์—ดํ•˜๋Š” ๊ฑฐ์— ์œ ์˜ํ•ด์•ผ ํ•  ๋“ฏ. ๋‚ด๊ฐ€ ๋ณ€์ˆ˜ ๋‚˜์—ดํ•œ ๋Œ€๋กœ ์ƒ์„ฑ์ž๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ ํ˜ธ์ถœํ•  ์‹œ ํ•ด๋‹น ์ˆœ์„œ๋Œ€๋กœ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.

์กฐํšŒํ•œ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ผ ๋•Œ

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์—ˆ๋˜ DiscountPolicy๋ฅผ ๋ณด๋ฉด ํ•ด๋‹น ์ถ”์ƒํ™”์˜ ๊ตฌํ˜„์ฒด๋กœ RateDiscountPolicy์™€ FixDiscountPolicy๊ฐ€ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‘ ์ •์ฑ…์„ @Component๋กœ ๋“ฑ๋ก์„ ํ•˜๋ฉด ์กฐํšŒ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค.

์œ„ ๋ฌธ์ œ๋ฅผ ํ•˜์œ„ ํƒ€์ž…์„ ์ง์ ‘ ์ง€์ •ํ•ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ฒ ์ง€๋งŒ -> ์ด๊ฒƒ์€ DIP๋ฅผ ์œ„๋ฐ˜ํ•˜๊ณ  ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

  1. @Autowired ํ•„๋“œ ๋ช… ๋งค์นญ Autowired๋Š” ๋จผ์ € ํƒ€์ž… ๋งค์นญ์„ ์‹œ๋„ํ•˜๊ณ , ์ด๋•Œ ์—ฌ๋Ÿฌ ๋นˆ์ด ์žˆ์œผ๋ฉด ํ•„๋“œ ๋ช…, ํŒŒ๋ผ๋ฉ”ํ„ฐ ๋ช…์œผ๋กœ ๋นˆ ์ด๋ฆ„์„ ์ถ”๊ฐ€ ๋งค์นญํ•œ๋‹ค.

์ฆ‰ ์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฉ”ํ„ฐ ๋ช…์„ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค. discountPolicy -> rateDiscountPolicy 2. @Qualifier -> @Qualifier๋ผ๋ฆฌ ๋งค์นญ ์ถ”๊ฐ€ ๊ตฌ๋ถ„์ž๋ฅผ ๋ถ™์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•. ์ถ”๊ฐ€์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด์ง€ ๋นˆ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. 3. @Primary ์‚ฌ์šฉ : ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•. ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด์žˆ๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ๋นˆ์œผ๋กœ ์„ ํƒ๋œ๋‹ค.

์ฝ”๋“œ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปค๋„ฅ์…˜์„ ํš๋“ํ•˜๋Š” ์Šคํ”„๋ง ๋นˆ์ด ์žˆ๊ณ , ์ฝ”๋“œ์—์„œ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐ€๋” ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์„ ํš๋“ํ•˜๋Š” ์Šคํ”„๋ง ๋นˆ์ด ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ๋ฉ”์ธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ @Primary, ์„œ๋ธŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” @Qualifier๋ฅผ ์ง€์ •ํ•ด์„œ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„์˜ ๊ฒฝ์šฐ Quailfier๊ฐ€ ๋” ๋†’๋‹ค.

  • Qualifier(โ€œ์ด๋ฆ„โ€) ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์  ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ํƒ€์ž„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๊ฒ€์ถœ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฆ„์ด ์ž˜๋ชป๋“ค์–ด๊ฐ€๋„ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์ด๋ฆ„์„ Annotation์œผ๋กœ ์ •์˜๋ฅผ ํ•˜๋ฉด๋œ๋‹ค.

๊ทธ ๋’ค๋กœ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด ํ•„์š”ํ•œ ํด๋ž˜์Šค๋‚˜ ํ•„๋“œ์— @์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

Annotation์€ ์ƒ์†์˜ ๊ฐœ๋…์ด ์—†๋‹ค. ๊ทธ๋ƒฅ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ•ฉ์ณ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์Šคํ”„๋ง์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์กฐํšŒํ•œ ๋นˆ์ด ๋ชจ๋‘ ํ•„์š”ํ•  ๋•Œ, List, Map

์œ„์˜ ์˜ˆ์‹œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ• ์ธ ์ •์ฑ…์ด 2๊ฐœ ๋‹ค ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

static class DiscountService {
    private final Map<String, DiscountPolicy> policyMap;
    private final List<DiscountPolicy> policies;

    @Autowired
    public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
        this.policyMap = policyMap;
        this.policies = policies;
        System.out.println("policyMap = " + policyMap);
        System.out.println("policies = " + policies);
    }

    public int discount(Member member,int price ,String discountCode){
        DiscountPolicy discountPolicy = policyMap.get(discountCode);
        return discountPolicy.discount(member, price);
    }
}
Map์„ ์‚ฌ์šฉํ•ด์„œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ๋ฐ›์„ ๋•Œ 2๊ฐœ์˜ ํ• ์ธ ์ •์ฑ… ๋นˆ์„ ๋ชจ๋‘ ๋ฐ›๊ณ , ํŠน์ • ๋นˆ์„ ์ฐพ์„ ๋•Œ๋Š” Map.get์„ ํ†ตํ•ด ์ฐพ๋Š”๋‹ค.

์ž๋™ vs ์ˆ˜๋™ ๋นˆ ๋“ฑ๋ก

๋จผ์ € ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—…๋ฌด์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—…๋ฌด๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

  1. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋นˆ : ์›น์„ ์ง€์›ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ, ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์žˆ๋Š” ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ ๊ณ„์ธต์˜ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋“ฑ์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋œ๋‹ค.
  2. ๊ธฐ์ˆ  ์ง€์› ๋นˆ: ๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ๋‚˜ ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ(AOP)๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๊ณตํ†ต ๋กœ๊ทธ ์ฒ˜๋ฆฌ ์ฒ˜๋Ÿผ ์—…๋ฌด ๋กœ์ง์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋ถ€ ๊ธฐ์ˆ ์ด๋‚˜ ๊ณตํ†ต ๊ธฐ์ˆ ์ด๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ๊ฒฝ์šฐ, ์–ด๋А ์ •๋„ ์œ ์‚ฌํ•œ ํŒจํ„ด์ด ์žˆ์–ด์„œ, ์ž๋™ ๊ธฐ๋Šฅ์„ ์ ๊ทน ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ๊ธฐ์ˆ  ์ง€์› ๋กœ์ง์€ ์ˆ˜๊ฐ€ ์ ๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ „๋ฐ˜์— ๊ฑธ์ณ์„œ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋งŒ, ์ ์šฉ์ด ์ž˜ ๋˜๊ณ  ์žˆ๋Š” ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ ๊ฐ€๊ธ‰์  ์ˆ˜๋™ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ๋ฌผ๋ก  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ๋„ ๋‹คํ˜•์„ฑ์„ ์ ๊ทน ํ™œ์šฉํ•œ๋‹ค๋ฉด ์ˆ˜๋™ ๋นˆ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด DiscountService์˜ ์ฝ”๋“œ๋งŒ ๋ณด๊ณ  ํ• ์ธ ์ •์ฑ…์— ๋ฌด์Šจ ์ •์ฑ…์ด ์žˆ๋Š” ์ง€ ํ•œ๋ฒˆ์— ์•Œ์•„์ฐจ๋ฆฌ๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ์ด๋Ÿด ๋•Œ ์ˆ˜๋™์œผ๋กœ 2๊ฐœ์˜ ํ• ์ธ ์ •์ฑ…์„ ๋“ฑ๋กํ•ด์„œ ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ณ , ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ํŠน์ • ํŒจํ‚ค์ง€์— ๊ฐ™์ด ๋ฌถ์–ด ๋‘๋Š”๊ฒƒ์ด ์ข‹๋‹ค.


์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฒคํŠธ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ -> ์Šคํ”„๋ง ๋นˆ ์ƒ์„ฑ -> ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… -> ์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ -> ์‚ฌ์šฉ -> ์†Œ๋ฉธ ์ „ ์ฝœ๋ฐฑ -> ์Šคํ”„๋ง ์ข…๋ฃŒ

? : ๊ทธ๋ƒฅ ์ƒ์„ฑ์ž์— ๋‹ค ๋•Œ๋ ค ๋ฐ•์œผ๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€์š”?? -> ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”๋ฅผ ๋ถ„๋ฆฌํ•ฉ์‹œ๋‹ค!!!

  • ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒ์„ฑ ์‹œ์ ์— ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€๋งŒ ํ”„๋กœํ† ํƒ€์ž… ์Šคํ”„๋ง ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋นˆ์„ ์กฐํšŒํ•  ๋•Œ ์ƒ์„ฑ๋˜๊ณ , ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋„๋„ ์‹คํ–‰๋œ๋‹ค.
  • ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋นˆ์˜ ์ข…๋ฃŒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€๋งŒ, ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๊ณผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…, ๊ทธ๋ฆฌ๊ณ  ์ดˆ๊ธฐํ™” ๊นŒ์ง€๋งŒ ๊ด€์—ฌํ•˜๊ณ  ์ดํ›„ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ @PreDestroy ๊ฐ™์€ ์ข…๋ฃŒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰ ๋˜์ง€ ์•Š๋Š”๋‹ค.

ํ”„๋กœํ† ํƒ€์ž… ๋นˆ

  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์š”์ฒญํ•  ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ
  • ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์˜ ์ƒ์„ฑ๊ณผ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…, ๊ทธ๋ฆฌ๊ณ  ์ดˆ๊ธฐํ™”๊นŒ์ง€๋งŒ ๊ด€์—ฌํ•œ๋‹ค.
  • ์ข…๋ฃŒ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์‹ฑ๊ธ€ํ†ค ๋นˆ์ด ํ”„๋กœํ† ํƒ€์ž… ๋นˆ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์„๊นŒ? -> ObjectProvider<>์„ ์‚ฌ์šฉํ•˜์ž ObjectProvider์˜ getObject()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‚ด๋ถ€์—์„œ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋นˆ์„ ์ฐพ์•„์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.(โ€œDependency Lookupโ€)

-> Provider๋ฅผ ์‚ฌ์šฉํ•˜์ž (JSP-330) : provider.get()

์›น ์Šค์ฝ”ํ”„

  • ์›น ํ™˜๊ฒฝ์—์„œ๋งŒ ๋™์ž‘
  • ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ์ข…๋ฃŒ ์‹œ์ ๊นŒ์ง€ ๊ด€๋ฆฌ๋ฅผ ํ•ด์„œ ์ข…๋ฃŒ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.

์ข…๋ฅ˜

  • Request : HTTP ์š”์ฒญ ํ•˜๋‚˜๊ฐ€ ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐˆ ๋•Œ ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์Šค์ฝ”ํ”„, ์š”์ฒญ๋งˆ๋‹ค ๋ณ„๋„์˜ ๋นˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ
  • Session : HTTP Session๊ณผ ๋™์ผ ์ƒ๋ช… ์ฃผ๊ธฐ
  • Application : ์„œ๋ธ”๋ฆฟ ์ปจํ…์ŠคํŠธ์™€ ๋™์ผ ์ƒ๋ช… ์ฃผ๊ธฐ
  • Websocket : ์›น ์†Œ์ผ“๊ณผ ๋™์ผํ•œ ์ƒ๋ช… ์ฃผ๊ธฐ

UUID : Universally Unique Identifier : ์‚ฌ์šฉ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ID, ๊ฒน์น  ์ผ์ด ์—†๋‹ค

  • @Scope(โ€œrequestโ€) : ๋นˆ์€ HTTP ์š”์ฒญ ๋‹น ํ•˜๋‚˜์”ฉ ์ƒ์„ฑ๋˜๊ณ , HTTP ์š”์ฒญ์ด ๋๋‚˜๋Š” ์‹œ์ ์— ์ข…๋ฃŒ๋œ๋‹ค.

์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  @Scope(โ€œrequestโ€)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚  ๊ฒƒ์ด๋‹ค. WHY? : ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์— ์‹ฑ๊ธ€ํ†ค ๋นˆ์€ ์ƒ์„ฑํ•ด์„œ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, request ์Šค์ฝ”ํ”„ ๋นˆ์€ ์•„์ง ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค(์กฐํšŒ ์‹œ ์ƒ์„ฑ!!). ์ด ๋นˆ์€ ์‹ค์ œ ๊ณ ๊ฐ์˜ ์š”์ฒญ์ด ์™€์•ผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ์•ˆ

  1. Provider : provider๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋นˆ์„ ์š”์ฒญํ•˜๋Š” ์‹œ๊ฐ„์„ ์ง€์—ฐ์‹œํ‚ค์ž.
  2. ProxyMode : ํ”„๋ก์‹œ๋ชจ๋“œ๋กœ ์„ค์ •ํ•˜๋ฉด ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํด๋ž˜์Šค์˜ ๊ฐ€์งœ ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‘๊ณ  HTTP request์™€ ์ƒ๊ด€ ์—†์ด ๊ฐ€์งœ ํ”„๋ก์‹œ ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ ๋นˆ์— ๋ฏธ๋ฆฌ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) : ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” CGLIB ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ, ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์€ ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.(๋‹คํ˜•์„ฑ์˜ ์›๋ฆฌ!)
  • ๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์š”์ฒญ์ด ์˜ค๋ฉด ๊ทธ ๋•Œ ๋‚ด๋ถ€์—์„œ ์ง„์งœ ๋นˆ์„ ์š”์ฒญํ•˜๋Š” ์œ„์ž„ ๋กœ์ง์ด ์žˆ๋‹ค

์ด๋ฒˆ ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ...

์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ง  ๋‹ค์Œ ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์›์น™์„ ์ง€ํ‚ค๋Š” ๊ฒƒ๊ณผ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ž๋™ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์›์น™์„ ์ง€ํ‚ค๋Š” ๊ฒƒ์—๋Š” ๊ต‰์žฅํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๋˜ํ•œ ์Šคํ”„๋ง์ด ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐœ๋ฐœํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ์ตœ๋Œ€ํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ธ์ƒ ๊นŠ์—ˆ๋‹ค.

๋ชจ๋“  ๊ธฐ๋Šฅ์— DI(I0C)๋‚˜ OCP ๋“ฑ์˜ ๊ฐœ๋…์ด ์ „๋ฐ˜์ ์œผ๋กœ ๋‹ค ์ ์šฉ์ด ๋˜์–ด์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์ฒ˜์Œ์— ์Šคํ”„๋ง ์ž…๋ฌธ + MVC ๊ฐ•์˜๋ฅผ ๋“ค์—ˆ์„ ๋•Œ Controller -> Service -> Repository ํŒจํ„ด์œผ๋กœ ์งœ๊ณ  @์ด๋Ÿฐ๊ฑฐ๋ฅผ ๋ถ™์ด๋ฉด ์•Œ์•„์„œ ๋‹ค ์—ฐ๊ฒฐ๋˜๋Š” ๊ณผ์ •์ด ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ€๊ณ  ๋‹จ์ˆœํžˆ ์Šคํ”„๋ง์ด ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค ์ •๋„๋กœ๋งŒ ์ดํ•ดํ–ˆ๋Š”๋ฐ, ์ด๋ฒˆ ๊ฐ•์˜๋ฅผ ํ†ตํ•ด ์ข€ ๋” ๊นŠ์€ ์Šคํ”„๋ง์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋ฉด์„œ ์™œ, ์–ด๋–ป๊ฒŒ ํ•ด๋‹น ๊ธฐ๋Šฅ๋“ค์„ ์ง€์›ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ํ•™์Šตํ•ด์„œ ๋‹ค์‹œ ์ถ”ํ›„์— MVC ํŒจํ„ด๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ๋ฐฐ์šธ ๋•Œ ๋ณด๋‹ค ์ˆ˜์›”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

์ด๋ฒˆ์— ํ•™์Šตํ•˜๋ฉด์„œ ์ดˆ์ ์„ ๋‘” ํฌ์ธํŠธ๋Š” why ์˜€๋‹ค. ํ•ด๋‹น ๊ธฐ์ˆ ์ด ์™œ ๋“ฑ์žฅํ•˜๊ณ , ์™œ ์ด๋Ÿฌํ•œ ๊ฐœ๋…์„ ์ ์šฉ์‹œํ‚ค๊ณ , ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋“ฑ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•œ๋‹ค.

  1. ์ž๋ฐ”์™€ ๊ฐ™์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ทผ๋ณธ์ ์ธ ์›์น™์„ ์ค€์ˆ˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐœ์ž์˜ ๋ถ€๋‹ด์„ ๋œ์–ด์ค€๋‹ค
  2. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ, ๋นˆ ๋“ฑ์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ด€๋ฆฌ๋ฅผ ๋ณด๋‹ค ์ˆ˜์›”ํ•˜๊ฒŒ ํ•ด์ฃผ๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์ฃผ์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™•์žฅ์„ฑ์— ๊ธฐ์—ฌ๋ฅผ ํ•ด์ค€๋‹ค.

์•„์ง ๋ฐฑ์—”๋“œ ์–ธ์–ด๋กœ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์„(ํŒŒ์ด์ฌ,,) ์‚ฌ์šฉํ•ด๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์Šคํ”„๋ง์„ ๋ฐฐ์šฐ๋ฉด์„œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋งค๋ ฅ์— ๋น ์ ธ๋“ค์–ด ๊ณ„์† ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.