Study/CleanCode

[Study][CleanCode - 1] 3. ํ•จ์ˆ˜

youn12 2022. 7. 1. 17:49
๐Ÿ“‹ ๋ชฉ์ฐจ.

3. ํ•จ์ˆ˜
    .์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ!
    .ํ•œ๊ฐ€์ง€๋งŒ ํ•ด๋ผ!
    .์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ”๋“œ์ฝ๊ธฐ:๋‚ด๋ ค๊ฐ€๊ธฐ๊ทœ์น™
    .์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ.
    .ํ•จ์ˆ˜ ์ธ์ˆ˜
    .๋งŽ์ด ์“ฐ๋Š” ๋‹จํ•ญ ํ˜•์‹
    .ํ”Œ๋ž˜๊ทธ ์ธ์ˆ˜ ์ง€์–‘
    .์ธ์ˆ˜ ๊ฐ์ฒด
    .์ธ์ˆ˜ ๋ชฉ๋ก
    .๋™์‚ฌ์™€ ํ‚ค์›Œ๋“œ
    .๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ค์ง€ ๋งˆ๋ผ!.
    .์ถœ๋ ฅ ์ธ์ˆ˜
    .๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ผ.
    .์˜ค๋ฅ˜ ์ฝ”๋“œ๋ณด๋‹ค ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ!.
    .try/catch ๋ธ”๋ก ๋ฝ‘์•„๋‚ด๊ธฐ
    .Error.java ์˜์กด์„ฑ ์ž์„
    .๋ฐ˜๋ณตํ•˜์ง€ ๋งˆ๋ผ.
    .ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์งœ์ฃ ?
    .๊ฒฐ๋ก 


โœ”๏ธ ๋‚ด์šฉ.

 

3. ํ•จ์ˆ˜

 

.์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ!

 

 ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ์ฒซ์งธ ๊ทœ์น™์€ '์ž‘๊ฒŒ!'์ด๋‹ค. ๋ธ”๋ก๊ณผ ๋“ค์—ฌ ์“ฐ๊ธฐ, if/else, while ๋ฌธ ๋“ฑ ๋ธ”๋ก์€ ํ•œ ์ค„์ด์•ผ ํ•˜๋Š” ์˜๋ฏธ๋‹ค.

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

 

 


 


. ํ•œ ๊ฐ€์ง€๋งŒ ํ•ด๋ผ!
ํ•จ์ˆ˜๋Š” ํ•œ ๊ฐ€์ง€๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ ํ•œ ๊ฐ€์ง€๋ฅผ ์ž˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ ํ•œ ๊ฐ€์ง€๋งŒ์„ ํ•ด์•ผ ํ•œ๋‹ค.

 


 

.์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ”๋“œ ์ฝ๊ธฐ:๋‚ด๋ ค๊ฐ€๊ธฐ ๊ทœ์น™

 

 ์ฝ”๋“œ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ์ด์•ผ๊ธฐ์ฒ˜๋Ÿผ ์ฝํ˜€์•ผ ์ข‹๋‹ค.
ํ•œ ํ•จ์ˆ˜ ๋‹ค์Œ์—๋Š” ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•œ ๋‹จ๊ณ„ ๋‚ฎ์€ ํ•จ์ˆ˜๊ฐ€ ์˜จ๋‹ค. ์ฆ‰, ์œ„์—์„œ ์•„๋ž˜๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ฝ์œผ๋ฉด ํ•จ์ˆ˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ํ•œ ๋ฒˆ์— ํ•œ ๋‹จ๊ณ„์”ฉ ๋‚ฎ์•„์ง„๋‹ค.

 


 

.์„œ์ˆ ์ ์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ผ.

 

 ๊ธธ๊ณ  ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์ผ์ˆ˜๋ก ํ•จ์ˆ˜๊ฐ€ ํ•˜๋Š” ์ผ์„ ์ข€ ๋” ์ž˜ ํ‘œํ˜„ํ•˜๋ฏ€๋กœ ์ข‹๋‹ค.
๊ธธ๊ณ  ์„œ์ˆ ์ ์ธ ์ด๋ฆ„์ด ๊ธธ๊ณ  ์„œ์ˆ ์ ์ธ ์ฃผ์„๋ณด๋‹ค ์ข‹๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ •ํ•  ๋•Œ๋Š” ์—ฌ๋Ÿฌ ๋‹จ์–ด๊ฐ€ ์‰ฝ๊ฒŒ ์ฝํžˆ๋Š” ๋ช…๋ช…๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

 


 

.ํ•จ์ˆ˜ ์ธ์ˆ˜

 

 ํ•จ์ˆ˜์—์„œ ์ด์ƒ์ ์ธ ์ธ์ˆ˜ ๊ฐœ์ˆ˜๋Š” 0๊ฐœ์ด๋‹ค.
๋‹ค์Œ์€ 1๊ฐœ, ๋‹ค์Œ์€ 2๊ฐœ์ด๋‹ค. 3๊ฐœ๋Š” ๊ฐ€๋Šฅํ•œ ํ”ผํ•˜๊ณ  4๊ฐœ ์ด์ƒ์€ ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

 


 

.๋งŽ์ด ์“ฐ๋Š” ๋‹จํ•ญ ํ˜•์‹

 

 ํ•จ์ˆ˜์— ์ธ์ˆ˜ 1๊ฐœ๋ฅผ ๋„˜๊ธฐ๋Š” ํ”ํ•œ ์ด์œ ๋Š” ๋‘ ๊ฐ€์ง€์ด๋‹ค.

 

1. ์ธ์ˆ˜์— ์งˆ๋ฌธ์„ ๋˜์ง€๋Š” ๊ฒฝ์šฐ

 

boolean fileExists("MyFile") // MyFile ์กด์žฌ ์—ฌ๋ถ€


2. ์ธ์ˆ˜๋กœ ๋ญ”๊ฐ€๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ

 

InputStream fileOpen("MyFile") // MyFile ์„ InputStream์œผ๋กœ ๋ณ€ํ™˜

 

๊ทธ ์™ธ ํ”ํ•˜์ง€ ์•Š์€ ์‚ฌํ•ญ์œผ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋‹ค.

passwordAttemptFailedNtimes(int attempts) // ์ž…๋ ฅ ์ธ์ˆ˜๋กœ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ ๋ณ€ํ™˜

 

์ด ์™ธ์˜ ๋‹จํ•ญ ํ•จ์ˆ˜๋Š” ๊ฐ€๊ธ‰์  ํ”ผํ•œ๋‹ค.

 

// ๋ณ€ํ™˜ ํ•จ์ˆ˜์—์„œ ์ถœ๋ ฅ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค.
void includeSetupPageInfo(StringBuffer pageText) // X

// ์ž…๋ ฅ ์ธ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ผ๋ฉด ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ ๋Œ๋ ค์ค€๋‹ค.
StringBuffer transform(StringBuffer in) // O

 


 

.ํ”Œ๋ž˜๊ทธ ์ธ์ˆ˜ ์ง€์–‘

 

 ํ”Œ๋ž˜๊ทธ ์ธ์ˆ˜๋Š” true/false์— ๋”ฐ๋ผ ํ•จ์ˆ˜๊ฐ€ ํ•  ์ผ์ด ๋‘ ๊ฐ€์ง€ ์ด์ƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๊ณตํ‘œํ•˜๋Š” ์…ˆ์œผ๋กœ. ์•ž์„œ ๊ณ„์† ์–ธ๊ธ‰๋˜๋Š” 'ํ•œ ๊ฐ€์ง€๋งŒ ํ•ด๋ผ!'์— ์œ„๋ฐฐ๋œ๋‹ค.

 

// X
void setUp(boolean isSet){
}

 


 

.์ธ์ˆ˜ ๊ฐ์ฒด

 

 ์ธ์ˆ˜๊ฐ€ 2~3๊ฐœ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ผ๋ถ€๋ฅผ ๋…์ž์ ์ธ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์งš์–ด๋ณธ๋‹ค.

 

Circle makeCircle(double x, double y, double radius); // before
Circle makeCircle(Point center, double radius); // after

 

 ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์ธ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์ด ๋ˆˆ์†์ž„์œผ๋กœ ๋ณด์ผ์ง€ ๋ชจ๋ฅด์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.
x์™€ y๋ฅผ ๋ฌถ๋“ฏ์ด ๋ณ€์ˆ˜๋ฅผ ๋ฌถ์–ด ๋„˜๊ธฐ๋ ค๋ฉด ์ด๋ฆ„์„ ๋ถ™์—ฌ์•ผ ํ•˜๋ฏ€๋กœ ๊ฒฐ๊ตญ ๊ฐœ๋…์„ ํ‘œํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค.

 


 

.์ธ์ˆ˜ ๋ชฉ๋ก

 

 ๋•Œ๋กœ๋Š” ์ธ์ˆ˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€๋ณ€์ ์ธ ํ•จ์ˆ˜๋„ ํ•„์š”ํ•˜๋‹ค. String.format ๋ฉ”์„œ๋“œ๊ฐ€ ์ข‹์€ ์˜ˆ์ด๋‹ค.

๊ฐ€๋ณ€ ์ธ์ˆ˜๋ฅผ ์ทจํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜์—๋„ 'ํ•จ์ˆ˜ ์ธ์ˆ˜' ์›๋ฆฌ๊ฐ€ ์ ์šฉ๋œ๋‹ค. ๋‹จํ•ญ, ์ดํ•ญ ์‚ผํ•ญ ๋“ฑ์˜ ์ด ์ด์ƒ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

String.format("%s worked %.2f hours.", name, hours);

public String format(String format, Object... args)

 


 

.๋™์‚ฌ์™€ ํ‚ค์›Œ๋“œ

 

 ํ•จ์ˆ˜์˜ ์˜๋„๋‚˜ ์ธ์ˆ˜์˜ ์ˆœ์„œ์™€ ์˜๋„๋ฅผ ์ œ๋Œ€๋กœ ํ‘œํ˜„ํ•˜๋ ค๋ฉด ์ข‹์€ ํ•จ์ˆ˜ ์ด๋ฆ„์ด ํ•„์ˆ˜๋‹ค.

๋‹จํ•ญ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜์™€ ์ธ์ˆ˜๊ฐ€ ๋™์‚ฌ/๋ช…์‚ฌ ์Œ์„ ์ด๋ค„์•ผ ํ•œ๋‹ค. ์˜ˆ๋กœ write(name)์€ ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค.
์ข€ ๋” ์ข‹์€ ์ด๋ฆ„์€ writeField(name)์ด๋‹ค. Field์— ์ด๋ฆ„์„ ์“ด๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 ๋‹ค์Œ์œผ๋กœ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์— ํ‚ค์›Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ˜•์‹์ด๋‹ค. ์ฆ‰ ํ•จ์ˆ˜ ์ด๋ฆ„์— ์ธ์ˆ˜ ์ด๋ฆ„์„ ๋„ฃ๋Š”๋‹ค
์˜ˆ๋กœ assertEquals๋ณด๋‹ค assertExpectedEqualsActual(expected, actual)์ด ๋” ์ข‹๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ์ธ์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ๊ธฐ์–ตํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

 

 


 

.๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ค์ง€ ๋งˆ๋ผ!.

 

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

๋งŒ์•ฝ ํ•„์š”ํ•œ ๋ถ€์ˆ˜ํšจ๊ณผ์ผ ๊ฒฝ์šฐ ํ•จ์ˆ˜ ์ด๋ฆ„์— ๋ถ„๋ช…ํžˆ ๋ช…์‹œํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค. ๋ฌผ๋ก  ํ•จ์ˆ˜๊ฐ€ 'ํ•œ ๊ฐ€์ง€๋งŒ ํ•ด๋ผ!'๋ผ๋Š” ๊ทœ์น™์„ ์œ„๋ฐฐํ•˜๊ฒŒ ๋˜์ง€๋งŒ.

 


 

.์ถœ๋ ฅ ์ธ์ˆ˜

 

 ์ผ๋ฐ˜์ ์œผ๋กœ ์ถœ๋ ฅ ์ธ์ˆ˜๋Š” ํ”ผํ•ด์•ผ ํ•œ๋‹ค. ํ•จ์ˆ˜์—์„œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•จ์ˆ˜๊ฐ€ ์†ํ•œ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์„ ํƒํ•œ๋‹ค.

public void appendFooter(StringBuffer report) // X
report.appendFooter(); // O

 


 

.๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ผ.

 

 ํ•จ์ˆ˜๋Š” ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜  ๋‹ตํ•˜๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ํ•ด์•ผ ํ•œ๋‹ค. ๋‘˜ ๋‹ค ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.
๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์•„๋‹ˆ๋ฉด ๊ฐ์ฒด ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋‘˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋‘˜ ๋‹ค ํ•  ๊ฒฝ์šฐ ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•œ๋‹ค.

 

public boolean set(String attribute, String value); // X ์ƒํƒœ ๋ณ€๊ฒฝ๊ณผ , exists ์—ฌ๋ถ€

public boolean attributeExists(String name): // O exists
public void setAttribute(String name, String value); // O ์ƒํƒœ ๋ณ€๊ฒฝ

 


 

.์˜ค๋ฅ˜ ์ฝ”๋“œ๋ณด๋‹ค ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ!.

 

 ๋ช…๋ น ํ•จ์ˆ˜์—์„œ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์€ ์•ž์„œ ๋งํ•œ '๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ผ' ๊ทœ์น™์„ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์œ„๋ฐ˜ํ•œ๋‹ค. ์ž์นซ if๋ฌธ์—์„œ ๋ช…๋ น์„ ํ‘œํ˜„์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ํƒ“์ด๋‹ค.

 

// X
if(deletePage(page) == E_OK){
	error~~
}

// O	
try{
	deletePage(page);
	...
}catch(Exception e){
	error~~
}

 


 

.try/catch ๋ธ”๋ก ๋ฝ‘์•„๋‚ด๊ธฐ

 

 try/catch ๋ธ”๋ก์€ ์›๋ž˜ ์ถ”ํ•˜๋‹ค. ์ฝ”๋“œ ๊ตฌ์กฐ์— ํ˜ผ๋ž€์„ ์ผ์œผํ‚ค๋ฉฐ, ์ •์ƒ ๋™์ž‘๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋™์ž‘์„ ๋’ค์„ž์ธ๋‹ค. ๋”ฐ๋ผ์„œ try/catch ๋ธ”๋ก์„ ๋ณ„๋„ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ด๋Š” ํŽธ์ด ์ข‹๋‹ค.

 

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋„ ํ•œ ๊ฐ€์ง€ ์ž‘์—…์ด๋‹ค.

// X
public void delte(Page page) {	
	try{
		deletePage(page);
		...
	}catch(Exception e){
		error~~
	}
}

// O
public void delete(Page page) {
	try{
		deletePageAndAllReferences(page);
	}catch(Exception e){
		logError(e);
	}
}


private void deletePageAndAllReferences(Page page) throws Exception {
	deletePage(page)
	...
}

private void logError(Exception e){
	error~~
}

 


 

.Error.java ์˜์กด์„ฑ ์ž์„

 

 ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋Š”, ํด๋ž˜์Šค๋“  ์—ด๊ฑฐํ˜• ๋ณ€์ˆ˜๋“ , ์–ด๋””์„ ๊ฐ€ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

 

public enum Error {
	OK,
	INVALID,
	...
}

 

 ์œ„์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋Š” ์˜์กด์„ฑ ์ž์„์ด๋‹ค. ๋‹ค๋ฅธ ํด๋ž˜์Šค์—์„œ Error enum์„ improt ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์ฆ‰ Error enum์ด ๋ณ€ํ•˜๋ฉด Error enum์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค ์ „๋ถ€๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๊ณ  ์žฌ๋ฐฐ์น˜ํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ๋ž˜์„œ Error ํด๋ž˜์Šค ๋ณ€๊ฒฝ์ด ์–ด๋ ค์›Œ์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์ƒˆ ์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๊ธฐ์กด์˜ ์˜ค๋ฅ˜์ฝ”๋“œ๋ฅผ ์žฌ ์‚ฌ์šฉํ•œ๋‹ค.

 

 ์˜ค๋ฅ˜ ์ฝ”๋“œ ๋Œ€์‹  ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ ์˜ˆ์™ธ๋Š” Exception  ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์žฌ์ปดํŒŒ์ผ/์žฌ๋ฐฐ์น˜ ์—†์ด ์ƒˆ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. -> ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  Exception์œผ๋กœ ์‚ฌ์šฉ. ๊ตณ์ด ErroCode๋ฅผ ์„ ์–ธํ•˜์—ฌ ์˜์กด์„ฑ์„ ๋†’์ผ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 


 

.๋ฐ˜๋ณตํ•˜์ง€ ๋งˆ๋ผ.

 

 ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ •๊ทœ ํ˜•์‹์ด ์žˆ๋“ฏ์ด. ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ฝ”๋“œ๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ๋ชฐ์•„ ์ค‘๋ณต์„ ์—†์•ค๋‹ค.

 


 

.ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์งœ์ฃ ?

 

 ์ฒ˜์Œ๋ถ€ํ„ฐ ์™„๋ฒฝํ•œ ๊ทœ์น™์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋ฅผ ์งœ๊ธฐ๋Š” ์–ด๋ ต๋‹ค. ์ฒ˜์Œ์—๋Š” ๊ธธ๊ณ  ๋ณต์žกํ•˜๋ฉฐ ์ค‘๋ณต๋„ ๋งŽ์„๋ฟ๋”๋Ÿฌ ์•ž์„œ ๋งํ•œ ๊ทœ์น™ ๋Œ€๋ถ€๋ถ„์„ ์œ„๋ฐฐํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ๋น ์ง ์—†์•  ํ…Œ์ŠคํŠธํ•˜๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.

 

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

 


 

.๊ฒฐ๋ก 

 

 ๋ชจ๋“  ์‹œ์Šคํ…œ์€ ํŠน์ • ์‘์šฉ ๋ถ„์•ผ ์‹œ์Šคํ…œ์„ ๊ธฐ์ˆ ํ•  ๋ชฉ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์„ค๊ณ„ํ•œ ๋„๋ฉ”์ธ ํŠนํ™” ์–ธ์–ด(Domain Specific Language, DSL)๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค. ํ•จ์ˆ˜๋Š” ๊ทธ ์–ธ์–ด์—์„œ ๋™์‚ฌ๋ฉฐ, ํด๋ž˜์Šค๋Š” ๋ช…์‚ฌ์ด๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ์ˆ ์€ ์–ธ์ œ๋‚˜ ์–ธ์–ด ์„ค๊ณ„์˜ ๊ธฐ์ˆ ์ด๋‹ค.

 

 ํ”„๋กœ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์‹œ์Šคํ…œ์„ (๊ตฌํ˜„ํ• ) ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹ˆ๋ผ. (ํ’€์–ด๋‚˜๊ฐˆ) ์ด์•ผ๊ธฐ๋กœ ์—ฌ๊ธด๋‹ค. ์•ž์„œ ๋งํ•œ ๊ทœ์น™๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ’€์–ด๊ฐ€๋Š” ๋ฐ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ช…์‹ฌํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

 


 

๐Ÿ“ ๋Š๋‚€์ .

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