Claire's Study Note

[์Šคํ”„๋ง ๊ธฐ๋ณธ] 01. ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ์Šคํ”„๋ง

by Hi.Claire
๋ฐ˜์‘ํ˜•

๐Ÿ–ฅ๏ธ ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ (๊น€์˜ํ•œ, ์ธํ”„๋Ÿฐ)

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

01-2. ์ด์•ผ๊ธฐ - ์ž๋ฐ” ์ง„์˜์˜ ์ถ”์šด ๊ฒจ์šธ๊ณผ ์Šคํ”„๋ง์˜ ํƒ„์ƒ

EJB(Enterprise Java Beans)

์Šคํ”„๋ง ํƒ„์ƒ ์ด์ „์— ๋งŽ์ด ํ™œ์šฉํ•˜๋˜ ๊ธฐ์ˆ ์ด๋‹ค.

์ด๋ก ์ ์œผ๋กœ๋Š” ์ข‹์•˜์œผ๋‚˜ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‚ฌ์šฉํ•˜๊ธฐ์— ๋ณต์žกํ•˜๊ณ  ์–ด๋ ต๊ณ  ๋А๋ฆฌ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

EJB ์˜์กด์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ•ด์„œ ์ฝ”๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง€๋Š” ๋ฌธ์ œ๋„ ์žˆ์—ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณตํ•˜๊ณ ์ž ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์˜ ์ž๋ฐ” Object๋ฅผ ์“ฐ๋˜ ์˜›๋‚ ๋กœ ๋Œ์•„๊ฐ€์ž๋Š” ์˜๋ฏธ๋กœ POJO(Plain Old Java Object)๋ผ๋Š” ๊ฐœ๋…๋„ ๋“ฑ์žฅํ–ˆ๋‹ค.

 

์Šคํ”„๋ง์˜ ๋“ฑ์žฅ

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : amazon.com

 

ํ˜„์žฌ์˜ Spring Framework๋Š” Rod Johnson์˜ ์ €์„œ <Expert One-on-One J2EE Design and Development>์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

EJB ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ์‚ฌ์‹ค์ƒ ํ˜„์žฌ์˜ ํ‘œ์ค€ ๊ธฐ์ˆ ์ด ๋˜์—ˆ๋‹ค.

๋‹จ์ˆœํ•จ์˜ ์Šน๋ฆฌ

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : amazon.com

 

Gavin King์˜ ์ €์„œ <Java Persistence with Hibernate>๋Š” ํ˜„์žฌ์˜ JPA(Java Persistence API)๋ผ๋Š” ์ƒˆ๋กœ์šด ํ‘œ์ค€์˜ ๊ธฐ๋ฐ˜์ด ๋˜์—ˆ๋‹ค.

EJB ์—”ํ‹ฐํ‹ฐ๋นˆ ๊ธฐ์ˆ ์„ ๋Œ€์ฒดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊ฐ•์˜์ž๋ฃŒ

 

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋จผ์ € ์ •ํ•ด์ง€๊ณ , ๊ทธ ๊ตฌํ˜„์ฒด๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ์ˆœ์„œ๋กœ ์ง„ํ–‰์ด ๋˜์ง€๋งŒ JPA ํ‘œ์ค€์€ ๊ทธ ๋ฐ˜๋Œ€์˜ ์ˆœ์„œ๋กœ ์ •์˜๋˜์—ˆ๋‹ค.

์‹ค๋ฌด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌํ˜„์ฒด์ธ Hibernate๋ฅผ ๊ฐ€์ง€๊ณ  JPA ํ‘œ์ค€์„ ์ •์˜ํ•จ์œผ๋กœ์จ ์‹ค์šฉ์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๋ชจ๋‘ ๊ฐ–์ถœ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

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

Rod Johnson์€ ์ €์„œ <Expert One-on-One J2EE Design and Development>์—์„œ EJB ์—†์ด๋„ ์ถฉ๋ถ„ํžˆ ๊ณ ํ’ˆ์งˆ์˜ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ฃผ๊ณ , 30,000 ๋ผ์ธ ์ด์ƒ์˜ ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์„ ์˜ˆ์ œ ์ฝ”๋“œ๋กœ ์„ ๋ณด์˜€๋‹ค.

์ด ์˜ˆ์ œ ์ฝ”๋“œ์— ์Šคํ”„๋ง ํ•ต์‹ฌ ๊ฐœ๋…์ธ BeanFactory, ApplicationContext, POJO, ์ œ์–ด์˜ ์—ญ์ „, ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋“ฑ์˜ ๋‚ด์šฉ๊ณผ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค.

์ฑ… ์ถœ๊ฐ„ ์งํ›„ Juergen Hoeller, Yann Caroff ๋“ฑ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ์•ˆํ–ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋กœ ์ „ํ†ต์ ์ธ J2EE(EJB)๋ผ๋Š” ๊ฒจ์šธ์„ ๋„˜์–ด ์ƒˆ๋กœ์šด ์‹œ์ž‘์ด๋ผ๋Š” ๋œป์„ ์ง€๋‹Œ ์Šคํ”„๋ง์ด ํƒ„์ƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

2023๋…„ 10์›” ํ˜„์žฌ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ 6.0.x, ์Šคํ”„๋ง ๋ถ€ํŠธ 3.1.x ๋ฒ„์ „๊นŒ์ง€ ์ถœ์‹œ๋˜์—ˆ๋‹ค.

 

01-3. ์Šคํ”„๋ง์ด๋ž€?

์Šคํ”„๋ง ์ƒํƒœ๊ณ„

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊ฐ•์˜์ž๋ฃŒ

 

Spring Framework

    1. ํ•ต์‹ฌ ๊ธฐ์ˆ  : ์Šคํ”„๋ง DI ์ปจํ…Œ์ด๋„ˆ, AOP, ์ด๋ฒคํŠธ, ๊ธฐํƒ€

    2. ์›น ๊ธฐ์ˆ  : ์Šคํ”„๋ง MVC, ์Šคํ”„๋ง WebFlux

    3. ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ  : ํŠธ๋žœ์žญ์…˜, JDBC, ORM ์ง€์›, XML ์ง€์›

    4. ๊ธฐ์ˆ  ํ†ตํ•ฉ : ์บ์‹œ, ์ด๋ฉ”์ผ, ์›๊ฒฉ์ ‘๊ทผ, ์Šค์ผ€์ค„๋ง

    5. ํ…Œ์ŠคํŠธ : ์Šคํ”„๋ง ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์ง€์›

    6. ์–ธ์–ด : ์ฝ”ํ‹€๋ฆฐ, ๊ทธ๋ฃจ๋น„

 

Spirng Boot

์Šคํ”„๋ง์˜ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ด์ค€๋‹ค.

๋‹จ, ์Šคํ”„๋ง ๋ถ€ํŠธ ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค.

 

โœ”๏ธ ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ์žฅ์ 

    1. ๋‹จ๋…์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    2. Tomcat ๊ฐ™์€ ์›น ์„œ๋ฒ„๋ฅผ ๋‚ด์žฅํ•ด์„œ ๋ณ„๋„์˜ ์›น ์„œ๋ฒ„๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

    3. ์†์‰ฌ์šด ๋นŒ๋“œ ๊ตฌ์„ฑ์„ ์œ„ํ•œ starter ์ข…์†์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

    4. ์Šคํ”„๋ง๊ณผ 3rd party(์™ธ๋ถ€) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž๋™ ๊ตฌ์„ฑํ•ด์ค€๋‹ค. ์˜ˆ์ „์—๋Š” ์Šคํ”„๋ง ๋ฒ„์ „ ๋ณ„๋กœ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ ๋งž์ถ”๊ธฐ๊ฐ€ ์–ด๋ ค์› ๋Š”๋ฐ ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „๊นŒ์ง€ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑํ•ด์ค€๋‹ค.

    5. ๋ฉ”ํŠธ๋ฆญ, ์ƒํƒœ ํ™•์ธ, ์™ธ๋ถ€ ๊ตฌ์„ฑ ๊ฐ™์€ ํ”„๋กœ๋•์…˜ ์ค€๋น„ ๊ธฐ๋Šฅ(์šด์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ)์„ ์ œ๊ณตํ•œ๋‹ค.

    6. ๊ด€๋ก€์— ์˜ํ•œ ๊ฐ„๊ฒฐํ•œ ์„ค์ •์„ ์“ธ ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌํ•˜๋‹ค.

 

์Šคํ”„๋ง์€ ์™œ ๋งŒ๋“ค์—ˆ๋‚˜์š”?

์Šคํ”„๋ง์€ ์ž๋ฐ” ์–ธ์–ด ๊ธฐ๋ฐ˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

์ž๋ฐ” ์–ธ์–ด์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋ผ๋Š” ๊ฒƒ์ธ๋ฐ, ์Šคํ”„๋ง์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๊ฐ€ ๊ฐ€์ง„ ๊ฐ•๋ ฅํ•œ ํŠน์ง•์„ ์‚ด๋ ค๋‚ด๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.

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

 

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

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

    1. ์บก์Аํ™”

    2. ์ถ”์ƒํ™”

    3. ์ƒ์†

    4. ๋‹คํ˜•์„ฑ

 

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

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋“ค์˜ ๋ชจ์ž„์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ฐ์ฒด๋“ค์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ํ˜‘๋ ฅํ•œ๋‹ค.

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ํ”„๋กœ๊ทธ๋žจ์„ ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ทœ๋ชจ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

 

โœ”๏ธ ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ด?

๋งˆ์น˜ ๋ ˆ๊ณ  ๋ธ”๋Ÿญ์„ ์กฐ๋ฆฝํ•˜๋“ฏ์ด, ํ‚ค๋ณด๋“œ๋‚˜ ๋งˆ์šฐ์Šค๋ฅผ ๊ฐˆ์•„ ๋ผ์šฐ๋“ฏ์ด, ์ปดํ“จํ„ฐ์˜ ๋ถ€ํ’ˆ์„ ๊ฐˆ์•„ ๋ผ์šฐ๋“ฏ์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‰ฝ๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๋ฉด์„œ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์ด๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ์—ฌ๋Ÿฌ ํŠน์ง• ์ค‘์—์„œ ํŠนํžˆ ๋‹คํ˜•์„ฑ๊ณผ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ๋‹ค.

 

๋‹คํ˜•์„ฑ(Polymorphism)

์—ญํ• ๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ

 

โœ”๏ธ ๋‹คํ˜•์„ฑ์˜ ์‹ค์„ธ๊ณ„ ๋น„์œ 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊ฐ•์˜์ž๋ฃŒ

์šด์ „์ž๋Š” ์ž๋™์ฐจ ๊ตฌํ˜„ ๋Œ€์ƒ์ด K3์ด๋“  ํ…Œ์Šฌ๋ผ ๋ชจ๋ธ3์ด๋“  ์ƒ๊ด€์—†์ด ์šด์ „์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์—ญํ• ๊ณผ ๊ตฌํ˜„์˜ ๋ถ„๋ฆฌ

์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜๋ฉด ์„ธ์ƒ์ด ๋‹จ์ˆœํ•ด์ง€๊ณ , ์œ ์—ฐํ•ด์ง€๋ฉฐ ๋ณ€๊ฒฝ๋„ ํŽธ๋ฆฌํ•ด์ง„๋‹ค.

 

โœ”๏ธ ์žฅ์ 

    1. ํด๋ผ์ด์–ธํŠธ๋Š” ๋Œ€์ƒ์˜ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.

    2. ํด๋ผ์ด์–ธํŠธ๋Š” ๊ตฌํ˜„ ๋Œ€์ƒ์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ชฐ๋ผ๋„ ๋œ๋‹ค.

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

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

 

โœ”๏ธ ์ž๋ฐ” ์–ธ์–ด์— ์ ์šฉ

์ž๋ฐ” ์–ธ์–ด์˜ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

    - ๊ตฌํ˜„ : ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค, ๊ตฌํ˜„ ๊ฐ์ฒด

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

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

 

๊ฐ์ฒด์˜ ํ˜‘๋ ฅ์ด๋ผ๋Š” ๊ด€๊ณ„๋ถ€ํ„ฐ ์ƒ๊ฐ

๋‹คํ˜•์„ฑ์˜ ๋ณธ์งˆ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ํ˜‘๋ ฅ์ด๋ผ๋Š” ๊ฐ์ฒด ์‚ฌ์ด์˜ ๊ด€๊ณ„์—์„œ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ ๋งŽ์€ ๊ฐ์ฒด ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ์ฒด ์„œ๋ฒ„๋Š” ์„œ๋กœ ํ˜‘๋ ฅ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. 

์„œ๋ฒ„๋Š” ์„œ๋ฒ„ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์‹œ์— ํด๋ผ์ด์–ธํŠธ๋กœ์„œ ๋‹ค๋ฅธ ์„œ๋ฒ„์—๋„ ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ”๏ธ ํ˜‘๋ ฅ์—์„œ์˜ ์ž๋ฐ” ์–ธ์–ด์˜ ๋‹คํ˜•์„ฑ

์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฐ์ฒด์˜ Overriding ๋œ ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

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

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

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊ฐ•์˜์ž๋ฃŒ

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊ฐ•์˜์ž๋ฃŒ

 

์ •๋ฆฌ

์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ์œ ์—ฐํ•˜๊ณ  ๋ณ€๊ฒฝ์ด ์šฉ์ดํ•œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํด๋ผ์ด์–ธํŠธ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ๋ฐ, ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ž˜ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

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

๋”ฐ๋ผ์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ, ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ž˜ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

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

์Šคํ”„๋ง์€ ๋‹คํ˜•์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ด์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

์Šคํ”„๋ง์—์„œ์˜ ์ œ์–ด์˜ ์—ญ์ „(IoC), ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…(DI)์€ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•ด์„œ ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค.

 

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

SOLID

Clean Code๋กœ ์œ ๋ช…ํ•œ Robert Martin์ด ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์˜ 5๊ฐ€์ง€ ์›์น™์„ ์ •๋ฆฌํ–ˆ๋‹ค.

    1. SRP : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ (Single Responsibility Principle)

    2. OCP : ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open-Closed Principle)

    3. LSP : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (Liskov Substitution Principle)

    4. ISP : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (Interface Segregation Principle)

    5. DIP : ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (Dependency Inversion Principle)

 

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

ํ•œ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ•˜๋‚˜์˜ ์ฑ…์ž„์ด๋ผ๋Š” ๊ฒƒ์€ ๋ชจํ˜ธํ•˜๋‹ค.

์ด๋•Œ ์ค‘์š”ํ•œ ๊ธฐ์ค€์€ ๋ณ€๊ฒฝ์ด๋‹ค. ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ํŒŒ๊ธ‰ ํšจ๊ณผ๊ฐ€ ์ ์œผ๋ฉด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ž˜ ๋”ฐ๋ฅธ ๊ฒƒ์ด๋‹ค.

 

OCP : ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™ (Open-Closed Principle)

์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜, ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ™•์žฅ์„ ํ•˜๋ ค๋ฉด ๋‹น์—ฐํžˆ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ๋ฐ–์— ์—†์ง€ ์•Š์„๊นŒ?

์ด๋•Œ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•ด๋ณด์ž. ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊ฐ•์˜์ž๋ฃŒ

 

โœ”๏ธ ๋ฌธ์ œ์ 

MemberService ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์„ ํƒํ•˜๊ณ  ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์œ„์™€ ๊ฐ™์ด ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

๋ถ„๋ช… ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ–ˆ์ง€๋งŒ OCP ์›์น™์„ ์ง€ํ‚ฌ ์ˆ˜ ์—†๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ณ„๋„์˜ ์กฐ๋ฆฝ, ์„ค์ •์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ด๊ฒƒ์„ ์Šคํ”„๋ง์—์„œ ์ง€์›ํ•ด์ค€๋‹ค๊ณ  ํ•œ๋‹ค. (๋‚˜์ค‘์— ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉด์„œ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.)

 

LSP : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ (Liskov Substitution Principle)

ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ฆ‰, ๋‹คํ˜•์„ฑ์—์„œ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๊ทœ์•ฝ์„ ๋‹ค ์ง€์ผœ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ๋‹คํ˜•์„ฑ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ์›์น™์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ๋ฏฟ๊ณ  ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ด ์›์น™์ด ํ•„์š”ํ•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค์˜ accel์€ ์•ž์œผ๋กœ ๊ฐ€๋ผ๋Š” ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์ž๋™์ฐจ ๊ตฌํ˜„์ฒด๊ฐ€ ์ด๋ฅผ ๋’ค๋กœ ๊ฐ€๊ฒŒ ๊ตฌํ˜„ํ•˜๋ฉด LSP๋ฅผ ์œ„๋ฐ˜ํ•œ ๊ฒƒ์ด๋‹ค. ๋А๋ฆฌ๊ฒŒ ๊ฐ€๋”๋ผ๋„ ์•ž์œผ๋กœ ๊ฐ€์•ผ ํ•œ๋‹ค.

 

ISP : ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ (Interface Segregation Principle)

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

(์˜ˆ์‹œ)

    - ์ž๋™์ฐจ ์ธํ„ฐํŽ˜์ด์Šค : ์šด์ „ ์ธํ„ฐํŽ˜์ด์Šค, ์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌ

    - ์‚ฌ์šฉ์ž ํด๋ผ์ด์–ธํŠธ : ์šด์ „์ž ํด๋ผ์ด์–ธํŠธ, ์ •๋น„์‚ฌ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ„๋ฆฌ

์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•˜๋ฉด ์ •๋น„ ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด๊ฐ€ ๋ณ€ํ•ด๋„ ์šด์ „์ž ํด๋ผ์ด์–ธํŠธ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

์ด ์›์น™์„ ํ†ตํ•ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ณ  ๋Œ€์ฒด ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

 

DIP : ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™ (Dependency Inversion Principle)

"ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค."

์˜์กด์„ฑ ์ฃผ์ž…์€ ์ด ์›์น™์„ ๋”ฐ๋ฅด๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋‹ค.

์‰ฝ๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด, ๊ตฌํ˜„ ํด๋ž˜์Šค์— ์˜์กดํ•˜์ง€ ๋ง๊ณ  ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์— ์˜์กดํ•˜๋ผ๋Š” ๋œป์ด๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)์— ์˜์กดํ•ด์•ผ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌํ˜„์ฒด์— ์˜์กดํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ์ด ์•„์ฃผ ์–ด๋ ค์›Œ์ง„๋‹ค.

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : ๊ฐ•์˜์ž๋ฃŒ

 

โœ”๏ธ ๋ฌธ์ œ์ 

๊ทธ๋Ÿฐ๋ฐ ์œ„์˜ MemberService๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜์ง€๋งŒ ๋™์‹œ์— ๊ตฌํ˜„ ํด๋ž˜์Šค์—๋„ ์˜์กดํ•œ๋‹ค.

์ด๋Š” DIP๋ฅผ ์œ„๋ฐ˜ํ•œ ๊ฒƒ์ด๋‹ค. ์ด ๋ฌธ์ œ ์—ญ์‹œ ์Šคํ”„๋ง์—์„œ ํ•ด๊ฒฐํ•ด์ฃผ๋ฏ€๋กœ ๊ฐ•์˜๋ฅผ ๊ณ„์† ๋“ค์–ด๋ณด์ž.

 

์ •๋ฆฌ

๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํ•ต์‹ฌ์€ ๋‹คํ˜•์„ฑ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹คํ˜•์„ฑ๋งŒ์œผ๋กœ๋Š” ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋œ๋‹ค.

์ด๋Š” OCP, DIP๋ฅผ ์œ„๋ฐ˜ํ•œ ๊ฒƒ์ด๋‹ค.

๋ญ”๊ฐ€ ๋” ํ•„์š”ํ•œ๋ฐ ์ด๊ฒƒ์„ ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

 

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

์Šคํ”„๋ง์ด ์—†๋˜ ์‹œ์ ˆ๋กœ

์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ž๋ฐ”๋กœ OCP, DIP ์›์น™๋“ค์„ ์ง€ํ‚ค๋ฉด์„œ ๊ฐœ๋ฐœ์„ ํ•ด๋ณด๋ฉด, ๊ฒฐ๊ตญ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ(์ •ํ™•ํ•˜๊ฒŒ๋Š” DI ์ปจํ…Œ์ด๋„ˆ)๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋œ๋‹ค.

 

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

์Šคํ”„๋ง์€ DI ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ๋‹คํ˜•์„ฑ๊ณผ OCP, DIP๋ฅผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ง€์›ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์—†์ด ๊ธฐ๋Šฅ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์‰ฝ๊ฒŒ ๋ถ€ํ’ˆ์„ ๊ต์ฒดํ•˜๋“ฏ์ด ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

 

DI(Dependency Injection)

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

 

์ •๋ฆฌ

๋ชจ๋“  ์„ค๊ณ„์— ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•˜์ž.

์ด์ƒ์ ์œผ๋กœ๋Š” ๋ชจ๋“  ์„ค๊ณ„์— ์—ญํ• (์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ๋ถ€์—ฌํ•ด์„œ ๊ตฌํ˜„์ฒด๋Š” ์–ธ์ œ๋“ ์ง€ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„๋‹ค.

ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ถ”์ƒํ™”๋ผ๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

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

 

๋ฐ˜์‘ํ˜•

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Claire's Study Note

Hi.Claire

ํ™œ๋™ํ•˜๊ธฐ