DevLog ๐Ÿ˜ถ

[Spring] ์Šคํ”„๋ง์ด๋ž€? ๋ณธ๋ฌธ

Back-end/Spring

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

dolmeng2 2022. 8. 6. 16:58

- ๊น€์˜ํ•œ ๋‹˜์˜ '์Šคํ”„๋ง ํ•ต์‹ฌ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ'์„ ๋ณด๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค ๐Ÿ˜Š

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ...

www.inflearn.com

 

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

- ์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ์–ธ์–ด ํ”„๋ ˆ์ž„์›Œํฌ

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

 

 

| ๊ฐ์ฒด์ง€ํ–ฅ์ด๋ž€?

- ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ๊ธฐ๋ณธ 4๊ฐ€์ง€ ํŠน์„ฑ

    โœ” ์ถ”์ƒํ™”
    โœ” ์บก์Šํ™”
    โœ” ์ƒ์†
    โœ” ๋‹คํ˜•์„ฑ
- ๊ฐ์ฒด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์„ ์œ ์šฉํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค!
- ์œ ์—ฐํ•˜๊ณ , ๋ณ€๊ฒฝ์— ์šฉ์ดํ•˜๋‹ค.

 


| ๊ทธ๋ ‡๋‹ค๋ฉด, ๋‹คํ˜•์„ฑ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?

- ์„ธ์ƒ์„ ์—ญํ• ๊ณผ ๊ตฌํ˜„์œผ๋กœ ๋ถ„๋ฆฌํ•ด๋ณด์ž.
- ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€์ƒ์˜ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.
- ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.
- ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„, ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
- ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
    
๊ทธ๋ ‡๋‹ค๋ฉด, ์—ญํ• ๊ณผ ๊ตฌํ˜„์ด ๋„๋Œ€์ฒด ๋ฌด์—‡์„ ๋งํ•˜๋Š” ๊ฑธ๊นŒ?
    โœ” ์—ญํ•  = ์ธํ„ฐํŽ˜์ด์Šค
    โœ” ๊ตฌํ˜„ = ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ (implements) ํด๋ž˜์Šค
- ๊ตฌํ˜„๋ณด๋‹ค ์—ญํ• ์ด ๋” ์ค‘์š”ํ•˜๋‹ค!

ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญํ•˜๋Š” ์‚ฌ๋žŒ, ์„œ๋ฒ„๋Š” ์‘๋‹ตํ•˜๋Š” ์‚ฌ๋žŒ.
    - ์ˆ˜๋งŽ์€ ๊ฐ์ฒด ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ์ฒด ์„œ๋ฒ„๋Š” ํ˜‘๋ ฅ ๊ด€๋ก€๋ฅผ ๊ฐ€์ง„๋‹ค.
    - ํด๋ผ์ด์–ธํŠธ๋Š” ๋™์‹œ์— ์„œ๋ฒ„๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ํ•  ์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ.

JAVA์—์„œ์˜ ๋‹คํ˜•์„ฑ์ด๋ž€?
    - Overriding์œผ๋กœ ์ˆ˜ํ–‰. ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ.
    - ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด๋ฅผ ์‹คํ–‰ ์‹œ์ ์— ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ.
    - ๋‹น์—ฐํžˆ ํด๋ž˜์Šค์˜ ์ƒ์† ๊ด€๊ณ„์—์„œ๋„ ๋œ๋‹ค. (์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋‹ค์ค‘ ์ƒ์†๋„ ๋˜๊ณ  ์กฐ๊ธˆ ๋” ๋‚ซ๊ฒ ์ง€๋งŒ)

 


๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹คํ˜•์„ฑ์ด๋ž€
    - ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ ์‹œ์ ์— ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
    - “ํ˜‘๋ ฅ”์ด๋ผ๋Š” ๊ด€์ ์—์„œ ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ธฐ.
    - ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , ์„œ๋ฒ„์˜ ๊ตฌํ˜„ ๊ธฐ๋Šฅ์„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๋„๋ก!
    - ๋‹จ, ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๊ตฌํ˜„์—๋„ ๋‹ค ์˜ํ–ฅ์„ ๋ผ์น˜๊ธฐ ๋•Œ๋ฌธ์—, ์ดˆ๊ธฐ์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ž˜ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
    
์Šคํ”„๋ง์—์„œ ๊ฐ์ฒด ์ง€ํ–ฅ์€?
    - ์Šคํ”„๋ง์€ ๋‹คํ˜•์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ด์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์—ญํ• 
    - IoC, DI๋Š” “๋‹คํ˜•์„ฑ”์„ ํ™œ์šฉํ•˜์—ฌ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋‹ค๋ฃจ๋„๋กํ•œ ๊ฒƒ.

 


 

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

โœ” SRP (๋‹จ์ผ ์ฑ…์ž„ ์›์น™)
ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํŒŒ๊ธ‰ ํšจ๊ณผ๊ฐ€ ์ ๊ฒŒ ์„ค๊ณ„ํ•˜๊ธฐ.

 

โœ” OCP (๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™)
ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜, ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ.

MemberRepository m = new MemoryMemberRepository();
MemberRepository m = new JdbcMemberRepository()

๊ทธ๋Ÿฌ๋‚˜, ์œ„์™€ ๊ฐ™์ด ๋‹จ์ˆœํžˆ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜๋ฉด ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌ๋ฉด OCP๊ฐ€ ๊นจ์ง€๊ฒŒ ๋œ๋‹ค.
๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ณ„๋„์˜ ์กฐ๋ฆฝ, ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค!
๊ทธ๋ฆฌ๊ณ , ์ด ์—ญํ• ์„ Spring์ด ํ•ด์ฃผ๋Š” ๊ฒƒ.


โœ” LSP (๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™)
ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด๋Š” ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ทœ์•ฝ์„ ์ง€ํ‚จ ์ƒํƒœ๋กœ ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

โœ” ISP (์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™)
์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค.
ํด๋ผ์ด์–ธํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๋ช…ํ™•ํ•˜๋„๋ก.

 

โœ” DIP (์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™)
ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค(๊ตฌ์ฒดํ™”)์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์ธํ„ฐํŽ˜์ด์Šค(์ถ”์ƒํ™”)์— ์˜์กดํ•ด์•ผ ํ•œ๋‹ค.
์ฆ‰, ์—ญํ• ์— ์˜์กดํ•ด์•ผ ํ•˜๋ฉฐ, ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด์•ผ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

MemberRepository m = new MemoryMemberRepository();

ํ˜„์žฌ ์ด ์ฝ”๋“œ๋Š” memberRepository์— ํ• ๋‹นํ•˜๋ฉด์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌํ˜„์ฒด์ธ MemoryMemberRepository๊นŒ์ง€ ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค.

 


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

- ๋‹คํ˜•์„ฑ๋งŒ์œผ๋กœ๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๊นŒ์ง€ ๋ณ€๊ฒฝ๋œ๋‹ค.
    - OCP, DIP๋ฅผ ์œ„๋ฐ˜ํ•˜๊ฒŒ ๋œ๋‹ค.

- ์ด๋ฅผ ์œ„ํ•ด, ์Šคํ”„๋ง์—์„œ๋Š” ๋‹คํ˜•์„ฑ + OCP, DIP๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ง€์›ํ•œ๋‹ค!
    - DI : ์˜์กด๊ด€๊ณ„, ์˜์กด์„ฑ ์ฃผ์ž…
    - DI Container์˜ ์ œ๊ณต
- ํด๋ผ์ด์–ธํŠธ์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก.

 

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

 

Comments