JiwonDev

์žก์†Œ๋ฆฌ1

by JiwonDev

DRY

Dont Repeat Yourself

 

OCP

Solid ์ „์ฒด๊ฐ€ OCP๋ฅผ ์œ„ํ•œ ํ•˜๋ถ€์›์น™์ด๋ผ๊ณ ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ตฌ์„ฑ์š”์†Œ๋Š” ํ™•์žฅ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ˆ˜์ •์€ ๋ถˆ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค.

๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ ๊ฐœ์ฒด์˜ ๋ณ€๊ฒฝ์€ ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค.

๋‹จ ์–ด๋–ค ๊ฐœ์ฒด๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด ์˜ํ–ฅ๋ฐ›์ง€ ์•Š๋„๋ก ํ•˜๋ผ. (์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ•˜์ง€๋งˆ๋ผ)

 

์•„ํ‚คํ…์ฒ˜๋ฅผ ์ด์•ผ๊ธฐํ•  ๋•Œ์—๋Š”, ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ(Separation of Concerns) ๋ผ๋Š” ์šฉ์–ด๋ฅผ ์ž์ฃผ ๋“ฃ๊ฒŒ ๋œ๋‹ค.

๊ฒฐ๊ตญ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์„œ๋กœ ๋‹ค๋ฅด๊ณ  ๊ด€๋ จ์ด ์—†๋Š” ์ฑ…์ž„(Responsibility)๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๐Ÿ’ญ ์ปดํ“จํ„ฐ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค.

์‚ฌ์šฉ์ž์˜ ์ด๋ฒคํŠธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๊ตฌ๋ถ„ ์ง“๊ฒŒ ๋œ๋‹ค.

์ฆ‰ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“œ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ปดํ“จํ„ฐ๋กœ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜(์ด๋ฒคํŠธ)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ์Œ์ด๋‹ค.

 

๐Ÿ’ญ ์•„ํ‚คํ…์ฒ˜์˜ ์—ญ์‚ฌ

์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ๋Š” ๋‹ค์ค‘ ๊ณ„์ธต ์•„ํ‚คํ…์ฒ˜ (Multi-Layer Architecture)๋ฅผ ๋‹น์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค.

๊ตฌ์กฐ๋‚˜ ์ด๋ฆ„์€ ๋‹ค ๋‹ค๋ฅด์ง€๋งŒ ๊ฒฐ๊ตญ ํฐ ๊ทธ๋ฆผ์œผ๋กœ ๋ณด๋ฉด [ํ‘œํ˜„ - ๋น„์ฆˆ๋‹ˆ์Šค - ๋ฐ์ดํ„ฐ] 3๊ณ„์ธต์œผ๋กœ ๋‚˜๋ˆ„๋Š”๊ฒŒ ์ œ์ผ ํ”ํ•˜๋‹ค.

์ด ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Web Service๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค๋ฉด
1. ์‚ฌ์šฉ์ž๊ฐ€ Client (์›น ๋ธŒ๋ผ์šฐ์ €)์˜ UI๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด, Client๋Š” ์›น ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ์ „์†กํ•จ.
2. ์›น ์„œ๋ฒ„๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์ฒญ์„ ๋ฐ›๊ณ , ์˜ฌ๋ฐ”๋ฅธ ์š”์ฒญ์ธ์ง€ ๊ฒ€์ฆํ•œ ํ›„ [๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง]์„ ํ˜ธ์ถœํ•จ
3. [๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง]์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜๊ณ , ํ•„์š”์— ๋”ฐ๋ผ [๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ณ„์ธต]์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•จ.
4. ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด [ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๊ณ„์ธต]์— ๊ฒฐ๊ณผ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ณ , ๋‹ค์‹œ ์›น ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ฐ˜ํ™˜ํ•จ.
5. ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์˜ ์ฒ˜๋ฆฌ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์š”์ฒญํ•œ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๊ฑฐ๋‚˜, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์—ฌ์คŒ.

 

1. ๋‹น์—ฐํžˆ ์ตœ์ดˆ์˜ ์ปดํ“จํ„ฐ๋Š” ์•„ํ‚คํ…์ฒ˜๋ผ๋Š” ๊ฐœ๋…์ด ์—†์—ˆ๋‹ค.

๊ทธ๋ƒฅ ์ค‘์•™์ง‘์ค‘ ์ฒ˜๋ฆฌ๋ฐฉ์‹.

์ผ๊ด„ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ(Batch)์„ ๊ตฌ์ถ•ํ•ด์„œ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ž‘์—… (๊ทธ ๋‹น์‹œ ์ฒœ๊ณต์นด๋“œ)๋ฅผ ๋ชจ์•„๋†”์„œ ์ผ์ •์‹œ๊ฐ„๋งˆ๋‹ค ํ•œ๋ฒˆ์— ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์š”์ฒญ์ด ๋ฐ€๋ ค์žˆ๋‹ค๋ฉด ๋‚ด ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ธฐ๊นŒ์ง€ 5~6์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š”๊ฒŒ ๋‹น์—ฐํ–ˆ์—ˆ๋‹ค.

 

2. ๋‹น์—ฐํžˆ ์ด ๋ฐฉ์‹์€ ๋น„ํšจ์œจ์ ์ด์—ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋ชจ๋ธ์ด ํ•„์š”ํ–ˆ๋‹ค.

์ดํ›„ ์‹œ๋Œ€๊ฐ€ ๋ฐœ์ „ํ•˜๋ฉฐ ๊ฐœ์ธ์šฉ ์ปดํ“จํ„ฐ(PC), ์„œ๋ฒ„์šฉ ์›Œํฌ์Šคํ…Œ์ด์…˜์ด ๋“ฑ์žฅํ•˜์ž ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ์ž๋“ค์€ '์„œ๋ฒ„์—์„œ๋งŒ ๋ชจ๋“  ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๊ฐ’์„ ์ œ๊ณต'ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์‚ฌ์šฉ์ž ์žฅ๋น„์—์„œ๋„ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ–ˆ์—ˆ๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ ๊ทธ ์œ ๋ช…ํ•œ Client-Server ๋ชจ๋ธ์˜ ์‹œ์ดˆ.

1980~90๋…„์— ์œ ํ–‰ํ–ˆ๋˜ ๋ชจ๋ธ์ด๋‹ค.

3. Client-Server๋Š” ๋งค์šฐ ํฐ ๋‹จ์ ์ด ์žˆ์—ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋Œ€ํ•œ ๊ตฌ๋ถ„์ด ๊ฑฐ์˜ ์—†์—ˆ๋‹ค. ๋•Œ๋ก  ์‚ฌ์šฉ์ž PC(Client ์ฝ”๋“œ)์•ˆ์— ๋กœ์ง์ด ํฌํ•จ๋œ ์ƒํƒœ๋กœ ์กด์žฌํ•˜๊ธฐ๋„ ํ–ˆ์—ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ์ •๋ง ๋‚œ์žกํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์กŒ์—ˆ๋‹ค.

JSP๋ฅผ ๋– ์˜ฌ๋ฆฌ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ์‹ค์ œ ์–ด๋Š ํšŒ์‚ฌ์˜ JSP ํŒŒ์ผ์˜ ์ฝ”๋“œ๊ฐ€ ์ˆ˜์ฒœ์ค„์ด๋ผ ์ œ์ž‘์ž๋ง๊ณ ๋Š” ์•„๋ฌด๋„ ๋ชป๊ฑด๋“œ๋ ธ๋‹ค๋Š” ๋ ˆ๊ฑฐ์‹œ ์ „์„ค์ด..

2000๋…„๋Œ€ ์›น์„œ๋น„์Šค๋Š” ๊ฐœ๋ฐœ ์‹œ 'ํ™”๋ฉด ๋‹จ์œ„'๋กœ ์ž‘์—…์„ ๋‚˜๋ˆ„๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ด ์—ˆ๋‹ค. ์ด๋Š” ์˜›๋‚ ์˜ Client - Server ๋‹จ์ผ ๊ตฌ์กฐ์˜ ๊ฐœ๋ฐœ ๋ฐฉ์‹์ด์—ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๊ณ , ๋ถ„์—…์ด๋‚˜ ์œ ์ง€๋ณด์ˆ˜๋„ ๋งค์šฐ ์–ด๋ ค์› ์—ˆ๋‹ค.

 

 

4. ์ด๋ ‡๊ฒŒ ๊ณ ํ†ต์„ ๋ฐ›๋‹ค๋ณด๋‹ˆ, ์—ญํ• ๋ณ„๋กœ ์˜์—ญ์„ ๋ถ„๋ฆฌํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•˜๋‹ค๋Š”๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค.

๊ฐ ์—ญํ• ์„ ํ™•์‹คํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ Cilent-Server ์‚ฌ์ด์— ์—ฌ๋Ÿฌ ๊ณ„์ธต(๋ฏธ๋“ค ์›จ์–ด)๋ฅผ ๋ผ์›Œ๋„ฃ์—ˆ๋‹ค. ์ฆ‰ [๋น„์ฆˆ๋‹ˆ์Šค๋ฅผ ๋‹ด๋‹นํ•˜๋Š” App Server] [DB๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ์ฝ”๋“œ]๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์—ˆ๋‹ค.

[ํ‘œํ˜„ ๊ณ„์ธต - ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ„์ธต - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ๊ณ„์ธต] Tier ๋‹จ์œ„์˜ ๊ฐœ๋ฐœ

์ด๋ ‡๊ฒŒ ๊ณ„์ธต์„ ํ™•์‹คํ•˜๊ฒŒ ๋‚˜๋ˆ„๋‹ˆ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง€๋Š” ๊ฒƒ๋„ ์žˆ์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์€ ํŠน์ง•๋„ ์žˆ์—ˆ๋‹ค.

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

 

5. ๊ทธ๋Ÿฐ๋ฐ ์˜์—ญ์„ ๋‚˜๋ˆ„๋‹ˆ ์‹œ์•ผ๊ฐ€ ์ข์•„์ง€๊ฒŒ ๋œ๋‹ค.

ํ™•์‹คํ•˜๊ฒŒ ๋ถ„์—…์„ ํ•˜๋‹ค๋ณด๋‹ˆ ๊ฐœ๋ฐœ ํšจ์œจ์€ ๋งค์šฐ ์ข‹์•„์กŒ๊ณ , ์œ ์ง€๋ณด์ˆ˜๋„ ์‰ฌ์›Œ์กŒ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋กœ์ธํ•ด ์ƒ๊ธด ๋‹จ์ ์ด ํ•˜๋‚˜์žˆ๋Š”๋ฐ, [๊ธฐํš์ž - ๊ฐœ๋ฐœ์ž - ๊ทธ ์™ธ ํŒ€์›๋“ค]์ด ๊ฐ™์€ ์‹œ์•ผ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง„ ๊ฒƒ์ด๋‹ค.

์—ฐํ†ต ๋ฐฐ๊ด€์ฒ˜๋Ÿผ, ๊ฐ ์„œ๋น„์Šค๋งˆ๋‹ค ๋ถ„๋ฆฌ๋œ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌ

๋ชจ๋“  ์„œ๋น„์Šค๊ฐ€ ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค๋ฉด, ํŒ€์›๋“ค์ด ๊ฐ™์€ ์‹œ์•ผ๋ฅผ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†๋‹ค.

๊ทธ๋ƒฅ ๊ณต์žฅ์—์„œ ๋ถ€ํ’ˆ์„ ์ฐ์–ด๋‚ด๋“ฏ์ด ๋ณธ์ธ์ด ํ•  ์ผ๋งŒ ์ž˜ํ•œ๋‹ค๋ฉด, ์„œ๋น„์Šค๋Š” ์ž˜ ๋Œ์•„๊ฐˆ ๊ฒƒ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ํ˜„์‹ค์ ์ธ ์•ฑ์€ ๊ทธ๋ ‡๊ฒŒ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋“ค์ด ํ˜‘์—…ํ•˜๊ณ , ์—ฌ๋Ÿฌ DB์— ์š”์ฒญ์„ ํ•œ๋‹ค.

[ ์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ ๋งŒ๋“œ๋Š”๊ฐ€] ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์—†๋Š” ๊ฐœ๋ฐœ์€, ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‚˜๊ฐ€๋Š”๋ฐ ํฐ ๊ฑธ๋ฆผ๋Œ์ด ๋˜์—ˆ๋‹ค.

์ด๊ฒŒ ๊ฑด๋ฌผ์„ ์ง“๋Š” ๊ฑด์ง€ ํ†ต๋กœ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฑด์ง€ ๋ชจ๋ฅด๊ณ  ๊ทธ๋ƒฅ ๋ฌด์ž‘์ • ๋•…์—๋‹ค ์‚ฝ์งˆํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•˜๋‹ค.

 

์˜›๋‚ ์˜ Client-Server ๊ตฌ๋‹ฅ๋‹ค๋ฆฌ ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ ํšจ์œจ์€ ๋‚˜๋นด์ง€๋งŒ, ์ ์–ด๋„ ๋ชจ๋“  ํŒ€์›์ด ๊ณตํ†ต๋œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ๋ถ„์—…์€ ์‰ฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋ฌด์—‡์„ ๋งŒ๋“œ๋Š”์ง€์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ์–ด๋ ค์›Œ์กŒ๋‹ค.

 

 

๐Ÿ’ญ ์Šค๋งˆํŠธ DAO, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์กดํ•˜๋Š” ๊ฐœ๋ฐœ

๊ธฐ์กด์˜ DAO๋Š” ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์—ญํ• ๋งŒ ๋งก์•˜์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋“ค์€ ์•„๋ž˜ SQL๋ฌธ์•ˆ์— ๋…น์•„ ๋“ค๊ฒŒ ๋œ๋‹ค.

SELECT username, secword
    FROM user
    WHERE UID=1 AND birday > "20000101" AND gender='F' AND rate > 40 AND status='T';
UPDATE users
   SET rate = rate + 10
   WHERE UID=112 AND gender='F' AND rate > 40 AND status='T';

 

์šฐ๋ฆฌ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ์œ„ํ•ด์„œ, ๊ฐ์ฒด์ง€ํ–ฅ์ด๋‚˜ ์•„๋ž˜์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ๋“ค์„ ๋ฐฐ์›Œ์™”์—ˆ๋‹ค.

  • Abstraction (์ถ”์ƒํ™”)
  • Encapsulation (์บก์Šํ™”) & Information Hiding ( ์ •๋ณด ์€๋‹‰)
  • Modularization (๋ชจ๋“ˆํ™”)
  • Seprataion of Concerns (๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ)
  • Coupling and Cohesion (์‘์ง‘๋„์™€ ๊ฒฐํ•ฉ๋„)
  • Divide And Conquer (๋ถ„ํ• ์ •๋ณต)

๊ทธ๋Ÿฌ๋‚˜ ์œ„์™€ ๊ฐ™์ด SQL์— ๋ชจ๋“  ๋กœ์ง์„ ๋‹ด์•„๋ฒ„๋ฆฌ๋ฉด, ๋ฐฉ๊ธˆ ์–ธ๊ธ‰ํ•œ ๋ชจ๋“  ๊ฐœ๋…๋“ค์€ ๋ฌด์šฉ์ง€๋ฌผ์ด ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

SQL์˜ ์—ญํ• ์„ ์ค„์—ฌ์•ผํ•œ๋‹ค. ๋กœ์ง์„ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค.

  • Active Record ๋˜๋Š” ORM
  • Query Builder (JooQ, QueryDSL)
  • Table Data Gateway

์ƒํƒœ๋ฅผ ์˜์†ํ™” ํ•ด์•ผํ•œ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š”๊ฒŒ ๋‹จ์ˆœํ•œ SQL๋ฌธ์ด ์˜€๋‹ค๋ฉด, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ƒํƒœ๋ฅผ ๋ณด๊ด€(์˜์†ํ™”)ํ•ด์•ผ ํ•œ๋‹ค.

DB์— ์ €์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค. ๋งŽ์€ ์ƒํƒœ ์กฐ์ž‘์ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋ณต์žก๋„๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋Š” ์ดํ›„ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์„ค๋ช…ํ•˜๋ฉด์„œ ์ถ”๊ฐ€๋กœ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

 

๐Ÿ’ญ ๋’ค๋ฒ”๋ฒ… ์•„ํ‚คํ…์ฒ˜

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—ฌ๋Ÿฌ ๋กœ์ง์ด ๋„ˆ๋ฌด ์„ž์—ฌ์žˆ๋‹ค.

๋ฉ”์„œ๋“œ๋งˆ๋‹ค [๋กœ๊ทธ, ์ธ์ฆ์ธ๊ฐ€, ๋ชจ๋‹ˆํ„ฐ๋ง]๋“ฑ ๋ฐ˜๋ณต์ ์ธ ํšก์ ์ธ ๊ด€์‹ฌ์‚ฌ ๋กœ์ง์€ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

  • ํŒŒ์ดํ”„ & ํ•„ํ„ฐ ํŒจํ„ด (์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๊ณ , ํŒŒ์ดํ”„๋กœ ์ฒ˜๋ฆฌ. ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ)
  • AOP

 

๐Ÿ’ญ ๊ธด ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ (๋ฉ”์„œ๋“œ ๋‹จ์œ„์˜ ๊ธฐ๋Šฅ ๋ถ„์—…)

๋ฉ”์„œ๋“œ ๋‹จ์œ„์˜ ๋ฆฌํŽ™ํ† ๋ง์ด ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค. ๋ฉ”์„œ๋“œ๋„ ๊ธฐ๋Šฅ์ด ๋ถ„ํ™”๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.

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

  • ๊ธฐ๋Šฅ๋‹จ์œ„์˜ ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ, ์ค‘๋ณต์„ ์ œ๊ฑฐ
  • ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ์œ„๋ฐ˜
  • ์žฌ์‚ฌ์šฉ ์ฝ”๋“œ์˜ ๋ฐœ๊ฒฌ, ์ถ”์ƒํ™”์˜ ๊ธฐํšŒ

๋ณต์žกํ•œ ๊ธฐ๋Šฅ์€ ๋ฉ”์„œ๋“œ๋“ค์˜ ํ˜‘์—…์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค. ๊ธฐ๋Šฅ์„ ์ถ”์ƒํ™”ํ•˜์ž.

์•„๋ž˜์˜ StringCalculator ํด๋ž˜์Šค๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž.

public class StringCalculator {

    public int calculate(String text) {
        if (text == null || text.length() == 0) {
            return 0;
        } else if (text.contains(",")) {
            String[] values = text.split(",");
            int sum = 0;
            for (String val : values) {
                sum += Integer.parseInt(val);
            }

            return sum;
        }

        return Integer.parseInt(text);
    }

}

๋™์ž‘์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ ํ•œ ๋ฉ”์„œ๋“œ์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ํ•˜๊ณ  ์žˆ๊ณ , ์ฝ”๋“œ๋งŒ์œผ๋กœ ๋™์ž‘์„ ์ดํ•ดํ•˜๊ธฐ๋„ ์–ด๋ ต๋‹ค.

๊ธด ๋ฉ”์„œ๋“œ์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๋™์ž‘์„ ๋ฉ”์„œ๋“œ์˜ ์กฐํ•ฉ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.

public class StringCalculator {

    public int calculate(String text) {
        if (isBlank(text)) {
            return 0;
        }

        String[] values = splitToken(text);
        return sum(toInt(values));
    }
}

์ด์ œ calculate๊ฐ€ ๋ฌด์Šจ ๋™์ž‘์„ ํ•˜๋Š”์ง€ ์•Œ๊ฒ ๋Š”๊ฐ€? isBlank -> split -> toInt -> sum

๊ตณ์ด ์„ธ๋ถ€ ๋ฉ”์„œ๋“œ๋ฅผ ๊นŒ๋ณด์ง€์•Š๋”๋ผ๋„, ๋™์ž‘์„ ์ถฉ๋ถ„ํžˆ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งˆ์น˜ ์ฝ”๋“œ๋กœ ์˜์‚ฌ์†Œํ†ต ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

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

public class StringCalculator {

    public int calculate(String text) {
        if (isBlank(text)) {
            return 0;
        }

        String[] values = splitToken(text);
        return sum(toInt(values));
    }

    private int sum(int[] values) {
        return Arrays.stream(values)
            .sum();
    }

    private int[] toInt(String[] values) {
        return Arrays.stream(values)
            .mapToInt(Integer::parseInt)
            .toArray();
    }

    private String[] splitToken(String text) {
        return text.split(",");
    }

    private boolean isBlank(String text) {
        return text == null || text.isEmpty();
    }

}

 

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

  • Public ๋ฉ”์„œ๋“œ๋Š” ์ถ”์ƒํ™”๋œ ์ด์•ผ๊ธฐ(์˜๋„, ์ž‘์—…ํ๋ฆ„)์„ ๋‚˜ํƒ€๋‚ด๋ผ.
  • Private ๋ฉ”์„œ๋“œ๋Š” ์ด์•ผ๊ธฐ์˜ ์˜๋ฏธ๋ฅผ ์ •์˜ํ•˜๋ผ.
  • ์ž‘๊ฒŒ ๋งŒ๋“ค๊ณ  ํ•œ๊ฐ€์ง€๋งŒ ํ•˜๋ผ(SRP)
  • ํ•จ์ˆ˜๋‚ด ๋™์ผํ•œ ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ์œ ์ง€ํ•˜๋ผ.
  • ๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ.
  • ๊ณ ์ฐจ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ํ•จ์ˆ˜ ์ˆ˜์ค€์œผ๋กœ ์ถ”์ƒํ™”ํ•˜๋ผ (๋žŒ๋‹ค์‹)

 

public String renderPage(PageData data, boolean isSuite) {
    ResultPage result = prepareResultPage(isSuite);

    if (isTestPage(data)) {
        result.includeSetup(data);
        result.includeTeardown(data);
    }

    return result.getHtml();
}

 

๐Ÿ’ญ ํด๋ž˜์Šค ์ถ”๊ฐ€ ๊ณตํฌ์ฆ

OCP๋ฅผ ์ž˜ ์ง€์ผฐ๋‹ค๋ฉด ์ „ํ˜€ ๋ฌด์„ญ์ง€์•Š๋‹ค.

TDD์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ณด์ž.

 

๐Ÿ’ญ ๋ฌด๊ฑฐ์šด ์„œ๋น„์Šค ์ •๋ฆฌ

AOP๋ฅผ ์ด์šฉํ•ด์„œ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์ž

์กฐํ•ฉ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๊ณ  DSL(๋„๋ฉ”์ธ ์ •์˜ ์–ธ์–ด)๋ฅผ ๊ฐœ๋ฐœํ•˜์ž

๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๋„์ž…ํ•˜์ž

ํฐ ์„œ๋น„์Šค๋ฅผ ์ž‘์€ ํด๋ž˜์Šค๋กœ ๋ถ„ํ•ดํ•˜๊ณ  ์œ„์ž„ํ•˜์ž

๋†’์€ ์‘์ง‘๋„๋ฅผ ๊ฐ€์ง€๊ณ , ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ–๋„๋ก ์„ค๊ณ„ํ•˜์ž.

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

JiwonDev

JiwonDev

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