๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์Šคํ„ฐ๋””/์˜ค๋ธŒ์ ํŠธ

[์˜ค๋ธŒ์ ํŠธ] 6์žฅ '๋ฉ”์‹œ์ง€์™€ ์ธํ„ฐํŽ˜์ด์Šค'

by moon101 2022. 11. 18.

6์žฅ์—์„œ๋Š” ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค(๊ฐ์ฒด๊ฐ€ ์ˆ˜์‹ ํ•˜๋Š” ๋ฉ”์‹œ์ง€)๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„ ์›์น™์„ ์•Œ๋ ค์ค€๋‹ค.

 

- ๋””๋ฏธํ„ฐ ๋ฒ•์น™

- ๋ฌป์ง€ ๋ง๊ณ  ์‹œ์ผœ๋ผ

- ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค

- ๋ช…๋ น-์ฟผ๋ฆฌ ๋ถ„๋ฆฌ ์›์น™

 

์„ค๊ณ„ ์›์น™์„ ์กฐํ•ฉํ•˜๋ฉด ์ง๊ด€์ ์ด๊ณ , ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œ ์—ฐํ•œ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. 

 

๋ฉ”์‹œ์ง€ = ์˜คํผ๋ ˆ์ด์…˜๋ช… + ์ธ์ž

๋ฉ”์‹œ์ง€ ์ „์†ก = ์˜คํผ๋ ˆ์ด์…˜๋ช… + ์ธ์ž + ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ์ž

์‹œ๊ทธ๋‹ˆ์ฒ˜ = ์˜คํผ๋ ˆ์ด์…˜(๋ฉ”์†Œ๋“œ)๋ช… + ํŒŒ๋ผ๋ฏธํ„ฐ๋ชฉ๋ก

 

๋””๋ฏธํ„ฐ ๋ฒ•์น™

ํ˜‘๋ ฅํ•˜๋Š” ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ฒฐํ•ฉ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์„ค๊ณ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ˆ๋œ ์›์น™

-> ์ (.)์„ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜์ž use only one dot

 

// ์•ˆ์ข‹์€ ์˜ˆ (train wreck)
screening.getMovie().getDiscountConditions();

 

๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๋ฌป๋Š” ์˜คํผ๋ ˆ์ด์…˜์„ ํ–‰๋™์„ ์š”์ฒญํ•˜๋Š” ์˜คํผ๋ ˆ์ด์…˜์œผ๋กœ ๋ฐ”๊พธ์ž.

๊ทธ๋ฆฌ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์–˜๊ธฐํ•ด์•ผ ํ•œ๋‹ค. 

 

// ์ ์ด ์—ฐ๋‹ฌ์•„ ๋‚˜์™€ ์•ˆ์ข‹์€ ์˜ˆ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ IntStream์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ 
// ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์œ„๋ฐ˜ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. 

IntStream.of(1, 15, 20, 3, 9).filter(x -> x > 10).distinct().count();

 

๋””๋ฏธํ„ฐ ๋ฒ•์น™์˜ ์œ„๋ฐ˜ ์—ฌ๋ถ€๋Š” ๋ฌป๋Š” ๋Œ€์ƒ์ด ๊ฐ์ฒด์ธ์ง€, ์ž๋ฃŒ ๊ตฌ์กฐ์ธ์ง€์— ๋‹ฌ๋ ค์žˆ๋‹ค. 

- ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€๊ตฌ์กฐ๋ฅผ ์ˆจ๊ฒจ์•ผ ํ•˜๊ณ 

- ์ž๋ฃŒ ๊ตฌ์กฐ๋Š” ๋‚ด๋ถ€๋ฅผ ๋…ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

 

 

๋ช…๋ น-์ฟผ๋ฆฌ ๋ถ„๋ฆฌ ์›์น™

Command-Query Seperation - ์งˆ๋ฌธ์ด ๋‹ต๋ณ€์„ ์ˆ˜์ •ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. 

 

๋ฃจํ‹ด(routine) ์€ ์–ด๋–ค ์ ˆ์ฐจ๋ฅผ ๋ฌถ์–ด ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ด๋ฆ„์„ ๋ถ€์—ฌํ•œ ๊ธฐ๋Šฅ ๋ชจ๋“ˆ์ด๊ณ 

๋ฃจํ‹ด์€ ๋‹ค์‹œ ํ”„๋กœ์‹œ์ €(procedure)์™€ ํ•จ์ˆ˜(function)๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. 

 

๋ฃจํ‹ด

- ํ”„๋กœ์‹œ์ €(๋ช…๋ น/command) :

-> ๋ถ€์ˆ˜ํšจ๊ณผ(side effect)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์—†๋‹ค.

-> ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์˜คํผ๋ ˆ์ด์…˜ (๋ฐ˜ํ™˜๊ฐ’์—†์Œ)

- ํ•จ์ˆ˜(์ฟผ๋ฆฌ/query) :  

-> ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์—†๋‹ค. 

-> ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์˜คํผ๋ ˆ์ด์…˜ (์ƒํƒœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ)

 

 

๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(imperative programming)

- ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ

- ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด๋“ค์ด ์—ฌ๊ธฐ์— ์†ํ•จ -> ๋ฉ”์‹œ์ง€์— ์˜ํ•œ ๊ฐ์ฒด์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์— ์ง‘์ค‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—

 

ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(functional programming)

- ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ˆ˜ํ•™์ ์ธ ํ•จ์ˆ˜์— ๊ธฐ๋ฐ˜ํ•จ.

- ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ(referential transparency)์˜ ์žฅ์  ๊ทน๋Œ€ํ™” ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฌ์›€

- ํ•˜๋“œ์›จ์–ด์˜ ๋ฐœ๋‹ฌ๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ์ค‘์š”ํ•ด์ง„ ์ตœ๊ทผ์—๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ธ๊ธฐ๊ฐ€ ๋” ๋†’๋‹ค. 

 

 

์ง€๊ธˆ ํ•˜๊ณ  ์žˆ๋Š” ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋Š” ํด๋”๊ตฌ์กฐ๋ฅผ DDD ๋ฐฉ์‹์œผ๋กœ ๋„๋ฉ”์ธ์„ command๋ž‘ query๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋‹ค. ๋‹จ์ˆœํžˆ ์กฐํšŒ๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋‹ˆ๊นŒ query๋ฅผ ๋”ฐ๋กœ ๋บ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๊ด€์ ์—์„œ ์ƒํƒœ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์˜คํผ๋ ˆ์ด์…˜๊ณผ ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์˜คํผ๋ ˆ์ด์…˜์„ ๊ตฌ๋ถ„ํ•ด ๋†“์œผ๋ฉด ๋ฒ„๊ทธ๊ฐ€ ์ ๊ณ , ๋””๋ฒ„๊น…์ด ์šฉ์ดํ•˜๋ฉฐ, ์ฟผ๋ฆฌ์˜ ์ˆœ์„œ์— ๋”ฐ๋ผ ์‹คํ–‰๊ฒฐ๊ณผ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ์˜ ์žฅ์ ์„ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. 

 

command์™€ query์˜ ๋œป์„ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด์„œ ์ด๋ฒˆ ์žฅ์€ ์ข€ ๋” ์žฌ๋ฐŒ๊ฒŒ ์ฝ์€ ๊ฒƒ ๊ฐ™๋‹ค. 

 

 

// TODO 

๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ž€ ๋ฌด์—‡์ธ๊ฐ€? ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ธ๊ฐ€? 

 

 

 

๋Œ“๊ธ€