SSR vs CSR

ํ•œ์ž”ํ•ดยท2025๋…„ 4์›” 17์ผ

๐Ÿ’ก ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)๊ณผ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR)์˜ ๊ธฐ๋ณธ์ ์ธ ์ฐจ์ด์ ๊ณผ ์‹ค์ œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‘ ๊ธฐ์ˆ ์ด ํ˜ผํ•ฉ๋˜์–ด ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์„ ๊ฐ„๋ ฅํ•˜๊ฒŒ ์š”์•ฝํ•ด๋ณด์ž

โœจ SSR

@Controller + View Template -> ์„œ๋ฒ„ ์ธก์—์„œ ํ™”๋ฉด์„ ๋™์ ์œผ๋กœ ๊ทธ๋ฆฐ๋‹ค.

SSR(Server-Side Rendering) : ์›น ํŽ˜์ด์ง€์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์„œ๋ฒ„์—์„œ ์ƒ์„ฑํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

@Controller : Spring MVC์—์„œ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์š”์ฒญ์„ ๋ฐ›์•„ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ทฐ ํ…œํ”Œ๋ฆฟ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ HTML์„ ์ƒ์„ฑํ•œ๋‹ค.

View Template (ex. Thymeleaf,JSP, Freemarker) : HTML ๋ผˆ๋Œ€ ์•ˆ์— ๋™์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์ตœ์ •์ ์ธ HTML์„ ์ƒ์„ฑํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด๋‹ค. ์„œ๋ฒ„ ์ธก์—์„œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ HTML์— ๊ฒฐํ•ฉํ•œ๋‹ค.

๋™์ž‘ ๋ฐฉ์‹

1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ํŽ˜์ด์ง€ ์š”์ฒญ
2. ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
3. ์„œ๋ฒ„๋Š” ๋ทฐ ํ…œํ”Œ๋ฆฟ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTML ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑ
4. ์„œ๋ฒ„๋Š” ์ƒ์„ฑ๋œ HTML ํŽ˜์ด์ง€๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก
5. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ›์€ HTML์„ ๊ทธ๋Œ€๋กœ ํ™”๋ฉด์— ํ‘œ์‹œ.

์žฅ์ 

SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”) ์œ ๋ฆฌ : ๊ฒ€์ƒ‰ ์—”์ง„ ํฌ๋กค๋Ÿฌ๊ฐ€ HTML ์ฝ˜ํ…์ธ ๋ฅผ ์ˆ˜๋น„๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ๋น ๋ฆ„ : ์„œ๋ฒ„์—์„œ ์™„์„ฑ๋œ HTML์„ ๋ณด๋‚ด์ฃผ๋ฏ€๋กœ ์ดˆ๊ธฐ ํ™”๋ฉด์„ ๋น ๋ฅด๊ฒŒ ํ‘œ์‹œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

์„œ๋ฒ„ ๋ถ€ํ•˜ ์ฆ๊ฐ€ : ๋งค๋ฒˆ ํŽ˜์ด์ฆˆ ์š”์ฒญ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ HTML์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŽ˜์ด์ง€ ์ „ํ™˜์‹œ ๊นœ๋นก์ž„ : ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด HTML์„ ๋ฐ›์•„์™€์•ผ ํ•˜๋ฏ€๋กœ ๊นœ๋นก์ž„์„ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

โœจ CSR

@RestController + Data -> ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํ™”๋ฉด์„ ๋™์ ์œผ๋กœ ๊ทธ๋ฆฐ๋‹ค.

CSR(Client-Side Rendering) : ์›น ํŽ˜์ด์ง€์˜ ๋ผˆ๋Œ€(HTML)์™€ JavaScript ํŒŒ์ผ์„ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜จ ํ›„, JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €) ์ธก์—์„œ ํ™”๋ฉด์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹

@RestController : Spring MVC์—์„œ REST API๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜. JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €) ์ธก์—์„œ ํ™”๋ฉด์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹.

Data(JSON, XML) : ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ œ๊ณต.

๋™์ž‘ ๋ฐฉ์‹

1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ํŽ˜์ด์ง€ ์š”์ฒญ
2. ์„œ๋ฒ„๋Š” ์ตœ์†Œํ•œ์˜ HTML ๋ผˆ๋Œ€์™€ JavaScript ํŒŒ์ผ์„ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก
3. ํด๋ผ์ด์–ธํŠธ JavaScript ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜์—ฌ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ.
4. ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฅผ JSON ๋˜๋Š” XML ํ˜•์‹์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก
5. ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTML์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ํ™”๋ฉด์— ํ‘œ์‹œ.

์žฅ์ 

๋น ๋ฅธ ํŽ˜์ด์ง€ ์ „ํ™˜ : ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€ ์ „ํ™˜ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

ํ’๋ถ€ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ : JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

SEO ๋ถˆ๋ฆฌ : ๊ฒ€์ƒ‰ ์—”์ง„ ํฌ๋กค๋Ÿฌ๊ฐ€ JavaScript๋ฅผ ์‹คํ–‰ํ•ด์•ผ ์ฝ˜ํ„ด์ฒด๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์–ด SEO์— ๋ถˆ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„ ๋А๋ฆผ : JavaScript ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•ด์•ผ ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜๋ฏ€๋กœ ์ดˆ๊ธฐ ๋กœ๋”ฉ์†๋„๊ฐ€ ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ๋Š” ๋‘ ๊ฐ€์ง€ ๊ธฐ์ˆ ์ด ํ•จ๊ป˜ ์‚ฌ์šฉ!!

๐Ÿ’ก ํ˜ผํ•ฉ ๋ฐฉ์‹ : ์›น ์–ดํ”Œ๋ž˜์ผ€์ด์…˜์€ SSR ๊ณผ CSR ์˜ ์žฅ์ ์„ ๋ชจ๋‘ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ๊ธฐ์ˆ ์„ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

์ดˆ๊ธฐ ๋กœ๋”ฉ ๋ฐ SEO๊ฐ€ ์ค‘์š”ํ•œ ํŽ˜์ด์ง€ (์˜ˆ: ๋ฉ”์ธ ํŽ˜์ด์ง€, ์ƒํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€): SSR์„ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐ ํ™”๋ฉด์„ ๋น ๋ฅด๊ฒŒ ํ‘œ์‹œํ•˜๊ณ  ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰.

์‚ฌ์šฉ์ž ์ธํ„ฐ๋ž™์…˜์ด ๋งŽ์€ ํŽ˜์ด์ง€ (์˜ˆ: ๋Œ“๊ธ€ ๊ธฐ๋Šฅ, ์‡ผํ•‘ ์นดํŠธ): CSR์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅธ ํŽ˜์ด์ง€ ์ „ํ™˜๊ณผ ํ’๋ถ€ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณต.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•

Next.js, Nuxt.js : React ๋˜๋Š” Vue.js ๊ธฐ๋ฐ˜์˜ SSR ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SSR๊ณผ CSR์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

Spring Boot + React/Vue.js : Spring Boot๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , React ๋˜๋Š” Vue.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์ธก ํ™”๋ฉด์„ ๊ฐœ๋ฐœ. ํ•„์š”์— ๋”ฐ๋ผ SSR์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฐ๋ก 

์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๊ธฐ์ˆ ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ํ˜ผํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

profile
ํ•ญ์ƒ ๋ฐฐ์šฐ๊ณ  ํƒ๊ตฌํ•˜๋Š” ๋…ธ๋ ฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž

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