카테고리 없음

Rest Controller, Controller의 차이(RESTful)

svdjcuwg4638 2023. 6. 7. 10:29

RestController는 주로 RESTful 웹 서비스를 생성하는데 사용되며, 클라이언트에게 JSON, XML과 같은 형식으로 데이터를 반환합니다. 반면 Controller는 주로 웹 애플리케이션 개발에 사용되어 사용자에게 HTML view를 제공합니다.

 

Rest Controller

RestController는 Spring 4에서 도입된 어노테이션으로, Controller와 ResponseBody 어노테이션을 합친 것입니다. RestController는 주로 RESTful 웹 서비스를 개발하는데 사용되며, HTTP Response Body에 직접 결과를 작성합니다. 즉, RestController는 view를 반환하지 않고 대신 JSON, XML과 같은 형식의 데이터를 반환합니다.

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyRestController {
    
    @GetMapping("/greeting")
    public String greeting() {
        return "Hello, John Doe!";
    }
}

위의 예시에서, "Hello, John Doe!"는 response body로 직접 반환됩니다.

 

 

 

RESTful이란?

REST(REpresentational State Transfer)는 웹 서비스를 설계하는 아키텍처 스타일입니다. 월드 와이드 웹(WWW) 자체와 같이 분산 하이퍼미디어 시스템을 위해 설계되었습니다. 2000년에 로이 필딩(Roy Fielding)이 그의 박사 논문에서 처음으로 소개했습니다.

REST는 다음과 같은 설계 원칙을 따릅니다:

1. **클라이언트-서버 구조(Client-Server)**: 사용자 인터페이스와 데이터 저장을 분리하면, 이들을 독립적으로 개발하고 향상시킬 수 있습니다.

2. **무상태(Stateless)**: 각 요청은 모든 필요한 정보를 가지고 있어야 합니다. 서버는 클라이언트의 상태를 저장하지 않습니다. 이로 인해 서버는 요청을 개별적으로 처리할 수 있어 확장성이 향상됩니다.

3. **캐시 가능(Cacheable)**: 클라이언트는 응답을 캐싱할 수 있습니다. 적절히 관리되는 캐시는 클라이언트-서버 간 상호작용을 부분적으로 또는 완전히 제거하여 성능을 향상시킵니다.

4. **레이어드 시스템(Layered System)**: 클라이언트는 최종 서버가 직접 연결된 서버인지, 중간에 다른 서버를 거치는지 알 수 없습니다. 중간 서버는 로드 밸런싱이나 공유 캐시를 제공하여 시스템의 확장성을 향상시킬 수 있습니다.

5. **코드 온 디맨드 (Code on Demand, 선택 사항)**: 서버는 실행 가능한 코드를 클라이언트에게 제공하여 클라이언트의 기능을 확장할 수 있습니다. 이는 선택적인 요건입니다.

RESTful API는 이러한 원칙을 따르며, 일반적으로 HTTP 메소드 (GET, POST, PUT, DELETE 등)를 사용하여 웹 리소스에 접근합니다. RESTful 웹 서비스는 데이터를 교환할 때 종종 JSON이나 XML 형식을 사용합니다. 

예를 들어, 클라이언트가 `GET /users/123` 요청을 보내면, 서버는 ID가 123인 사용자의 정보를 JSON 형식으로 반환합니다. 이처럼 RESTful 웹 서비스는 특정 URL(또는 "엔드포인트")에 대한 HTTP 요청을 통해 웹 리소스에 접근하고 조작하는 방법을 제공합니다.

 

Controller

Spring에서 Controller는 클라이언트의 요청을 처리하는 클래스를 나타냅니다. Controller는 주로 웹 페이지를 반환하는데 사용됩니다. 즉, 클라이언트가 URL을 요청하면, 해당 URL에 매핑된 Controller가 처리하고, 결과를 view로 렌더링하여 반환합니다.

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MyController {
    
    @GetMapping("/greeting")
    public String greeting(Model model) {
        model.addAttribute("name", "John Doe");
        return "greeting";
    }
}

"greeting"은 반환된 View 이름이며, 이는 실제로는 HTML 파일 이름에 대응합니다( jsp파일 ).