Apache Tomcat / / 2024. 10. 8. 11:06

@RestController, View Resolver, RESTful API

@RestController는 Spring Framework에서 사용되는 애노테이션으로, 주로 RESTful 웹 서비스를 구현할 때 사용돼. 이 애노테이션은 Spring의 Controller 역할을 하는 클래스를 정의하는 데 사용되며, 그 클래스가 반환하는 데이터는 **뷰(View)**를 거치지 않고 직접 HTTP 응답 본문에 포함돼.

 

@RestController의 주요 특징

 

1. RESTful 웹 서비스 구현:

@RestController는 JSON 또는 XML 형식으로 데이터를 반환하는 RESTful 웹 서비스 엔드포인트를 쉽게 만들 수 있어. 주로 모바일 앱이나 프론트엔드에서 API 요청을 받을 때 사용돼.

2. @Controller + @ResponseBody의 결합:

@RestController는 **@Controller**와 **@ResponseBody**를 합친 역할을 해.

@Controller는 일반적인 웹 컨트롤러로서 뷰를 반환하는데 사용되고, @ResponseBody는 메서드가 반환하는 값 자체를 HTTP 응답 본문에 포함시켜줘.

따라서 @RestController는 컨트롤러의 모든 메서드에 **자동으로 @ResponseBody**가 적용된다고 보면 돼. 즉, 뷰(JSP, HTML 등)를 반환하는 게 아니라, 메서드에서 반환된 객체가 JSON 또는 XML 형식으로 변환되어 응답 본문에 들어가.

3. JSON/XML 응답:

@RestController는 메서드의 반환 값을 자동으로 JSON 또는 XML로 변환해 클라이언트에게 전달해. 일반적으로 클라이언트는 JSON 응답을 받기 때문에, Spring Boot의 기본 설정은 JSON 형식으로 응답을 보내.

이 과정에서 Jackson 라이브러리가 자동으로 객체를 JSON으로 변환해줘. (Spring Boot 프로젝트에 포함돼 있음)

 

@RestController 사용 예시

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

@RestController
@RequestMapping("/api")
public class MyRestController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, World!";
    }
    
    @GetMapping("/user")
    public User getUser() {
        // 가상의 사용자 객체 반환
        return new User("John", "Doe");
    }
}

 

예시 설명:

 

1. 클래스 레벨의 @RestController:

클래스에 @RestController 애노테이션을 사용해서 이 클래스가 RESTful 컨트롤러임을 명시해.

@RequestMapping("/api"): 이 애노테이션은 기본 URL 패턴을 지정해줌. 모든 메서드는 /api 경로로 시작하는 URL을 처리하게 돼.

2. 메서드 레벨의 @GetMapping:

@GetMapping("/hello"): 클라이언트가 /api/hello로 GET 요청을 보냈을 때 sayHello() 메서드가 호출돼. 이 메서드는 단순히 “Hello, World!“라는 문자열을 반환해.

@GetMapping("/user"): 클라이언트가 /api/user로 GET 요청을 보냈을 때, User 객체가 JSON 형식으로 변환돼서 응답 본문에 포함돼. Spring은 Jackson 라이브러리를 통해 자동으로 User 객체를 JSON으로 직렬화해줘.

 

User 클래스 예시:

public class User {
    private String firstName;
    private String lastName;

    // 생성자, getter, setter 생략

    public User(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

 

이 예시에서 User 객체는 자동으로 JSON으로 변환돼서 응답으로 클라이언트에 반환돼. 클라이언트는 다음과 같은 응답을 받게 될 거야:

{
  "firstName": "John",
  "lastName": "Doe"
}

 

@RestController vs @Controller

 

@RestController:

반환 값이 **뷰(JSP, HTML)**가 아닌 **데이터(JSON/XML)**로 바로 응답 본문에 들어감.

주로 API를 만들 때 사용됨.

@Controller:

**뷰(View)**를 반환하는 웹 애플리케이션을 만들 때 주로 사용.

JSP, Thymeleaf, HTML 같은 템플릿 엔진을 통해 웹 페이지를 렌더링해서 반환.

필요시 @ResponseBody와 함께 사용해서 특정 메서드의 반환 값을 직접 HTTP 응답 본문으로 보낼 수도 있음.

 

요약

 

**@RestController**는 RESTful 웹 서비스를 쉽게 구현할 수 있게 해주는 Spring의 애노테이션.

@Controller@ResponseBody를 결합한 형태로, 모든 메서드의 반환 값이 자동으로 JSON 또는 XML 형식으로 응답 본문에 들어가.

주로 REST API를 만들 때 사용되며, 클라이언트는 주로 JSON 형식의 응답을 받게 돼.

 

Tip💡

**아웃고잉 파라미터(Outgoing Parameter)**는 함수나 메서드가 호출자에게 값을 반환할 때 사용하는 파라미터야. 보통 함수는 리턴 값을 통해 하나의 값을 반환하지만, 여러 값을 반환해야 하거나 다른 방식으로 값을 전달할 때 아웃고잉 파라미터를 사용해.


View Resolver에서의 Model컨트롤러에서 생성된 데이터를 **뷰(View)**에 전달하는 매개체 역할을 해. 즉, Spring MVC에서 컨트롤러가 처리한 결과 데이터를 Model 객체에 담고, View는 이 Model에 담긴 데이터를 사용해 동적으로 웹 페이지를 생성하는 거야.

 

View Resolver와 Model의 상호작용 과정

 

1. 컨트롤러에서 데이터 처리:

Spring MVC의 컨트롤러에서 클라이언트 요청을 처리하고, 결과 데이터를 Model에 담아 뷰로 전달해.

예를 들어:

@Controller
public class MyController {

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

 

여기서 greeting() 메서드는 name이라는 데이터를 Model 객체에 넣고, 뷰 이름으로 "greeting"을 반환해.

 

2. View Resolver가 뷰 선택:

View Resolver는 컨트롤러에서 반환된 뷰 이름("greeting")을 받아서, 실제 사용할 뷰 파일(예: JSP, Thymeleaf, Freemarker 등)을 찾아.

예를 들어, InternalResourceViewResolver가 설정된 경우, "greeting" 뷰 이름을 greeting.jsp 파일로 매핑해서 찾을 수 있어.

3. Model을 뷰에 전달:

View Resolver는 해당 뷰 파일을 렌더링할 때 Model에 담긴 데이터를 함께 전달해. 이 과정에서 뷰 파일은 Model에 있는 데이터를 참조해 동적으로 페이지를 생성할 수 있어.

예를 들어, greeting.jsp 파일이 다음과 같이 데이터를 출력할 수 있어:

<html>
<body>
    <h1>Hello, ${name}!</h1>
</body>
</html>

 

여기서 ${name}Model에 있는 name 속성을 참조해서, "John" 값을 출력하게 돼.

 

4. 최종 응답:

뷰가 렌더링된 후, Model에서 전달된 데이터를 포함한 최종 HTML 페이지가 클라이언트에게 응답으로 전송돼.

 

Model의 역할

 

Model컨트롤러가 처리한 데이터를 뷰로 전달하는 역할을 해.

뷰는 Model에 담긴 데이터를 동적으로 참조해 HTML, JSON, XML 등의 형식으로 응답을 생성할 수 있어.

 

요약

 

Model은 컨트롤러에서 생성된 데이터를 로 전달하는 데 사용돼.

View Resolver는 컨트롤러가 반환한 뷰 이름을 이용해 적절한 뷰 파일을 선택하고, 그 뷰가 Model 데이터를 이용해 동적으로 페이지를 생성하도록 도와줘.

최종적으로 뷰는 Model에서 전달된 데이터를 사용해 사용자에게 보여줄 웹 페이지를 렌더링해.


RESTful APIREST(Representational State Transfer) 원칙을 기반으로 설계된 API를 의미해. REST는 웹의 자원을 정의하고 이를 처리하는 방법에 대한 아키텍처 스타일이야. RESTful API는 주로 HTTP를 통해 자원(Resource)을 다루며, 클라이언트-서버 간의 통신을 단순화하고 표준화하는 데 사용돼.

 

RESTful API의 주요 개념

 

1. 자원(Resource):

REST에서 자원은 시스템에서 중요한 데이터나 개체를 의미해. 예를 들어, 사용자, 게시글, 제품 등이 자원일 수 있어.

자원은 URL(URI)을 통해 고유하게 식별돼.

예시:

사용자 목록 자원: GET /users

특정 사용자 자원: GET /users/{id}

2. HTTP 메서드:

RESTful API는 주로 HTTP 메서드를 사용해 자원을 처리해. 각 메서드는 자원에 대한 특정한 작업을 수행하는 의미를 가짐.

GET: 자원을 조회할 때 사용.

POST: 새로운 자원을 생성할 때 사용.

PUT: 기존 자원을 전체 업데이트할 때 사용.

PATCH: 기존 자원을 부분 업데이트할 때 사용.

DELETE: 자원을 삭제할 때 사용.

예를 들어:

GET /users : 사용자 목록을 가져옴.

POST /users : 새로운 사용자를 생성함.

PUT /users/1 : ID가 1인 사용자의 모든 정보를 업데이트함.

PATCH /users/1 : ID가 1인 사용자의 일부 정보를 업데이트함.

DELETE /users/1 : ID가 1인 사용자를 삭제함.

3. URI(Uniform Resource Identifier):

REST에서는 자원을 고유하게 식별하기 위해 URI를 사용해. 각 자원은 고유한 URI를 가지고 있으며, 이 URI는 자원에 대한 위치를 나타냄.

예시:

/users: 모든 사용자 자원을 나타냄.

/users/{id}: 특정 사용자(ID로 식별되는)를 나타냄.

4. 상태(State)와 Stateless:

REST는 Stateless(무상태성)를 지향해, 즉 서버는 클라이언트의 상태를 저장하지 않음. 요청이 오면 그 자체로 완전한 정보를 포함해야 하고, 이전 요청에 대한 정보에 의존하지 않음.

클라이언트는 요청마다 필요한 모든 정보를 포함해야 해 (예: 인증 토큰, 요청 데이터 등).

5. 표현(Representation):

클라이언트가 자원에 접근할 때, 그 자원의 표현을 받음. 이 표현은 주로 JSON이나 XML 형식으로 전달돼.

예시:

사용자 정보를 조회하면, 서버는 그 자원의 JSON 형식 데이터를 클라이언트에게 반환해.

{
  "id": 1,
  "name": "John",
  "email": "john@example.com"
}

 

6. HTTP 상태 코드:

RESTful API는 HTTP 상태 코드를 사용해 요청에 대한 결과를 클라이언트에게 알려줘.

주요 HTTP 상태 코드:

200 OK: 요청이 성공적으로 처리됨.

201 Created: 요청이 성공적으로 처리되었고, 새로운 자원이 생성됨.

204 No Content: 요청이 성공적으로 처리되었지만, 반환할 데이터가 없음.

400 Bad Request: 클라이언트 요청이 잘못됨.

401 Unauthorized: 인증이 필요함.

403 Forbidden: 요청이 금지됨.

404 Not Found: 자원을 찾을 수 없음.

500 Internal Server Error: 서버 내부 오류 발생.

 

RESTful API 설계 예시

 

예를 들어, 사용자(User) 자원을 관리하는 RESTful API를 설계한다고 하면:

 

1. GET /users: 모든 사용자 목록을 가져오는 API

반환값:

[
  {"id": 1, "name": "John"},
  {"id": 2, "name": "Jane"}
]

 

2. GET /users/{id}: 특정 사용자(ID로 구분)의 정보를 가져오는 API

반환값:

{"id": 1, "name": "John"}

 

3. POST /users: 새로운 사용자를 생성하는 API

요청 본문(JSON):

{"name": "John", "email": "john@example.com"}

 

성공 시 응답: 201 Created와 함께 생성된 자원의 URI 제공 (/users/1)

 

4. PUT /users/{id}: 특정 사용자 정보를 수정하는 API (전체 업데이트)

요청 본문(JSON):

{"name": "John", "email": "newemail@example.com"}

 

성공 시 응답: 200 OK

 

5. DELETE /users/{id}: 특정 사용자를 삭제하는 API

성공 시 응답: 204 No Content

 

RESTful API의 장점

 

표준화된 방식: HTTP 메서드와 URI를 사용해 자원에 대한 작업을 일관된 방식으로 처리.

확장성: RESTful API는 클라이언트-서버 간의 결합도가 낮기 때문에 확장 가능.

무상태성: 서버는 클라이언트의 상태를 저장하지 않으므로 서버의 부하가 줄어듦.

다양한 클라이언트 지원: 브라우저, 모바일 앱 등 다양한 클라이언트에서 사용 가능.

 

요약

 

RESTful APIHTTP 메서드URI를 통해 자원을 처리하는 REST 원칙을 따르는 API.

자원을 식별하기 위한 URI, 자원에 대한 작업을 수행하기 위한 HTTP 메서드, 그리고 클라이언트-서버 간의 무상태성을 기반으로 설계돼.

데이터는 보통 JSON 형식으로 주고받으며, HTTP 상태 코드로 요청 결과를 알림.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유