@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 API는 REST(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 API는 HTTP 메서드와 URI를 통해 자원을 처리하는 REST 원칙을 따르는 API.
• 자원을 식별하기 위한 URI, 자원에 대한 작업을 수행하기 위한 HTTP 메서드, 그리고 클라이언트-서버 간의 무상태성을 기반으로 설계돼.
• 데이터는 보통 JSON 형식으로 주고받으며, HTTP 상태 코드로 요청 결과를 알림.
'Apache Tomcat' 카테고리의 다른 글
@RequestMapping handler method (0) | 2024.10.11 |
---|---|
@GetMapping, @PostMapping (0) | 2024.10.08 |
Spring MVC, SessionFactory Bean, ContextLoaderListener, ServletContextListener (1) | 2024.10.08 |
Apache Tomcat Server (1) | 2024.10.07 |
Servlet, DispatcherServlet, Special Bean (2) | 2024.10.07 |