๐Ÿ—๏ธ ์ž…ํ•™์ „ํ˜•์‹œ์Šคํ…œ, ํ—ˆ๋ฌผ๊ณ  ๋‹ค์‹œ ์ง“์ž - ์„ค๊ณ„ ํŽธ

Ericยท2023๋…„ 1์›” 3์ผ
0

๐Ÿ‘€ ์‚ฌ๊ฑด์˜ ์ „๋ง


์ง€๋‚œ 6์›”, ๋Œ€๊ตฌSW๋งˆ์ด์Šคํ„ฐ๊ณ ์˜ ๊ต๋‚ด ์ž…ํ•™์ „ํ˜•์‹œ์Šคํ…œ ๊ฐœ๋ฐœ์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋œ ๋‚˜๋Š” ์„ ๋ฐฐ๋“ค๋กœ๋ถ€ํ„ฐ ์ธ์ˆ˜์ธ๊ณ„๋ฅผ ๋ฐ›๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ๋Š” ์›ํ‹ฐ๋“œ๋žฉ์— ํ•ฉ๊ฒฉํ•œ ์„ ๋ฐฐ, ๊ทธ๋ฆฌ๊ณ  ๋ฌด๋ ค ํ† ์Šค์— ํ•ฉ๊ฒฉํ•œ ์„ ๋ฐฐ ๋“ฑ ์šฐ๋ฆฌ ํ•™๊ต์˜ ์‹ค๋ ฅ์ž๋“ค์ด ์ž‘์„ฑํ•œ ๊ฒƒ์ด์˜€๊ธฐ์— ๋‚˜๋Š” ์œ ์ง€๋ณด์ˆ˜/์šด์˜ ์—…๋ฌด๋ฅผ ํ†ตํ•ด์„œ ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์›Œ๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ ๊ธฐ๋Œ€ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ.. ๊ทธ๊ฒƒ์€ ์—ด์–ด์„œ๋Š” ์•ˆ๋  ํŒ๋„๋ผ์˜ ์ฝ”๋“œ์˜€๋‹ค.

๋ญ๊ฐ€ ๋ฌธ์ œ์˜€๋Š”๋ฐ?

์ผ๋‹จ ์ด ์ฝ”๋“œ๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ œ์ ์€ ํฌ๊ฒŒ 2๊ฐ€์ง€ ๋ถ„๋ฅ˜๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์ฝ”๋“œ ์Šค๋ฉœ์ด๋ผ๊ณ  ๋ถ€๋ฅผ ๋งŒํ•œ ๊ฒƒ๋“ค์ด์˜€๊ณ , ๋‘๋ฒˆ์งธ๋Š” ๊ทธ๊ฒƒ๋ณด๋‹ค๋„ ๋”๋”์šฑ ์‹ฌ๊ฐํ•œ ๋ณด์•ˆ ๋ฌธ์ œ์˜€๋‹ค.

์•„๋ž˜ ๋‚˜์˜จ ๊ฒƒ๋“ค์€ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ๋“ค์„ ์ •๋ฆฌํ•ด ๋ณธ ๊ฒƒ์ด๋‹ค.

[์ฝ”๋“œ ์Šค๋ฉœ] Controller์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰

์ด ๋ถ€๋ถ„์€ ์ฝ”๋“œ ์Šค๋ฉœ์ด๋ผ๊ณ  ํ•˜๊ธฐ์—๋Š” ์ข€ ์• ๋งคํ•œ ๋ฉด์ด ์กด์žฌํ•˜์ง€๋งŒ, ์œ„์—์„œ ๋ฌธ์ œ๋“ค์„ 2๊ฐ€์ง€ ๋ถ„๋ฅ˜๋กœ๋งŒ ๋‚˜๋ˆ„์—ˆ๊ธฐ์— ์—ฌ๊ธฐ์—์„œ ์„œ์ˆ ํ•œ๋‹ค.

์ œ๋ชฉ ๊ทธ๋Œ€๋กœ, Controller์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ–ˆ๋‹ค. ๊ทธ๋‚˜๋งˆ ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋งŒ ์ด์ฒ˜๋Ÿผ ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด์„œ ๋‹คํ–‰์ด์˜€์ง€, ๋งŒ์•ฝ ๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์—ˆ๋‹ค๋ฉด.. ์•„๋งˆ ์œ ์ง€๋ณด์ˆ˜ ๊ณผ์ •์—์„œ ์ง€๊ธˆ๋ณด๋‹ค๋„ ๋” ๋งŽ์€ ์ž์›(= ์‹œ๊ฐ„)์„ ๋‚ญ๋น„ํ•ด์•ผ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

[์ฝ”๋“œ ์Šค๋ฉœ] ์žฅํ™ฉํ•œ ๋ฉ”์„œ๋“œ

์ด ๋ฌธ์ œ๋Š” ํ•ฉ๊ฒฉ์ž ์‚ฐ์ถœ ๋กœ์ง์ด๋‚˜ ์—‘์…€ ์ž๋ฃŒ ์ƒ์„ฑ ๋กœ์ง(์‹ ์ž…์ƒ ์„ ๋ฐœ๋‹ด๋‹น ์„ ์ƒ๋‹˜๋“ค์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด ์ง€์›์ž๋“ค์˜ ๋ช…๋ถ€๋ฅผ ์—‘์…€ ํŒŒ์ผ๋กœ ์ƒ์„ฑํ•ด ์ฃผ๋Š” ์„œ๋น„์Šค)์„ ๋‹ด๋‹นํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์—์„œ ๋งŽ์ด ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฌผ๋ก  ๊ตฌํ˜„์„ ์œ„ํ•ด ๋ณต์žกํ•œ ๊ณ„์‚ฐ์‹ ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์š”๊ตฌํ•˜๋‹ค ๋ณด๋‹ˆ ์–ด๋Š ์ •๋„๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๊ธธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ์ง์ž‘ํ•˜๊ณ ๋Š” ์žˆ์—ˆ์ง€๋งŒ, 30์ค„์— ๋‹ฌํ•˜๋Š” ๋‚œํ•ดํ•œ ์ฝ”๋“œ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์—„์ฒญ๋‚œ ๋…ธ๋ ฅ์„ ํ•„์š”๋กœ ํ•˜๊ฒŒ ๋  ๊ฒƒ์€ ๋ถˆ ๋ณด๋“ฏ ๋ป”ํ•œ ์ƒํ™ฉ์ด์˜€๋‹ค.

์‹ค์ œ๋กœ ์‹ ์ž…์ƒ ์„ ๋ฐœ ๊ธฐ๊ฐ„(= ์„œ๋น„์Šค ์šด์˜๊ธฐ๊ฐ„)์ด ๋˜์–ด์„œ์•ผ ํ•ฉ๊ฒฉ์ž ์‚ฐ์ถœ ๊ฒฐ๊ณผ์— ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜๋Š” ๋น„์ƒ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์—ˆ๊ณ .. ๊ฒฐ๊ตญ ๋‚˜๋Š” ์ •๊ทœ ์ˆ˜์—…์‹œ๊ฐ„์„ ๋นผ ๊ฐ€๋ฉด์„œ๊นŒ์ง€ ์žฅํ™ฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•ด๊ฐ€๋Š” ๋ผˆ ์•„ํ”ˆ ์ผ์„ ๊ฒช๊ฒŒ ๋˜์—ˆ๋‹ค.

[์ฝ”๋“œ ์Šค๋ฉœ] ๋ฐฉ๋Œ€ํ•œ ํด๋ž˜์Šค

์„œ๋น„์Šค Interface ๋ณ„ ๋ฉ”์„œ๋“œ ๊ฐฏ์ˆ˜๋ฅผ ํ™•์ธํ•ด๋ณด๋‹ˆ, ํ‰๊ท ์ ์œผ๋กœ 10~20๊ฐœ ์‚ฌ์ด์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์กด์žฌํ–ˆ๋‹ค. ํ™•์‹คํžˆ ๋ฉ”์„œ๋“œ ์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์•ž์„œ ๋งํ•œ ์žฅํ™ฉํ•œ ๋ฉ”์„œ๋“œ์™€ ํ•ฉ์ณ์ง„ ํƒ“์—, ์‹ฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์„œ๋น„์Šค์˜ ๊ตฌํ˜„์ฒด ํด๋ž˜์Šค๊ฐ€ 900~1,000 ๋ผ์ธ์— ๋‹ฌํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋ฐœ์ƒํ•˜์˜€๋‹ค. IDE์—์„œ ์ œ๊ณตํ•˜๋Š” ํ…์ŠคํŠธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ์ด ์—†์—ˆ๋‹ค๋ฉด, ์•„๋งˆ ๊ธฐ๋Šฅ ํ•˜๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ์— ์ตœ์†Œ ํ•˜๋ฃจ๋Š” ์žก์•„์•ผ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

[๋ณด์•ˆ] ๋น„๋ฐ€๋ฒˆํ˜ธ ํ‰๋ฌธ ์ €์žฅ

์ด ์„œ๋น„์Šค๋ฅผ ์ธ์ˆ˜์ธ๊ณ„ ๋ฐ›๊ธฐ 1๋…„ ์ „ ์ฏค, ์„ ๋ฐฐ์—๊ฒŒ Spring Boot๋ฅผ ๋ฐฐ์šฐ๋‹ค ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹œ๋ž‘ ์†”ํŠธ๊ฐ’์— ๊ด€ํ•œ ๊ฐœ๋…์„ ์—ฌ์ญค๋ณธ ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด ๋•Œ ์„ ๋ฐฐ๊ฐ€ ์†”ํŠธ๋Š” ์†Œ๊ธˆ์ด์ž–์•„ ใ…‹ใ…‹ใ…‹๋ผ๊ณ  ๋งํ•œ ์ ์ด ์žˆ์—ˆ๋‹ค. ๋‚˜๋Š” ์ด ์„ ๋ฐฐ๊ฐ€ ์ง€๊ธˆ ์žฅ๋‚œ์œผ๋กœ ์ด๋Ÿฌ๋Š”๊ฑฐ๊ฒ ์ง€?๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ.. ๊ทธ ์„ ๋ฐฐ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋‹ตํ•œ ์ด์œ ๋ฅผ ๋“œ๋””์–ด ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

2022๋…„ ์ง€์›ํ•œ ์‹ ์ž…์ƒ๋“ค์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋˜์—ˆ๋˜ ๊ฒƒ์ด์˜€๋‹ค. ํ”„๋กœ์ ํŠธ์˜ ์–ด๋Š ๊ณณ์—์„œ๋„ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ•ด์‹œํ•˜๋Š” ๋กœ์ง์€ ์ฐพ์•„๋ณผ ์ˆ˜ ์—†์—ˆ๋‹ค. ๊ฒฐ๊ตญ ๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, Spring Security ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์˜์กด์„ฑ์— ์ถ”๊ฐ€ํ•œ ๋’ค ์ธ์ฆ ๋กœ์ง์— ์ถ”๊ฐ€ํ•˜๋Š” ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. (์ด ๋ฌธ์žฅ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค์‹œํ”ผ, ์‚ฌ์‹ค ์ด ํ”„๋กœ์ ํŠธ์˜ ์ธ๊ฐ€ ๋กœ์ง์€ Spring Security๊ฐ€ ์•„๋‹ˆ๋ผ Interceptor๋กœ ์ง์ ‘ ๊ตฌํ˜„๋˜์–ด ์žˆ์—ˆ๋‹ค)

[๋ณด์•ˆ] ๊ฐœ์ธ์ •๋ณด ํ‰๋ฌธ ์ €์žฅ

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

์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“œ๋Š” ์„œ๋น„์Šค

๊ฒฐ๊ตญ, ๋‚˜๋Š” ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์„œ๋น„์Šค๋ฅผ ํž˜๋“ค๊ฒŒ ์œ ์ง€๋ณด์ˆ˜/์šด์˜ํ•˜๋ฉฐ ๋ฒ„ํ…จ ๋‚˜๊ฐ”๊ณ , 2023๋…„๋„ ์‹ ์ž…์ƒ ์„ ๋ฐœ์„ ๋๋งˆ์นœ 10์›”์ด ๋˜์–ด์„œ์•ผ ์ž์œ ์˜ ๋ชธ์ด ๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋™์•ˆ ๋ฐ›์€ ์ŠคํŠธ๋ ˆ์Šค๋กœ ์ธํ•ด ๋™์•„๋ฆฌ์˜ PM์ง์„ ๋‚ด๋ ค๋†“๊ฒŒ ๋˜์—ˆ๋‹ค. (์ƒˆ PM์ง์€ ๋‚˜๋ณด๋‹ค ๋” ์‹ค๋ ฅ ์žˆ๋Š” ์นœ๊ตฌ์—๊ฒŒ ๋„˜๊ธฐ๊ฒŒ ๋˜์—ˆ๋‹ค)

๊ทธ๋ฆฌ๊ณ  ์–ผ๋งˆ ์•ˆ ์žˆ์–ด, ์ˆ˜ํ•™์—ฌํ–‰๊ณผ ๊ธฐ๋ง๊ณ ์‚ฌ ๋“ฑ ๊ตต์งํ•œ ์ผ์ •๋“ค๋กœ ์ธํ•ด ์ž…ํ•™์ „ํ˜•์‹œ์Šคํ…œ์€ ๋‚ด ๊ธฐ์–ต์†์—์„œ ์žŠํ˜€์ง„ ํ‘์—ญ์‚ฌ๊ฐ€ ๋˜์—ˆ๋‹ค. 12์›” ๋ง์ด ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š”..

๊ธฐ๋ง๊ณ ์‚ฌ๊ฐ€ ๋๋‚˜๊ณ  ํ•  ์ผ์ด ์—†์–ด์ง€์ž, ๋‚˜๋Š” ํ•  ์ผ์„ ์ฐพ๋‹ค๊ฐ€ ๋‹ค์‹œ ์ž…ํ•™์ „ํ˜•์‹œ์Šคํ…œ์„ ๋– ์˜ฌ๋ฆฌ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ž…ํ•™์ „ํ˜•์‹œ์Šคํ…œ ์šด์˜์€ ๋งค๋…„ 2ํ•™๋…„๋“ค์ด ์šด์˜ํ•˜๊ธฐ์—, ๋‚ด๋…„ ์‹ ์ž…์ƒ ๋ชจ์ง‘๋•Œ์—๋Š” 1ํ•™๋…„ ์นœ๊ตฌ๋“ค์ด ์ด ์ฝ”๋“œ๋ฅผ ๋˜ ํž˜๋“ค๊ฒŒ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ณ  ์šด์˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ณ  ๋‚˜์„œ, ํ›„๋ฐฐ๋“ค์ด๋‚˜๋งˆ ์ž…ํ•™์ „ํ˜•์‹œ์Šคํ…œ์„ ์šด์˜ํ•˜๋ฉด์„œ ๋ฐ›์„ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

๐Ÿ‘ท ์„ค๊ณ„

๊ทธ๋ ‡๊ฒŒ, ์ƒˆ๋กœ์šด PM ์นœ๊ตฌ์™€ ํ•จ๊ป˜ ์ƒˆ ์ž…ํ•™์ „ํ˜•์‹œ์Šคํ…œ(์•ž์œผ๋กœ๋Š” IDA๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ๋‹ค)์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋จผ ์—ฌ์ •์„ ๋– ๋‚˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์Šคํƒ

๋ฌธ์ œ์˜ IDA ๋ฐฑ์—”๋“œ๋Š” ์‚ฌ์‹ค Kotlin์œผ๋กœ ์ž‘์„ฑ๋˜์–ด, Java๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•˜๋˜ ๋‚˜์™€ ์ƒˆ PM ์นœ๊ตฌ์—๊ฒŒ๋Š” ๋„ˆ๋ฌด๋‚˜๋„ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ์˜€๋‹ค. ๋”ฐ๋ผ์„œ IDA ๋ฐฑ์—”๋“œ์˜ ์ƒˆ ๋ฒ„์ „์€ Java๋กœ ์ž‘์„ฑํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ, ์ง„์ž…์žฅ๋ฒฝ์ด ๋‚ฎ์€ MySQL์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋‹ค๋งŒ DB ์Šคํ‚ค๋งˆ์˜ ๊ฒฝ์šฐ ์ •๊ทœํ™”๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ธฐ์กด ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ์— ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ์กด ์„œ๋น„์Šค์—์„œ ๋™์ผํ•œ ์—ฐ์‚ฐ์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ ์‚ฌ๋ก€๋ฅผ ๋ชฉ๊ฒฉํ•˜์˜€๊ธฐ์—, ์บ์‹œ ๋ชฉ์ ์œผ๋กœ Redis๋„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

ORM์˜ ๊ฒฝ์šฐ Spring Boot JPA๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ , ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด QueryDSL์„ ์ถ”๊ฐ€๋กœ ๋ถ™์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์Šคํƒ์œผ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ๋‹ค:

  • ์–ธ์–ด: Java
  • DB: Mysql(MariaDB), Redis(์บ์‹ฑ ๋ชฉ์ )
  • Library: Spring Boot JPA, QueryDSL

์•„ํ‚คํ…์ฒ˜

๋ณธ๋ž˜ ์ƒˆ ๋ฒ„์ „์˜ IDA๋Š” MSA ๊ธฐ๋ฐ˜์œผ๋กœ ์ œ์ž‘๋  ์˜ˆ์ •์ด์˜€๋‹ค. ํ•˜์ง€๋งŒ ์‹œ๊ฐ„์ด ์ด‰๋ฐ•ํ•˜๋‹ค๋Š” ์ , ๊ทธ๋ฆฌ๊ณ  MSA๋ฅผ ๊ตฌ์„ฑํ•  ๋งŒํผ์˜ ํŠธ๋ž˜ํ”ฝ์ด ๋ฐœ์ƒํ•˜์ง€๋„ ์•Š๋Š”๋ฐ๋‹ค ์˜ˆ์‚ฐ๋„ ๋„‰๋„‰ํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•ด ์ถ”ํ›„ MSA๋กœ์˜ ์ „ํ™˜์ด ์ˆ˜์›”ํ•œ ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜(Hexagonal Architecture)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

์˜ˆ์ „์— ๋Œ€๋•์†Œํ”„ํŠธ์›จ์–ด๋งˆ์ด์Šคํ„ฐ๊ณ  ์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๋‹น์‹œ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์€ gradle ๊ธฐ๋ฐ˜์˜ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ๋กœ์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ด๋ฃจ์–ด์ ธ ์žˆ์—ˆ๋‹ค:

  • Root Project
    • Domain ๋ชจ๋“ˆ - ๋„๋ฉ”์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
    • Infrastructure ๋ชจ๋“ˆ - API(Application Programming Interface) ๋ฐ SPI(Service Provider Interface)

์ด๋ ‡๊ฒŒ ๋ชจ๋“ˆ์ด Domain๊ณผ API/SPI๋กœ๋งŒ ๊ตฌ๋ถ„์ด ๋˜์–ด์žˆ์—ˆ๊ธฐ์—, ๊ฐœ๋ฐœํ•  ๋•Œ ํŒŒ์ผ/๋””๋ ‰ํ„ฐ๋ฆฌ๋“ค์ด ์›Œ๋‚™ ๋งŽ์•„์„œ IDE๊ฐ€ ๋‚œ์žกํ•ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ์ ์ด ์žˆ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ฐœ๋ฐœ์—๋Š” ๋ชจ๋“ˆ์„ Domain๊ณผ API/SPI๋กœ ๊ตฌ๋ถ„ํ•จ์€ ๋ฌผ๋ก , ๊ฑฐ๊ธฐ ๋‚ด์—์„œ๋„ ๋„๋ฉ”์ธ ๋ณ„๋กœ ๋ชจ๋“ˆ์„ ๋‚˜๋ˆ„์–ด ๊ฐœ๋ฐœ ์‹œ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ณ ์ž ํ•˜์˜€๋‹ค. ์•„์ง ๊ฐœ๋ฐœ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š์•„์„œ ์ถ”์ธก์ผ ๋ฟ์ด์ง€๋งŒ, ๋‚˜์ค‘์— MSA๋กœ ์ „ํ™˜ํ•  ๋•Œ์—๋„ ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ํŽธ์ด ํ›จ์”ฌ ํŽธ๋ฆฌํ•  ๊ฒƒ์ด๋ผ ์ƒ๊ฐ์ด ๋œ๋‹ค. (๋„๋ฉ”์ธ ๋ณ„๋กœ ๋ชจ๋“ˆ๋“ค์ด ๋‚˜๋ˆ ์ง€๊ธฐ ๋•Œ๋ฌธ์— MSA ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์—๋„ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์˜ฎ๊ธฐ๊ธฐ์— ๋” ํŽธ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—..? ์ด๋Ÿฐ ์ถ”์ธก์„ ํ•ด ๋ณด์•˜๋‹ค ๋ฌผ๋ก  ์ถ”์ธก์ด ์ž˜๋ชป๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ๋„ ๋†’๋‹ค..)

์ตœ์ข…์ ์œผ๋กœ IDA์˜ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋  ๊ฒƒ์ด๋‹ค:

Root Module
โ”œโ”€โ”€ Domain-Layer
โ”‚   โ”œโ”€โ”€ User domain
โ”‚   โ”œโ”€โ”€ Score domain
โ”‚   โ”œโ”€โ”€ Admin domain
โ”‚   โ””โ”€โ”€ ...
โ””โ”€โ”€ Application-Layer
    โ”œโ”€โ”€ Http API (for all domains)
    โ”œโ”€โ”€ User SPI (for User domain)
    โ”œโ”€โ”€ Score SPI (for Score domain)
    โ”œโ”€โ”€ Admin SPI (for Admin domain)
    โ””โ”€โ”€ ...

Http API(Spring Boot ๊ธฐ๋ฐ˜)๋งˆ์ € ๋„๋ฉ”์ธ๋ณ„๋กœ ๋ถ„๋ฆฌํ•ด๋ฒ„๋ฆด ๊ฒฝ์šฐ Spring Boot์— ์˜์กดํ•˜๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ๋„ˆ๋ฌด ๊ณผํ•˜๊ฒŒ ๋งŽ์•„์ง„๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๊ธฐ์—, HTTP API์˜ ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ๋กœ ํ†ตํ•ฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

์ฝ”๋“œ ์ž‘์„ฑ ๊ทœ์น™

์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ์—๋Š”, ์•ž์„œ ์–ธ๊ธ‰๋œ ๋ฌธ์ œ์ ๋“ค์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ณ , ๊ทœ์น™๋„ ์ •ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

๋จผ์ € ๊ธฐ๋ณธ์ ์ธ ์ฝ”๋“œ ์Šค๋ฉœ์„ ์žก๊ธฐ ์œ„ํ•ด, Sonarcloud๋ฅผ ์ด์šฉํ•œ CI๋ฅผ ์„ค์ •ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ํŠนํžˆ ์žฅํ™ฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ๋ฉ”์„œ๋“œ๋ณ„ ๋ผ์ธ ์ œํ•œ ๊ทœ์น™๋„ ์ ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ์ฐพ์•„๋ณผ ์˜ˆ์ •์ด๋‹ค.

๐Ÿ‘‹ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์ด๋ ‡๊ฒŒ ์ž…ํ•™์ „ํ˜•์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๋Š” ์ƒˆ๋กœ์šด ์—ฌ์ •์ด ์‹œ์ž‘๋˜์—ˆ๋‹ค. ์•ž์œผ๋กœ 2์›” ์ดˆ๊นŒ์ง€ IDA์˜ ๊ฐœ๋ฐœ ํ˜„ํ™ฉ, ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๊ฒช์€ ๋ฌธ์ œ์ ๊ณผ ํ•ด๊ฒฐ์ฑ…๋“ค์„ Velog์—์„œ ๊ณต์œ ํ•˜๊ณ ์ž ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ๊ฐ€ ์ž˜ ์™„์„ฑ๋˜์–ด ์˜ฌํ•ด ์‹ ์ž…์ƒ ์„ ๋ฐœ ์—…๋ฌด๋Š” ์ˆ˜์›”ํ•˜๊ฒŒ ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ.

profile
Backend Engineer | ์ฝ”๋“œ๋กœ ์šฐ๋ฆฌ์˜ ์„ธ์ƒ์„ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ณ ๋ฏผํ•ฉ๋‹ˆ๋‹ค

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 1์›” 11์ผ

์ž˜์ƒ๊ฒผ์–ด์š”

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ