RESTful 환경에서 @Controller을 사용할지, @RestController를 사용할지에 대해 정리가 필요해서 작성하게 되었다.
정리에 앞서 알아두어야할 내용이 2가지 있다.
1. RESTful이 무엇인지?
2. @Controller와 @Restcontroller의 차이
3. 결론
1. RESTful이란?
REST( Representational State Transfer )는 HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것
* 자원(Resource)
자원은 URI로 식별할 수 있음
자원 예시
- GET /products → 전체 상품 목록 자원
- GET /products/123 → ID 123번 상품 자원
*표현(Presentation)
표현은 JSON, XML, HTML 등 클라이언트가 이해할 수 있는 형식
* 표현 예시
// GET /products/123
data : {
"id": 123,
"name": "무선 이어폰",
"price": 82000
}
| 자원(Resource) | URI는 서버의 “자원”을 가리킵니다. (예: /users, /products/123) |
| HTTP 메서드 | 자원에 대한 동작은 HTTP 메서드로 표현합니다. |
| • GET /users → 사용자 목록 조회 • POST /users → 사용자 생성 • PUT /users/123 → 사용자 123 전체 수정 • PATCH /users/123 → 사용자 123 일부 수정 • DELETE /users/123 → 사용자 123 삭제 |
|
| 무상태성(Stateless) | 각 요청에 필요한 모든 정보를 담아야 합니다. 서버는 세션에 상태를 저장하지 않습니다. |
| 표현(Representation) | 자원은 JSON, XML, HTML 등 다양한 형태로 표현될 수 있습니다. |
| 클라이언트-서버 분리 | UI(웹/모바일)와 데이터 처리(API)를 분리하여 독립적으로 개발·배포 가능 |
2. @Controller와 @Restcontroller의 차이
스프링 프레임워크에서 JSP와 같은 뷰 화면을 불러올 때는 반드시 @Controller를 사용하고, @Restcontroller는 REST API 전용이며, 즉 데이터를 응답할 때만 사용함.
| 어노테이션 | 상황 | 설명 |
| @Controller | JSP/HTML 화면 렌더링 | @RestController |
| @RestController | JSON/XML 데이터 응답 | @ResponseBody가 적용돼 문자열, 객체 등을 바로 HTTP 응답으로 보냄 |
| @RestController | RESTful API 서버 개발 | React, Vue, Android 같은 클라이언트에 JSON 전송 |
@Controller 예시 (화면 뷰를 보여주는 경우)
@Controller
@RequestMapping("/user")
public Class UserController{
@RequestMapping("/signup")
public String showSignupForm(){
return "user/signup"; // 일반적인 spring의 설정에서는 views 안에 존재하는 user폴더의 signup.jsp의 경로를 의미함
// WEB-INF/views/user/signup.jsp
}
}
@RestController (데이터를 JSON으로 주는 REST AP)
@RestController
@RequestMapping("/user")
public Class UserController{
public Map<String,Object> getUserInfo(){
Map<String,Object> result = new HashMap<>();
result.put("name" : 홍길동);
result.put("age" : 18);
return result; // 서버에서 클라이언트에게 JSON으로 전송
}
}
한 컨트롤러에 섞어야하는 경우
예시로 회원가입의 경우 가입 화면을 보여주고 , 데이터를 통해 데이터를 반환할 경우 @Controller인지 @RestController인지 헷갈릴 수 있다.
* Controller에서 VIEW와, JSON/XML 을 같이 보내야하는 경우
@Controller
@RequestMapping("/user")
public Class UserController{
@RequestMapping("/signup")
public String ShowUserSignup(){
return user/singup // servlet으로 인해서 views/user/signup.jsp로 경로 설정됨
}
@Autowired
UserService userService;
@PostMapping("/signup")
@ResponseBody // Json 데이터로 변환
public Map<string.Object> signupSubmit(@RequestBody UserVO userVO){
Map <String,Object> result = new HashMap<>();
userService.InsertID(userVO); // service를 통해 Mapper까지 연결 후 sql로 삽입
try {
userService.insert(userVO);
result.put("status", "success");
}
catch(exception e){
result.put("status", "error");
}
return result.
}
}
* 해당 클라이언트- 서버 구조에서 보내는 요청
// 입력 양식 폼에서 아이디에 해당하는 값을 가져와서 변수 설정
user_id = document.getElemenById('user_Id').value;
user_name = document.getElementById('user_name').value;
// user라는 객체 생성
// = 기호로 변수를 할당하며, 객체 안에서는 키 : 값의 쌍으로 속성을 정의함
var user = {
user_id : user_id
user_name : user_id
};
// 생성한 user 객체를 클라이언트에서 JSON 타입으로 전송
$.ajax({
url:'user/signup',
method: 'POST',
data: JSON.stringify(user),
contentType:'application/json',
success : function(response){
if(response.status === true){
alert('회원가입 성공했습니다.);
window.location.href = '/login';
}else{
// false일 경우
alert('회원가입에 실패했습니다.');
}
},error:function(){
alert(response.message);
}
});
3. 결론
한줄 요약 => 화면을 보여줄 때는 @Controller, 데이터만 JSON 등으로 응답할 때는 @RestController를 사용.
'스프링' 카테고리의 다른 글
| [Spring] 스프링 pom.xml 설정시 발생한 에러 내용 :: Exception java.lang.ExceptionInInitializerError: Cannot access defaults field of Properties (0) | 2025.06.29 |
|---|---|
| [SpringBoot] IntelliJ를 통한 스프링 설치 (0) | 2025.05.13 |
| [Spring] DI의 3가지 Field주입, Setter주입, 생성자 주입 (0) | 2025.03.16 |
| [Spring] ctrl + space 작동되지 않을 때 (0) | 2025.02.17 |
| [Spring] file 업로드 시에 발생하는 오류 (0) | 2025.02.16 |