๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Self Study/Java

Spring MVC ์—์„œ React ๋กœ ์ „ํ™˜

by Lynnet 2025. 7. 28.
728x90

๐Ÿงฉ React ๋„์ž… ์‹œ ๋ฐฑ์—”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉด ์ข‹์„๊นŒ? (Spring MVC vs React ๊ตฌ์กฐ ์ •๋ฆฌ)

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ Spring Framework + JSP ์กฐํ•ฉ์—์„œ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ React๋กœ ์ „ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

React๋Š” ํ”„๋ก ํŠธ์™€ ๋ฐฑ์ด ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜๋Š” ๊ตฌ์กฐ๋ผ ์ฒ˜์Œ์—๋Š” ๊ธฐ์กด์˜ MVC ํŒจํ„ด๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋ ์ง€์— ๋Œ€ํ•ด ๊ฝค ํ˜ผ๋ž€์ด ์žˆ์—ˆ๋‹ค.
ํŠนํžˆ "React๋ฅผ ์“ฐ๋ฉด ๊ธฐ์กด์˜ Model-View-Controller๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š” ๊ฑฐ์ง€?"๋ผ๋Š” ์งˆ๋ฌธ์ด ์ƒ๊ฒผ๋‹ค.

๊ทธ๋ž˜์„œ React๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ ๊ธฐ์กด Spring MVC ๊ตฌ์กฐ์™€ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ง€๋Š”์ง€๋ฅผ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ดค๋‹ค.
(์ด ๋ถ€๋ถ„์€ ๋‚˜์ค‘์— ๋˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์—์„œ ์ฐธ๊ณ ํ•  ์ผ์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์„œ!)


โœ… ๊ธฐ์กด ๋ฐฉ์‹: Spring MVC + JSP

๊ธฐ์กด์—๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด Java(Spring) ์„œ๋ฒ„๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค:

์š”์ฒญ → Controller → Service → Repository → DB
                        ↓
                     Model (DTO)
                        ↓
                    View (JSP๋กœ HTML ๋ Œ๋”๋ง)
 
  • ์„œ๋ฒ„๊ฐ€ ์ง์ ‘ HTML์„ ๋งŒ๋“ค๊ณ , ๊ทธ๊ฑธ ์‘๋‹ต์œผ๋กœ ๋‚ด๋ ค์ฃผ๋Š” ๊ตฌ์กฐ.
  • ํ”ํžˆ ๋งํ•˜๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR) ๋ฐฉ์‹.

โš›๏ธ React๋กœ ์ „ํ™˜ํ•˜๋ฉด?

React๋Š” SPA(Single Page Application) ๊ตฌ์กฐ๋กœ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML + JS๋ฅผ ๋‚ด๋ ค๋ฐ›์€ ๋’ค
๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ ์œผ๋กœ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋œ๋‹ค.
์ด๋•Œ ์„œ๋ฒ„๋Š” ์˜ค์ง ๋ฐ์ดํ„ฐ๋งŒ JSON์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• .

React (JS/HTML ๋ Œ๋”๋ง + ์‚ฌ์šฉ์ž ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ)
         ↑
    REST API ์š”์ฒญ
         ↓
Java Spring ์„œ๋ฒ„ (Controller → Service → Repository → DB)
  • ์„œ๋ฒ„๋Š” JSP๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์˜ค์ง JSON ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‘๋‹ตํ•˜๋Š” API ์„œ๋ฒ„๋กœ ์‚ฌ์šฉ.
  • ํ”„๋ก ํŠธ์™€ ๋ฐฑ์ด ๋„๋ฉ”์ธ๋„ ๋‹ค๋ฅด๊ณ , ๊ฐœ๋ฐœ๋„ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ๊ตฌ์กฐ๊ฐ€ ๋จ.

๐Ÿ” ๊ทธ๋Ÿผ MVC ํŒจํ„ด์€ ์–ด๋””๋กœ?

์ฒ˜์Œ์—” "React์—์„œ๋Š” Controller๋‚˜ Model์ด ์—†์ž–์•„?"๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์‹ค์ œ๋กœ๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋Œ€์‘๋œ๋‹ค.

์—ญํ•  Spring (๊ธฐ์กด MVC) React
Model DTO, Entity ์ƒํƒœ(state), useState, Redux ๋“ฑ
View JSP JSX ์ปดํฌ๋„ŒํŠธ
Controller @Controller ํด๋ž˜์Šค ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, API ํ˜ธ์ถœ ํ•จ์ˆ˜ ๋“ฑ
 

→ React ๋‚ด๋ถ€์ ์œผ๋กœ๋„ MV*-like ๊ตฌ์กฐ๊ฐ€ ์ ์šฉ๋œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.


๐Ÿ› ๏ธ React + Spring Boot ์—ฐ๋™ ๊ตฌ์กฐ ์˜ˆ์‹œ

 
๐Ÿ“ฆ ์‹œ์Šคํ…œ ๊ตฌ์กฐ

[React Frontend] ←→ [Spring Boot API ์„œ๋ฒ„] ←→ [DB]
      ↑                        ↑
   CSR ๋ฐฉ์‹               REST API (JSON)

๐Ÿ“ ํ”„๋ก ํŠธ (React)

  • axios๋‚˜ fetch๋กœ Spring API ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ ์š”์ฒญ
  • useEffect, useState, Redux, Context ๋“ฑ์œผ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ
  • HTML ๋ Œ๋”๋ง์€ JSX
// React์—์„œ API ํ˜ธ์ถœ ์˜ˆ์‹œ
import axios from 'axios';

useEffect(() => {
  axios.get('http://localhost:8080/api/users')
    .then(res => setUsers(res.data))
    .catch(err => console.error(err));
}, []);

๐Ÿ“ ๋ฐฑ์—”๋“œ (Spring Boot)

  • @RestController๋กœ JSON ์‘๋‹ต ์ œ๊ณต
  • @GetMapping, @PostMapping ๋“ฑ RESTful ๋ฐฉ์‹์œผ๋กœ API ๊ตฌ์„ฑ
  • View(JSP)๋Š” ์ œ๊ฑฐ, ํ…œํ”Œ๋ฆฟ ์—”์ง„๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
@RestController
@RequestMapping("/api/users")
public class UserController {

    @GetMapping
    public List<UserDto> getUsers() {
        return userService.getAllUsers();
    }
}

๐Ÿ“ฆ ์‹ค์ œ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์˜ˆ์‹œ

๐Ÿ“‚ backend-spring
โ”‚   โ””โ”€ src/main/java/...
โ”‚   โ””โ”€ build.gradle / pom.xml
โ”‚   โ””โ”€ application.yml
โ”‚
๐Ÿ“‚ frontend-react
โ”‚   โ””โ”€ src/
โ”‚       โ””โ”€ components/
โ”‚       โ””โ”€ pages/
โ”‚       โ””โ”€ api/axios.js
โ”‚   โ””โ”€ package.json
โ”‚   โ””โ”€ vite.config.js / cra ์„ค์ •
 
  • ์™„์ „ํžˆ ๋‘ ํ”„๋กœ์ ํŠธ๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Œ
  • ๋ฐฐํฌ ์‹œ์—๋Š” React๋ฅผ ๋นŒ๋“œํ•ด์„œ ์ •์  ํŒŒ์ผ๋กœ ๋งŒ๋“  ๋’ค Spring์—์„œ ์„œ๋น™ํ•˜๊ฑฐ๋‚˜, Nginx๋กœ React ๋”ฐ๋กœ ๋ฐฐํฌ๋„ ๊ฐ€๋Šฅ

๐Ÿง  ์ •๋ฆฌ

  • React๋ฅผ ์“ฐ๋ฉด ํ”„๋ก ํŠธ์™€ ๋ฐฑ์ด ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋œ ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค
  • ๋ฐฑ์—”๋“œ๋Š” View๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ์˜ค์ง API๋งŒ ์ œ๊ณต
  • ํ”„๋ก ํŠธ๋„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด Model ์—ญํ• ์„ ์ˆ˜ํ–‰
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ "ํ”„๋ก ํŠธ์˜ MVC + ๋ฐฑ์—”๋“œ์˜ MVC"๊ฐ€ ์กฐํ™”๋กญ๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ฐœ์ „ํ•จ

์ด๋Ÿฐ ๊ตฌ์กฐ๊ฐ€ ์ฒ˜์Œ์—๋Š” ๋‹ค์†Œ ์ƒ์†Œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•œ ๋ฒˆ ๊ฐœ๋…์ด ์žกํžˆ๋ฉด ๊ฐ ๋ ˆ์ด์–ด์˜ ์ฑ…์ž„์ด ๋ช…ํ™•ํ•ด์„œ
์œ ์ง€๋ณด์ˆ˜๋‚˜ ํ™•์žฅ ์ธก๋ฉด์—์„œ ํ›จ์”ฌ ๊น”๋”ํ•ด์ง€๋Š” ๋А๋‚Œ์ด๋‹ค.

728x90
๋ฐ˜์‘ํ˜•