๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Case Study/Modernization

PHP ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์„ Spring Boot๋กœ ์ „ํ™˜ํ•˜๋ฉฐ ๊ณ ๋ฏผํ–ˆ๋˜ ๊ธฐ๋ก๋“ค

๐Ÿ’ญ ์ „ํ™˜ ๊ฒฝํ—˜์„ ํ†ตํ•œ ํšŒ๊ณ 

์ง„ํ–‰ํ–ˆ๋˜ ์‹œ์Šคํ…œ ๊ฐœํŽธ ํ”„๋กœ์ ํŠธ๋Š” ๋‹จ์ˆœํžˆ ์–ธ์–ด๋ฅผ PHP์—์„œ Spring Boot๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋ณด์•ˆ๊ณผ ์•ˆ์ •์„ฑ์„ ๊ฐ•ํ™”ํ•œ ํ˜„๋Œ€์  ์•„ํ‚คํ…์ฒ˜๋กœ์˜ ์žฌ์„ค๊ณ„๋ฅผ ๋ชฉํ‘œ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ณผ์ •์€ ์‰ฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ ˆ์ฐจ ์ง€ํ–ฅ์ ์œผ๋กœ ์งœ์—ฌ์ง„ ๊ธฐ์กด ์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ ํŒŒ์ผ๊ณผ DB ํ”„๋กœ์‹œ์ €์— ๋กœ์ง์ด ํŒŒํŽธํ™”๋˜์–ด ์žˆ์–ด ๋น„์ฆˆ๋‹ˆ์Šค ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์กฐ์ฐจ ๊ฑฐ๋Œ€ํ•œ ๋„์ „์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— Spring Boot์˜ Bean ๊ด€๋ฆฌ์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ตฌ์กฐ๋ฅผ ์ตํžˆ๊ณ , Thymeleaf๋ฅผ ํ™œ์šฉํ•ด ํ”„๋ก ํŠธ์—”๋“œ๊นŒ์ง€ ํ†ตํ•ฉ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ณผ์ œ๊ฐ€ ์ฃผ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ด๋Ÿฌํ•œ '์–ธ์–ด์˜ ์žฅ๋ฒฝ'๊ณผ '๊ตฌ์กฐ์  ๋ณต์žก์„ฑ'์ด๋ผ๋Š” ๋‚œ๊ด€์„ ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์”ฉ ํ’€์–ด๋‚ด๋ฉฐ ์‹œ์Šคํ…œ์„ ์•ˆ์ฐฉ์‹œ์ผฐ๋Š”์ง€, ๊ณ ๋ฏผ์˜ ํ”์ ๋“ค์„ ๊ธฐ๋กํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

 


๐Ÿšฉ ์ž์œ ๋กœ์šด PHP vs ์—„๊ฒฉํ•œ Spring Boot

๊ฐ€์žฅ ๋จผ์ € ๋งˆ์ฃผํ•œ ๋ฒฝ์€ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๊ตฌ์กฐ์  ์ฐจ์ด์˜€์Šต๋‹ˆ๋‹ค.

PHP ํ™˜๊ฒฝ์—์„œ๋Š” ๋น„๊ต์  ์ž์œ ๋กญ๊ฒŒ ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜๊ณ  ๋กœ์ง์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, Spring Boot 3๋Š” Bean ๊ด€๋ฆฌ, ์˜์กด์„ฑ ์ฃผ์ž…(DI), ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜(Layered Architecture)๋ผ๋Š” ์—„๊ฒฉํ•œ ๊ทœ์น™์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

  ๊ธฐ์กด ํ™˜๊ฒฝ (Legacy PHP) ์‹ ๊ทœ ํ™˜๊ฒฝ (Spring Boot 3)
ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ ˆ์ฐจ ์ง€ํ–ฅ ์ค‘์‹ฌ ๊ฐ์ฒด ์ง€ํ–ฅ (OOP) ์ค‘์‹ฌ
๋ฐ์ดํ„ฐ ํƒ€์ž… ๋А์Šจํ•œ ํƒ€์ž… (Array ์œ„์ฃผ) ๊ฐ•ํ•œ ํƒ€์ž… (DTO/Entity)
๋กœ์ง ๊ด€๋ฆฌ ํŒŒ์ผ ๋ฐ DB ํ”„๋กœ์‹œ์ € ํŒŒํŽธํ™” Layered Architecture
ํ™”๋ฉด ๋ Œ๋”๋ง PHP ๋‚ด์žฅ ํ…œํ”Œ๋ฆฟ Thymeleaf ์—”์ง„
๋ฐฐํฌ ๋ฐฉ์‹ FTP ์ˆ˜๋™ ์—…๋กœ๋“œ GitLab CI/CD ์ž๋™ํ™”

 


๐Ÿ› ๏ธ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋‚ด์žฌํ™”ํ•œ ํ•ต์‹ฌ ์—ญ๋Ÿ‰

๋‹จ์ˆœํ•œ ์–ธ์–ด ์Šต๋“์„ ๋„˜์–ด, ์ ์šฉ๋  ์‹œ์Šคํ…œ์— ์ ์‘ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ญ๋Ÿ‰๋“ค์„ ์ง‘์ค‘์ ์œผ๋กœ ๊ฐ•ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Spring ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ดํ•ด
    • ์ œ์–ด์˜ ์—ญ์ „(IoC)๊ณผ ์˜์กด์„ฑ ์ฃผ์ž…(DI)์„ ํ†ตํ•œ Bean ๊ด€๋ฆฌ ์›๋ฆฌ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ, ๊ฐ์ฒด ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ์„ค๊ณ„๋ฅผ ์ตํ˜”์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ์˜ ๊ทœ๊ฒฉํ™” ๋ฐ ๊ณ„์ธตํ˜• ์•„ํ‚คํ…์ฒ˜(Layered Architecture) ์ ์šฉ
    • Controller-Service-Repository๋กœ ์ด์–ด์ง€๋Š” ๊ณ„์ธต ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฐ ๋ ˆ์ด์–ด์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , ๋ฐ์ดํ„ฐ์˜ ์•ˆ์ •์ ์ธ ํ๋ฆ„์„ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๋А์Šจํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋Œ€์‹  ๊ฐ•ํ•œ ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ DTO/Entity ๊ณ„์ธตํ™”๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.
  • SSR(Server Side Rendering)๊ณผ Thymeleaf์˜ ์กฐํ™”
    • ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์‹ฌ๋„ ์žˆ๊ฒŒ ์ดํ•ดํ•˜๊ณ , Thymeleaf ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ํ™œ์šฉํ•ด ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ™”๋ฉด์— ํˆฌ์˜ํ•˜๋Š” ํ’€์Šคํƒ์  ์—ญ๋Ÿ‰์„ ๋ฐœํœ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • ๊ธฐ์กด์˜ ํผ๋ธ”๋ฆฌ์‹ฑ ๋ฐ ํ”„๋ก ํŠธ์—”๋“œ ์‹ค๋ฌด ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ, ์„œ๋ฒ„์—์„œ ๋‚ด๋ ค์ฃผ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ™”๋ฉด์— ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ๊ทธ๋ ค์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ์ ์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์•ˆ์ •์ ์ธ ์šด์˜์„ ์œ„ํ•œ ์‹ ๊ทœ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ฐ€์ด๋“œ ์Šต๋“
    • ๊ธฐ์กด ์ˆ˜๋™ ๋ฐฐํฌ ๋ฐฉ์‹์˜ ํ•œ๊ณ„๋ฅผ ์ธ์ง€ํ•˜๊ณ , CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ธฐ๋ฐ˜์˜ ์ƒˆ๋กœ์šด ๋ฐฐํฌ ๊ฐ€์ด๋“œ๋ฅผ ์ตํ˜€ ํœด๋จผ ์—๋Ÿฌ๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•˜๋Š” ์šด์˜ ๋งˆ์ธ๋“œ๋ฅผ ๊ฐ–์ถ”์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ฌ ํšŒ๊ณ ๋ฅผ ๋งˆ์น˜๋ฉฐ

์šฐ์—ฌ๊ณก์ ˆ ๋์— ์•ฝ 1๋…„ ๊ฐ„์˜ ์„œ๋น„์Šค ๊ณ ๋„ํ™” ๊ฒธ ์‚ฌ์ดํŠธ ๋ฆฌ๋‰ด์–ผ์ด ์™„์„ฑ๋˜์—ˆ๊ณ  Spring Boot๋กœ์˜ ์ „ํ™˜์„ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ๋งŒํผ ์ค‘์š”ํ–ˆ๋˜ ์ˆ™์ œ๊ฐ€ ํ•˜๋‚˜ ๋” ๋‚จ์•˜์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ ๋ถˆ์•ˆํ•œ FTP ๋ฐฐํฌ ๋ฐฉ์‹์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฐํฌ ๋ฐฉ์‹์„ ์ ์šฉํ•ด ๋‚ด๋Š” ์ผ์ด์—ˆ๋Š”๋ฐ์š”.

์ด ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐœ์„ ํ•˜๋ฉฐ ์„œ๋น„์Šค ์žฅ์• ์œจ์„ ๊ธฐ์กด ๋Œ€๋น„ 80% ์ด์ƒ ๋‚ฎ์ถ˜ ์ด์•ผ๊ธฐ๋Š” ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!