๐งฉ 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"๊ฐ ์กฐํ๋กญ๊ฒ ๋์ํ๋ ๊ตฌ์กฐ๋ก ๋ฐ์ ํจ
์ด๋ฐ ๊ตฌ์กฐ๊ฐ ์ฒ์์๋ ๋ค์ ์์ํ ์ ์์ง๋ง, ํ ๋ฒ ๊ฐ๋
์ด ์กํ๋ฉด ๊ฐ ๋ ์ด์ด์ ์ฑ
์์ด ๋ช
ํํด์
์ ์ง๋ณด์๋ ํ์ฅ ์ธก๋ฉด์์ ํจ์ฌ ๊น๋ํด์ง๋ ๋๋์ด๋ค.
'Self Study > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] ImmutableMap : ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋งต(Map) (1) | 2024.07.08 |
---|---|
[JAVA] instanceof ์ฐ์ฐ์ : ์ธ์คํด์ค์ ํ์ ์ ํ์ธ (0) | 2024.07.01 |