스프링

[Spring]RESTful 환경에서 Controller과 RestController

easy-6 2025. 5. 4. 21:21

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를 사용.