• [Spring] ๊น€์˜ํ•œ ์Šคํ”„๋ง ํ•ต์‹ฌ์›๋ฆฌ <์„น์…˜1.๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง> ์ •๋ฆฌ

    2023. 10. 4.

    by. @leeeun

     

    ์„น์…˜1. ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง

     

    ์Šคํ”„๋ง์˜ ํƒ„์ƒ (์‹œ๋Œ€์  ๋ฐฐ๊ฒฝ)

    • EJB (Enterprise Java Beans) → ์Šคํ”„๋ง+JPA, ์ž๋ฐ” ์ง„์—ฌ์˜ ํ‘œ์ค€ ๊ธฐ์ˆ 
    • ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ , ์„ค์ •์— ์˜ํ•œ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ,๋ถ„์‚ฐ๊ธฐ์ˆ ์˜ ์ง€์› ๊ฐ•์ 
    • Entity Bin ๊ธฐ์ˆ , ORM๊ธฐ์ˆ ๋„ ๋ณด์œ 
    • But ๊ฐ€๊ฒฉ์ด.. ๋น„์Œˆ.. ๋ณต์žกํ•˜๊ณ  ์–ด๋ ค์›€ ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ
    • ORM๊ธฐ์ˆ  : ์ฟผ๋ฆฌ ์—†์ด ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ DB์— ํŽธํ•˜๊ฒŒ ์ €์žฅํ•˜๊ณ  ๊บผ๋‚ด๋Š” ๊ธฐ์ˆ  ⇒ NTTB

     

    POJO (Plan Old Java Object) → ์˜ค๋ž˜๋œ ๋ฐฉ์‹์˜ ์ž๋ฐ” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ž๋Š” ์›€์ง์ž„๋„ ๋ฐœ์ƒ

    ⇒ EJB์˜ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ฐœ๋ฐœ

    ⇒ ์Šคํ”„๋ง, ํ•˜์ด๋ฒ„๋„ค์ดํŠธ(Hibernate) ์˜ ๋“ฑ์žฅ

    EJB → Hibernate → JPA (ํ•˜์ด๋ฒ„๋„ค์ดํŠธ์™€ ์œ ์‚ฌ)

    ๋Œ€๋ถ€๋ถ„ ์ž๋ฐ” ์ง„์˜์˜ ORM์€ JPA๊ฐ€, ๊ตฌํ˜„์ฒด๋Š” ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๊ฐ€ ์ฐจ์ง€

     

    ์Šคํ”„๋ง์˜ ์—ญ์‚ฌ

    • 2002๋…„ ๋กœ๋“œ ์กด์Šจ์˜ ์ฑ… → EJB ์—†์ด๋„ ์ถฉ๋ถ„ํžˆ ๊ณ ํ’ˆ์งˆ์˜ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๊ณ , ์‚ผ๋งŒ๋ผ์ธ ์ด์ƒ์˜ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์„ ์˜ˆ์ œ ์ฝ”๋“œ๋กœ ์„ ๋ณด์ž„
    • Juergen Hoeller(์œ ๊ฒ ํœ ๋Ÿฌ), Yann Caroff(์–€ ์นด๋กœํ”„)๊ฐ€ ๋กœ๋“œ ์กด์Šจ์—๊ฒŒ ์˜ค ํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ์•ˆ
    • ์Šคํ”„๋ง ์ด๋ฆ„์€ ์ „ํ†ต์ ์ธ J2EE(EJB)๋ผ๋Š” ๊ฒจ์šธ์„ ๋„˜์–ด ์ƒˆ๋กœ์šด ์‹œ์ž‘์ด๋ผ๋Š” ๋œป

    ์Šคํ”„๋ง์ด๋ž€?

    ์Šคํ”„๋ง⇒ ํŠน์ •ํ•œ ํ•˜๋‚˜์˜ ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ์ˆ ๋“ค์˜ ๋ชจ์Œ

    • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ - ํ•ต์‹ฌ
    • ์Šคํ”„๋ง ๋ถ€ํŠธ - ์Šคํ”„๋ง ๊ธฐ์ˆ ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ธฐ์ˆ .
    • ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ - DB์˜ CRUD๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ์ˆ  ex) JPA
    • ์Šคํ”„๋ง ์„ธ์…˜ - ์„ธ์…˜ ๊ธฐ๋Šฅ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก
    • ์Šคํ”„๋ง ๋ฐฐ์น˜ - ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์— ํŠนํ™”๋œ ๊ธฐ์ˆ 
    • ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ - ๋ณด์•ˆ ๊ด€๋ จ
    • ์Šคํ”„๋ง Rest Docs - API๋ฌธ์„œ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ์—ฎ์–ด ๋ฌธ์„œํ™”๋ฅผ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ
    • ์Šคํ”„๋ง ํด๋ผ์šฐ๋“œ

     

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

    • ํ•ต์‹ฌ ๊ธฐ์ˆ : ์Šคํ”„๋ง DI ์ปจํ…Œ์ด๋„ˆ, AOP, ์ด๋ฒคํŠธ, ๊ธฐํƒ€
    • ์›น ๊ธฐ์ˆ : ์Šคํ”„๋ง MVC, ์Šคํ”„๋ง WebFlux
    • ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ : ํŠธ๋žœ์žญ์…˜, JDBC, ORM ์ง€์›, XML ์ง€์›
    • ๊ธฐ์ˆ  ํ†ตํ•ฉ: ์บ์‹œ, ์ด๋ฉ”์ผ, ์›๊ฒฉ์ ‘๊ทผ, ์Šค์ผ€์ค„๋งํ…Œ์ŠคํŠธ: ์Šคํ”„๋ง ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์ง€์›
    • ์–ธ์–ด: ์ฝ”ํ‹€๋ฆฐ, ๊ทธ๋ฃจ๋น„

    ์ตœ๊ทผ์—๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ํ†ตํ•ด์„œ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ธฐ์ˆ ๋“ค์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉ

     

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

    • ์Šคํ”„๋ง์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›, ์ตœ๊ทผ์—๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ
    • ๋‹จ๋…์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑ
    • Tomcat ๊ฐ™์€ ์›น ์„œ๋ฒ„๋ฅผ ๋‚ด์žฅํ•ด์„œ ๋ณ„๋„์˜ ์›น ์„œ๋ฒ„๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋จ ⇒ ์ด์ „์—๋Š” ๋นŒ๋“œ/ ์„œ๋ฒ„๋ฅผ ๋ณ„๋„ ์„ค์น˜.. ๋ณต์žกํ•œ ๊ณผ์ •
    • ์†์‰ฌ์šด ๋นŒ๋“œ ๊ตฌ์„ฑ์„ ์œ„ํ•œ starter ์ข…์†์„ฑ ์ œ๊ณต ⇒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฌถ์–ด์„œ ๊ฐ™์ด ๋–™๊ธธ ์ˆ˜ ์žˆ๋„๋ก starter๊ฐ€ ์ œ๊ณต
    • ์Šคํ”„๋ง๊ณผ 3rd party(์™ธ๋ถ€) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž๋™ ๊ตฌ์„ฑ ⇒ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์— ๋งž๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์ •ํ•ด์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก
    • ๋ฉ”ํŠธ๋ฆญ, ์ƒํƒœ ํ™•์ธ, ์™ธ๋ถ€ ๊ตฌ์„ฑ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ์ค€๋น„ ๊ธฐ๋Šฅ ์ œ๊ณต ⇒ ์šด์˜ํ™˜๊ฒฝ์—์„œ์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ
    • ๊ด€๋ก€์— ์˜ํ•œ ๊ฐ„๊ฒฐํ•œ ์„ค์ • ⇒ default ์„ค์ •๊ณผ ๋ฉ”๋‰ด์–ผ ์กด์žฌ. ํ•„์š”ํ•  ๋•Œ๋งŒ custormize

    ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์„œ ๋‚˜๋จธ์ง€ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ๋‹น๊ฒจ์™€์„œ ์‚ฌ์šฉ์„ ๋„์™€์ฃผ๋Š” ๊ธฐ์ˆ 

    • JUnit test๊ด€๋ จ ์–ด๋–ค ์žฅ์ ์ด ์žˆ๋Š”์ง€?
      • ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ž€?
      ํŠน์ • ์†Œ์Šค์ฝ”๋“œ์˜ ๋ชจ๋“ˆ์ด ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ์ด๋‹ค.Spring์—์„œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š”๊ฒƒ์€ ์Šคํ”„๋ง ์ปค๋„ค์ด๋„ˆ์— ์˜ฌ๋ผ์™€์žˆ๋Š” Bean๋“ค์„ ํ…Œ์ŠคํŠธ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • Junit์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์›Œ, ๊ทธ ์œ„์— ์˜ฌ๋ผ๊ฐ€์žˆ๋Š” Bean์„ ํ…Œ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ฆ‰, ํ•จ์ˆ˜ ๋ฐ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š” ์ž‘์—….
    • Java์—์„œ ๋…๋ฆฝ๋œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ (Unit test)๋ฅผ ์ง€์›ํ•ด์ฃผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ.

     

    ์Šคํ”„๋ง ๋‹จ์–ด

    ๋ฌธ๋งฅ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉ

    • ์Šคํ”„๋ง DI ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ  - ์Šคํ”„๋ง ๋นˆ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ 
    • ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ์ž์ฒด
    • ์Šคํ”„๋ง ๋ถ€ํŠธ, ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๋“ฑ์„ ๋ชจ๋‘ ํฌํ•จํ•œ ์Šคํ”„๋ง ์ƒํƒœ๊ณ„

     

    ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, ์ปจ์…‰

    ํ•ต์‹ฌ ๊ฐœ๋…๊ณผ ์ปจ์…‰์„ ์ดํ•ดํ•ด์•ผ.. DB ์ ‘๊ทผ, ์›น์„œ๋ฒ„ ๋„์›Œ์ฃผ๋Š” ์šฉ๋„ ์ด๋Ÿฐ ๊ฒƒ์€ ๋‹ค ๊ฒฐ๊ณผ๋ฌผ์ด๊ณ  ํ•ต์‹ฌ์ด ์•„๋‹ˆ๋‹ค

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

    ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ์— ๋Œ€ํ•œ ์ดํ•ด → ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์ดํ•ด


    ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

     

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

    • ์ถ”์ƒํ™”
    • ์บก์Šํ™”
    • ์ƒ์†
    • ๋‹คํ˜•์„ฑ

     

    ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

    • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์„ ๋ช…๋ น์–ด์˜ ๋ชฉ๋ก์œผ๋กœ ๋ณด๋Š” ์‹œ๊ฐ์—์„œ ๋ฒ—์–ด๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ๋œ ๋‹จ์œ„, ์ฆ‰ **"๊ฐ์ฒด"**๋“ค์˜ ๋ชจ์ž„์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ
    • ํ”„๋กœ๊ทธ๋žจ์„ ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๋„๋ก ํ•จ (์ปดํฌ๋„ŒํŠธ๋ฅผ ์‰ฝ๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ) ⇒ ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํ•ต์‹ฌ์ธ ๋‹คํ˜•์„ฑ(Polymorphism)

     

    ๋‹คํ˜•์„ฑ

    • ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์™€ ๊ตฌํ˜„(์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐœ์ฒด)๋กœ ์„ธ์ƒ์„ ๊ตฌ๋ถ„

    ex) ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๋‹ค๋Š” ๊ฒƒ์œผ ๋œป ⇒ ์šด์ „์ž์™€ ์ž๋™์ฐจ์˜ ์˜ˆ์‹œ

    ์ž๋™์ฐจ๋ผ๋Š” ๊ฐ™์€ ์—ญํ• ์„ ๋‹ค์–‘ํ•œ ์ž๋™์ฐจ ๊ตฌํ˜„์ฒด๋“ค์ด ์ˆ˜ํ–‰ํ•จ

    ์ž๋™์ฐจ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์šด์ „์žํ•œํ…Œ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค!

     

    ์šด์ „์ž๋Š” ์ž๋™์ฐจ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์•Œ๊ณ  ์žˆ์Œ. ์™œ ์ž๋™์ฐจ๋ผ๋Š” ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜๋Š”๊ฐ€? ⇒ ์šด์ „์ž, ์ฆ‰ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•จ์ด๋‹ค.

    ๋‹ค๋ฅธ ๋Œ€์ƒ์œผ๋กœ ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋„ ์—ญํ• ์„ ๊ทธ๋Œ€๋กœ ์ˆ˜ํ–‰๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ์ธํ„ฐํŽ˜์ด์Šค๋‹ค! ํด๋ผ์ด์–ธํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ๊ณต ๊ฐ€๋Šฅ(์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๊ตฌ๋ถ„ํ–ˆ๊ธฐ ๋–„๋ฌธ์—) ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ž๋™์ฐจ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ์ž๋™์ฐจ๊ฐ€ ๋‚˜์™€๋„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณ€ํ•จ ์—†์–ด๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค

     

    ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌ์‹œ ์–ป๋Š” ์žฅ์ )

    ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€์ƒ ์—ญํ• ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์•Œ๋ฉด ๋จ, ๊ตฌํ˜„ ๋Œ€์ƒ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค

    ๊ตฌํ˜„ ๋Œ€์ƒ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค

    ⇒ ์ž๋ฐ”์˜ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•ด์„œ ๋ถ„๋ฆฌ

     

    ์—ญํ•  = ์ธํ„ฐํŽ˜์ด์Šค

    ๊ตฌํ˜„ = ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค, ๊ตฌํ˜„ ๊ฐ์ฒด ๊ฐ์ฒด๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ ๊ฐ์ฒด ์„ค๊ณ„์‹œ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์„ ๋จผ์ € ๋ถ€์—ฌํ•˜๊ณ , ๊ทธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด ๋งŒ๋“ค๊ธฐ

    ์ผ๋ฐ˜ ์ƒ์†๋„ ๋‹คํ˜•์„ฑ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๊ฐ€๊ธ‰์ ์ด๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค

    ๊ตฌํ˜„๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋จผ์ €๋ผ๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ

     

    ๊ฐ์ฒด์˜ ํ˜‘๋ ฅ

    • ํ˜ผ์ž ์žˆ๋Š” ๊ฐ์ฒด๋Š” ์—†๋‹ค, ์ˆ˜๋งŽ์€ ๊ฐ์ฒด๋“ค์€ ์„œ๋กœ ํ˜‘๋ ฅ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค
    • ํด๋ผ์ด์–ธํŠธ → ์š”์ฒญ, ์„œ๋ฒ„ → ์‘๋‹ต (ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ํ–‰์œ„๋ฅผ ์ˆ˜ํ–‰)

     

    ์ž๋ฐ” ์–ธ์–ด์˜ ๋‹คํ˜•์„ฑ

    • ์ž๋ฐ”์˜ ๋‹คํ˜•์„ฑ ๊ตฌํ˜„ → ์˜ค๋ฒ„๋ผ์ด๋”ฉ (๋ฉ”์„œ๋“œ, ํด๋ž˜์Šค ์žฌ์ •์˜์˜ ๊ฐœ๋…)
    • ๋‹คํ˜•์„ฑ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ์‹คํ–‰ ์‹œ์ ์— ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

    ํด๋ผ์ด์–ธํŠธ๋Š” memberRepository๋ฅผ ์˜์กด(์•Œ๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ)

    MemberRepository๋ฅผ Memory์™€ Jdbc๊ฐ€ ์˜์กดํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅ (๋‹คํ˜•์„ฑ)

    ์ด ๊ทธ๋ฆผ์€ ์ƒ์†์ด ์•ˆ ๋œ๋‹ค!!๋Š”๋ฐ ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๋จ

    • save()ํ˜ธ์ถœ ์‹œ Jdbc์˜ save()๊ฐ€ ํ˜ธ์ถœ์ด ๋จ.

     

    ๋‹คํ˜•์„ฑ์˜ ๋ณธ์งˆ

    • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ ์‹œ์ ์— ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹คํ˜•์„ฑ์˜ ๋ณธ์งˆ์€ ํ˜‘๋ ฅ!
    • ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์˜ ๊ตฌํ˜„ ๊ธฐ๋Šฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค

    ⇒ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„ค๊ณ„

    ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค!

     

    ๋‹คํ˜•์„ฑ์˜ ํ•œ๊ณ„์ 

    • ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค) ์ž์ฒด๊ฐ€ ๋ณ€ํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ, ์„œ๋ฒ„ ๋ชจ๋‘์— ํฐ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒ ⇒ ๋ณ€ํ™”๊ฐ€ ์—†๊ณ , ์•ˆ์ •์ ์œผ๋กœ ์ž˜ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”

     

    ์Šคํ”„๋ง๊ณผ ๊ฐ์ฒด ์ง€ํ–ฅ

    • ๋‹คํ˜•์„ฑ์ด ๊ฐ€์žฅ ์ค‘์š”, ์ด๋ฅผ ์Šคํ”„๋ง์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ (IoC, DI๋ฅผ ํ†ตํ•ด)

    SOLID ๋ฉด์ ‘์—๋„ ๋งŽ์ด ๋‚˜์˜ค๋Š” ์งˆ๋ฌธ!

    ๋‹คํ˜•์„ฑ+ SOLID๋ฅผ ์•Œ์•„์•ผ ์Šคํ”„๋ง์— ๋Œ€ํ•œ ์ œ๋Œ€๋กœ ๋œ ์ดํ•ด๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค!!


    ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™ (SOLID)

    SOLID

    ํด๋ฆฐ์ฝ”๋“œ๋กœ ์œ ๋ช…ํ•œ ๋กœ๋ฒ„ํŠธ ๋งˆํ‹ด์ด ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™์„ ์ •๋ฆฌ

    SRP: ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(single responsibility principle) OCP: ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open/closed principle) LSP: ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (Liskov substitution principle) ISP: ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (Interface segregation principle) DIP: ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (Dependency inversion principle)

     

    SRP(๋‹จ์ผ ์ฑ…์ž„ ์›์น™)

    • ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค
    • ์ค‘์š”ํ•œ ํŒ๋‹จ์˜ ๊ธฐ์ค€์€ ๋ณ€๊ฒฝ → ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํŒŒ๊ธ‰ ํšจ๊ณผ๊ฐ€ ์ ์œผ๋ฉด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ž˜ ๋”ฐ๋ฅธ ๊ฒƒ
    • ex) UI ํ•˜๋‚˜ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค ๊ณ ์ณ์•ผ ๋˜๋ฉด… ๊ทธ๊ฑด ์ž˜๋ชป๋œ ์„ค๊ณ„
    • ์ ์ ˆํ•œ ๋ฒ”์œ„๋ฅผ ์ž˜ ์กฐ์ ˆํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”(๋„ˆ๋ฌด ์ž‘์ง€๋„ ํฌ์ง€๋„ ์•Š๊ฒŒ)

     

    OCP ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™

    • ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์›์น™!
    • ์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค
    • ํ™•์žฅ์„ ํ•˜๋ฉด ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€? ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉ. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ธฐ์กด์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฆ„
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ ⇒ OCP ์›์น™์ด ๊บ ์ง€๋Š” ๋ฌธ์ œ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€? ๊ฐ์ฒด๋ฅผ ์ƒ์‚ฐํ•˜๊ณ  ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ณ„๋„์˜ ์กฐ๋ฆฝ์„ ํ•ด์ฃผ๋Š” ์„ค์ •์ž๊ฐ€ ํ•„์š” → ์Šคํ”„๋ง์ด ์ด๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค!

     

    LSP ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™

    • ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค
    • ๋‹จ์ˆœํ•œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌํ˜„์ฒด์— ํ•ด๋‹น๋˜๋Š” ์—‘์…€์€ ๋ฌด์กฐ๊ฑด ์•ž์œผ๋กœ ๊ฐ€์•ผ ๋œ๋‹ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ธํ„ฐํŽ˜์ด์Šค ๊ทœ์•ฝ์„ ๋งž์ถ”๋Š” ๊ฒƒ

     

    ISP ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

    • ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค
    • ๊ธฐ๋Šฅ์„ ์ ๋‹นํ•œ ํฌ๊ธฐ๋กœ ์ž˜ ์ชผ๊ฐ ๋‹ค

     

    DIP ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™

    • ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” “์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค.” ์˜์กด์„ฑ ์ฃผ์ž…์€ ์ด ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๊ตฌํ˜„ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป ⇒ ์—ญํ• ์— ์˜์กดํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ด์•ผ๊ธฐ, ๊ตฌํ˜„์— ์˜์กดํ•˜๋ฉดx
    MemberRepository m = new MemoryMemberRepository(); //๋ฉค๋ฒ„ ์„œ๋น„์Šค -> MemberRepository์—๋งŒ ์˜์กดํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ
    
    • DIP ์œ„๋ฐ˜ ⇒ ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€ ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ ๋˜๋Š”๋ฐ, ๊ตฌ์ฒดํ™”์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ฉค๋ฒ„ ๋ฆฌํŒŒ์ง€ํ† ๋ฆฌ์— ์˜์กดํ•˜๊ณ  ์žˆ์Œ! ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ

    But, ๋‹คํ˜•์„ฑ ๋งŒ์œผ๋กœ๋Š” OCP, DIP๋ฅผ ์ง€ํ‚ฌ ์ˆ˜๊ฐ€ ์—†๋‹ค! Spring์˜ ๋“ฑ์žฅ!


    ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง

    ์Šคํ”„๋ง์€ ๋‹ค์Œ ๊ธฐ์ˆ ๋กœ ๋‹คํ˜•์„ฑ + OCP, DIP๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ง€์›

    • DI(Dependency Injection): ์˜์กด๊ด€๊ณ„, ์˜์กด์„ฑ ์ฃผ์ž…
    • DI ์ปจํ…Œ์ด๋„ˆ (์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— ๋„ฃ์–ด๋†“๊ณ  ์ด ์•ˆ์—์„œ ์˜์กด๊ด€๊ณ„๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐ, ์ฃผ์ž…ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณต) ์ œ๊ณต

    ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์—†์ด ๊ธฐ๋Šฅ์„ ํ™•์žฅ

    ์ด์ƒ์ ์œผ๋กœ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋จผ์ € ๋งŒ๋“ค์–ด๋†“์œผ๋ฉด ํ•˜๋ถ€ ๊ตฌํ˜„ ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์„ ํƒ์„ ๋ฏธ๋ฃฐ ์ˆ˜ ์žˆ์–ด ๋ชจ๋“  ์„ค๊ณ„์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

    ๊ทธ๋Ÿฌ๋‚˜, ์ถ”์ƒํ™”๋ผ๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒ

    ์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ•) ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—†๋‹ค๋ฉด, ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๊ณ , ํ–ฅํ›„ ๊ผญ ํ•„์š”ํ•  ๋•Œ ๋ฆฌํŒฉํ„ฐ๋งํ•ด์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ

     

    ๋Œ“๊ธ€