í°ì¤í 리 ë·°
ì§ìì¤ì¸ íë¡ì í¸ë¤ì ë³´ë©´,
íì¬ì ì¤ëíê³ ë§ëí íë¡ì í¸ë¤ì ë¹ì°í BE/FE ëëì´ ê°ë°ì íì§ë§
ì주 ììí, ì¡°ë§ë íì ë¤ì êµ³ì´ BE/FE를 ëëì§ ìê³ ì¬ì í JSP, Timeleafë±ì ë§ì´ ì¬ì©íê³ ìë¤
ê·¸ë¼ ë°± ì½ë를 @RestController를 ì¨ì¼í ì§, @Controller를 ì¨ì¼í ì§ ì¬ì¤ë³´ìëë°
ëì¶© ì´ëì ë ì´ë»ê² ì´ë¤ë§ ìì§ ë´ë¶ 구조를 ìì¸í기 ìì§ ëª»í´ì ììë´
@Controller vs @RestController, ìí©ë³ ì í ê°ì´ë
1. ë ìëµì 목ì ì?
- @Controller (View 기ë°) : ì íµì ì¸ Spring MVCì 컨í¸ë¡¤ë¬. ì£¼ë¡ View(íë©´)ì ë°íí기 ìí´ ì¬ì©íë¤. ë©ìëê° Stringì ë°ííë©´ View Resolverê° í´ë¹ ì´ë¦ì ë·° íì¼(JSP, HTML ë±)ì ì°¾ì ë ëë§íë¤.
- @RestController (Data 기ë°): @Controllerì @ResponseBodyê° ê²°í©ë íí. View를 ì°¾ì§ ìê³ , ë°ííë ê°ì²´(DTO, Map ë±)ì JSONì´ë XMLê°ì ë°ì´í° íìì¼ë¡ ì§ì ìëµ ë³¸ë¬¸ì ìì±íë¤.
2. FE 기ì ë³ ìµì ì ì¡°í©
- Case A : JSPë Thymeleaf를 ì¬ì©íë ê²½ì° (Server-Side Rendering)
ì´ ë°©ìì ìë²ìì ì´ë¯¸ HTMLì ë¤ ë§ë¤ì´ì ë³´ë´ì£¼ë ë°©ìì.- ê¶ì¥ ì í : @Controller
- ì´ì : 컨í¸ë¡¤ë¬ìì ë°ì´í°ë¥¼ Model ê°ì²´ì ë´ì ë·° í í릿ì¼ë¡ ì ë¬í´ì¼ í기 ë문ì
- 주ìì¬í : ë§ì½ JSPíë©´ ììì í¹ì ë¶ë¶ë§ ë¹ë기(Ajax)ë¡ ë°ì´í°ë¥¼ ê°ì ¸ì¤ê³ ì¶ë¤ë©´, í´ë¹ ë©ìëìë§ @ResponseBody를 ë¶ì´ê±°ë ë³ëì @RestController를 ë§ë¤ì´ì¼ í¨
@Controller
public class ViewController {
@GetMapping("/home")
public String homePage() {
return "home"; // home.jsp íì¼ì ì°¾ìê°ë¼ë ë»!
}
}
- Case B : React, Vue, Angular를 ì¬ì©íë ê²½ì° (Client-Side Rendering)
ìë²ë ë°ì´í°ë§ ëì ¸ì£¼ê³ , íë©´ì ë¸ë¼ì°ì (íë¡ í¸ìë)ê° ê·¸ë¦¬ë ë°©ì- ê¶ì¥ ì í : @RestController
- ì´ì : íëì ì¸ ì¹ ìí¤í ì²ììë ìë²ì í´ë¼ì´ì¸í¸ë¥¼ ìì í ë¶ë¦¬í¨. ìë²ë ììíê² ë¹ì¦ëì¤ ë¡ì§ê³¼ ë°ì´í°(JSON) ì ê³µìë§ ì§ì¤íë REST API ìë² ìí ì ìíí´ì¼ í¨
@RestController
@RequestMapping("/api/users")
public class UserApiController {
@GetMapping("/{id}")
public UserDto getUserInfo(@PathVariable String id) {
return userService.findById(id); // { "name": "Hyerin", "role": "Dev" } ê°ì ë°ì´í°ë§ ê°!
}
}
3. ì ì°ì±ì ê³ ë ¤í´ì¼ í¨
ìµê·¼ í¸ë ëë íë©´ ì ì´ì ë°ì´í° ì ê³µì ì² ì í ë¶ë¦¬íë ê²ì.
ë§ì½ íë¡ì í¸ ì´ê¸°ë¼ JSP를 ì°ê³ ìëë¼ë, ëì¤ì 모ë°ì¼ ì±ì´ë Reactë¡ íì¥í ê³íì´ ìë¤ë©´ ì²ìë¶í° API ì ì© ì»¨í¸ë¡¤ë¬(@RestController)ì íë©´ ì ì© ì»¨í¸ë¡¤ë¬(@Controller)를 í¨í¤ì§ ë¨ê³ë¶í° ë¶ë¦¬í´ ëë ê²ì´ ì ì§ë³´ìì í¨ì¬ ì 리í¨.
ëí, @RestController를 ì¬ì©íë©´ ê³µíµ ìëµ ê°ì²´(Common Response)를 ë§ë¤ì´ ìë¬ ì½ëë ë©ìì§ íìì íì¤ííê¸°ê° ë§¤ì° ììí´ì§
@Controller 구조ë
[ Client ] ââ(1) Requestâââ¶ [ Dispatcher Servlet ]
â
ââââââââââââââââââââââââââââââ´âââââââââââââââââââââââââââââ
â (2) Handler Mapping ì¡°í â (3) Controller ê²°ì
â¼ â¼
[ Handler Mapping ] [ Handler Adapter ]
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââ
â (4) ë¹ì¦ëì¤ ë¡ì§ ì¤í â (5) View Name ë°í
â¼ â¼
[ @Controller ] âââ¶ [ Service ] âââ¶ [ DB ] [ Dispatcher Servlet ]
â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´ââââââââ
â (6) íë©´ íì ìì² â (7) ì¤ì View íì¼ ë°í
â¼ â¼
[ View Resolver ] [ View (JSP/HTML) ]
â
[ Client ] âââ(8) Response (HTML ìì±ë³¸) âââââââââââââââââââââââââââââââââââ
@RestController 구조ë
[ Client ] ââ(1) Requestâââ¶ [ Dispatcher Servlet ]
â
ââââââââââââââââââââââââââââââ´âââââââââââââââââââââââââââââ
â (2) Handler Mapping ì¡°í â (3) Controller ê²°ì
â¼ â¼
[ Handler Mapping ] [ Handler Adapter ]
â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââ
â (4) ë¹ì¦ëì¤ ë¡ì§ ì¤í â (5) ê°ì²´(DTO) ë°í
â¼ â¼
[ @RestController ] âââ¶ [ Service ] âââ¶ [ DB ] [ Dispatcher Servlet ]
â
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´ââââââââ
â ð íµì¬: ViewResolver ëì ê°ë â (7) ë³í ë°ì´í° ìì
â¼ â¼
[ HttpMessageConverter ] ââ(6) JSONì¼ë¡ ì§ë ¬í (Serialization) ââââââââââââââ¶ [ Dispatcher Servlet ]
â
[ Client ] âââ(8) Response (JSON Data) ââââââââââââââââââââââââââââââââââââ
JSPì @RestControllerì íì : ë¹ë기 ë°ì´í° ì ë°ì´í¸
JQueryì Ajax ì¬ì©
ì´ ë°©ìì íë©´ì @Controllerê° ì´ì´ì£¼ê³ , ë°ì´í°ë @RestControllerê° ë°°ë¬íë¤ë ë¶ì í¹ì§ì´ ìì
1. ë°±ìë 구ì±
먼ì íë©´ì ë³´ì¬ì£¼ë 컨í¸ë¡¤ë¬ì ë°ì´í°ë¥¼ ì²ë¦¬íë API 컨í¸ë¡¤ë¬ë¥¼ ëë
// íë©´ë´ë¹ (ViewController.java)
@Controller
public class ViewController {
@GetMapping("/user-page")
public String userPage() {
return "userView"; // userView.jsp를 í¸ì¶íì¬ ì ì²´ íë©´ì 그림
}
}
// ë°ì´í° ë´ë¹ (UserApiController.java)
@RestController
@RequestMapping("/api/v1")
public class UserApiController {
@GetMapping("/users/{id}")
public UserDto getUserInfo(@PathVariable String id) {
// ë¹ì¦ëì¤ ë¡ì§ ì¤í í ê°ì²´ ë°í (ìëì¼ë¡ JSON ë³íë¨)
return new UserDto(id, "Hyerin", "Software Developer");
}
}
2. íë¡ í¸ìë êµ¬ì± (userView.jsp)
JSP ììì ë²í¼ì í´ë¦íì ë, íì´ì§ ìë¡ê³ 침 ìì´ ìë²ìì ë°ì´í°ë§ ì ê°ì ¸ì¤ë Ajax ì½ë
<html>
<head>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h2>ì¬ì©ì ì ë³´ ì¡°í</h2>
<input type="text" id="userId" placeholder="ìì´ë ì
ë ¥">
<button id="fetchBtn">ì ë³´ ê°ì ¸ì¤ê¸°</button>
<div id="resultArea" style="margin-top: 20px; border: 1px solid #ccc;">
<p>ì´ë¦: <span id="userName">-</span></p>
<p>ì§ë¬´: <span id="userRole">-</span></p>
</div>
<script>
$('#fetchBtn').click(function() {
const id = $('#userId').val();
// @RestControllerë¡ ë°ì´í° ìì²
$.ajax({
url: '/api/v1/users/' + id,
type: 'GET',
success: function(data) {
// ë°ì´í°ë§ ë°ìì í¹ì ë¶ë¶ë§ ì
ë°ì´í¸!
$('#userName').text(data.name);
$('#userRole').text(data.role);
},
error: function() {
alert('ì¬ì©ì를 ì°¾ì ì ììµëë¤.');
}
});
});
</script>
</body>
</html>
'Programming > BackEnd' ì¹´í ê³ ë¦¬ì ë¤ë¥¸ ê¸
- ë°ê°ìµëë¤. ê¸ì 구ì±ê³¼ íë¦ì´ ë§¤ì° ìì°ì¤ë¬ì ìµëë¤.â¯
- ë¤ë ë¤ ê°ëë¤~ ì½ë ë´ë´ 몰ì íì´ì. ììì ìë¯¸ë¡ â¯
- ë°ë»í ì´ì¼ê¸° ëë¶ì íë£¨ê° ë ì¦ê±°ìì¡ì´ì. ê°ì¬í©ëâ¯
- ê¸ì´ ì°¸ ê¹ì´ê° ìë¤ì. ê°ì ê³¼ ë ¼ë¦¬ê° ì ì¡°í를 ì´ë¤â¯
- Total
- 1,011
- Today
- 0
- Yesterday
- 5
- docker
- subset
- cicd
- ìí
- bruteforce
- dfs
- ì´ìì²´ì
- Java
- dp
- ìì´í 61
- IMAGE
- ì¡°í©
- ì´íí°ë¸ìë°
- BOJ
- OS
- ìì´í 60
- ìì´
- Container
- ìì íì
- í í°ê¸°ë°ì¸ì¦
- ìì´í 59
- ìê³ ë¦¬ì¦
- ê·¸ëííì
- DevOps
- BFS
- Retrofit2
- docker-compose
- EffectiveJava
- springboot
- ë°±ì¤
