Out Port ์œ„์น˜์— ๋Œ€ํ•œ ์˜๋ฌธ

ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์„ ํฌ๊ฒŒ domain, application, infrastructure layer๋กœ ๋‚˜๋ˆˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, In/Out Port๋ฅผ domain layer์˜ ํ•˜์œ„์— ๋‘๊ณค ํ•œ๋‹ค.

๋จผ์ € In Port์˜ ๊ฒฝ์šฐ, ์™ธ๋ถ€์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— โ€œ์ด๊ฒƒ ์ข€ ํ•ด์ค˜โ€๋ผ๊ณ  ๋ช…๋ น์„ ๋‚ด๋ฆฌ๋Š” ์ž…๊ตฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋‹ค. ๊ธฐ๋ณธ์ ์ธ Layered Architecture ๊ตฌ์กฐ์—์„œ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” Service Layer๋ฅผ, ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” In Port์˜ ๊ตฌํ˜„์ฒด๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

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

์ด๋ฒˆ์—๋Š” Out Port๋ฅผ ์‚ดํŽด๋ณด์ž. Out Port๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ ์™ธ๋ถ€(DB ๋“ฑ)์— โ€œ์ด๊ฒƒ ์ข€ ์ €์žฅํ•ด์ค˜โ€ ๋“ฑ์„ ์š”์ฒญํ•˜๋Š” ์ถœ๊ตฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Out Port์— ๋Œ€ํ•œ ๊ตฌํ˜„์ฒด์ธ Adapter๋Š” ๋ณดํ†ต Infrastructure Layer ํ•˜์œ„์— ๋‘๊ฒŒ ๋˜๋Š”๋ฐ, ์™œ ์ด ์นœ๊ตฌ๋Š” ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€ ์˜๊ตฌ์‹ฌ์ด ๋“ ๋‹ค.

๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ์„ ๋•Œ, Adapater์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ง์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ๋Š” ๊ฝค ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Infrastructure์— ๋‘๋Š” ๊ฒƒ์€ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿผ ์ด์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ Application Layer๊ฐ€ ์•„๋‹Œ Infrastructure Layer์— ๋‘๋Š” ๊ฒƒ์ด ์ข‹์ง€ ์•Š์„๊นŒ? ๊ฐ™์€ Layer ์•ˆ์— ์กด์žฌํ•˜๋‹ˆ๊นŒ ์ข€ ๋” ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด๋‚˜ ์œ ์ง€๋ณด์ˆ˜์— ์ด์ ์ด ์žˆ์ง€ ์•Š์„๊นŒ?

Hexagonal Architecture ์‚ฌ์šฉ ์ด์œ 

์šฐ์„  Hexagonal Architecture์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. Hexagonal Architecture์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ์œ ์—ฐ์„ฑ, ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ ๋“ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์ฆ‰ ๊ฐ ๊ณ„์ธต ๊ฐ„์˜ โ€œ๋ถ„๋ฆฌโ€๋ฅผ ๊ฐ€์žฅ ํฐ ๋ชฉ์ ์œผ๋กœ ๋‘”๋‹ค.

๋งŒ์•ฝ Out Port๊ฐ€ Infrastructure Layer ๋‚ด๋ถ€์— ์žˆ๊ฒŒ ๋˜๋ฉด, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ˆ˜ํ–‰๋˜๋Š” ๊ณผ์ •์—์„œ DB ์ €์žฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ Out Port๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ์ฆ‰, Application Layer์˜ Service๋Š” DB ์ €์žฅ๊ณผ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๊ด€๋ จ๋œ ์ธํ„ฐํŽ˜์ด์Šค, ๊ตฌํ˜„์ฒด๋ฅผ ์ „๋ถ€ Infrastructure Layer์—์„œ ๋Œ์–ด์™€์•ผ ํ•œ๋‹ค.

๋” ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Application์„ ์ง‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , Infrastructure๋ฅผ ๊ฐ€์ „์ œํ’ˆ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ง‘์—์„œ ์‚ด๋‹ค๋ณด๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ฐ€์ „์ œํ’ˆ์ด ํ•„์š”ํ•˜๋‹ค. ๋ฏน์„œ๊ธฐ, ์ „์ž๋ ˆ์ธ์ง€, ๋ƒ‰์žฅ๊ณ  ๋“ฑ ์ˆ˜์—†์ด ๋งŽ์€ ๊ฐ€์ „์ œํ’ˆ์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค. ๋˜ ์–ด๋–ค ๋‚ ์—๋Š” ์•„์˜ˆ ์ฒ˜์Œ๋ณด๋Š” ๋Ÿฐ๋‹๋จธ์‹  ๊ธฐ๊ณ„๋ฅผ ์ง‘์— ๋“ค์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋˜ ์–ด๋–ค ๋‚ ์—๋Š” ์ž˜ ์‚ฌ์šฉํ•˜๋˜ ๋ฏน์„œ๊ธฐ๊ฐ€ ๊ณ ์žฅ๋‚˜์„œ ์ƒˆ๋กœ์šด ์ œํ’ˆ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค.

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

๋ง๋„ ์•ˆ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€์ „์ œํ’ˆ๋“ค์ด ์ง‘์˜ ๋‚ด๋ถ€ ๊ทœ์น™์— ๋งž์ถฐ์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๊ฑธ ๊ทธ๋Œ€๋กœ ๊ฐœ๋ฐœ๊ณผ ์ด์–ด๋ณด์ž.

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด์„œ ์–ด๋–ค ์‹œ์ ์—๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋˜ ์–ด๋–ค ์‹œ์ ์—๋Š” ๊ฐœ๋ฐœ๋œ ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋งŒ์•ฝ Infrastructure ํ•˜์œ„์— Out Port๋ฅผ ์ •์˜ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ์ˆ˜์ •ํ•  ๋•Œ, Application Layer์— ์กด์žฌํ•˜๋Š” Service ๋กœ์ง์„ ์ „๋ถ€ ๊ฐˆ์•„์น˜์›Œ์•ผํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋ง๋„ ์•ˆ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์™ธ๋ถ€ ๊ธฐ์ˆ (Infrastructure Layer)์ด ๋‚ด๋ถ€ ๊ทœ์น™(Application Layer)์— ๋งž์ถฐ์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ง‘์€ 220v์˜ ์ฝ˜์„ผํŠธ ๊ตฌ๋ฉ(Interface)์„ ๋ฏธ๋ฆฌ ๋šซ์–ด๋†“๊ณ , ์ „์ž์ œํ’ˆ์€ 220v์˜ ํ”Œ๋Ÿฌ๊ทธ(Adapter)๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

Adapter?

ํ•œ ๋ฐœ ๋” ๋‚˜์•„๊ฐ€์„œ, ์™œ Out Port์˜ ์ด๋ฆ„์€ Adapter ์ผ๊นŒ? Plug๊ฐ€ ๋” ์ ์ ˆํ•˜์ง€ ์•Š์„๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ์ „์ž์ œํ’ˆ์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ์ œํ’ˆ์—์„œ ํ”Œ๋Ÿฌ๊ทธ๋กœ ์ด์–ด์ง€๋Š” ์ „์„ ๋‹ค๋ฐœ ์ค‘๊ฐ„์— ์ง์œก๋ฉด์ฒด์˜ ์–ด๋–ค ๊ฑฐ๋Œ€ํ•˜๊ณ  ๋ฌด๊ฑฐ์šด ๊ฒƒ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์„ Adapter๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ์ด๋Š” ๋ฒฝ๋ฉด ์ฝ˜์„ผํŠธ์˜ ๊ต๋ฅ˜ ์ „๊ธฐ๋ฅผ ์ „์ž์ œํ’ˆ์ด ์‚ฌ์šฉํ•˜๋Š” ์•ˆ์ •์ ์ธ ์ง๋ฅ˜ ์ €์ „์•• ์ „๊ธฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ Plug๋Š” ๋‹จ์ˆœํžˆ ์ „๋ ฅ ๊ทœ๊ฒฉ์„ ๋งž์ถ”๊ธฐ ์œ„ํ•œ ๋ชจ์–‘์ผ ๋ฟ์ด์ง€, ์‹ค์ œ๋กœ ์ „๋ฅ˜๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” โ€œ๋กœ์งโ€์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ Adapter์ด๊ธฐ ๋•Œ๋ฌธ์— Hexagonal Architecture์—์„œ๋„ Adapter๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒŒ ์•„๋‹๊นŒ ์‹ถ๋‹ค.