[컨트롤러 관련 용어]
컨트롤러: 클라이언트의 HTTP 요청(Request)을 받아, 서비스 계층으로 요청을 전달하고, 그 결과를 받아 **클라이언트에게 응답(Response)**하는 역할을 담당
- @Controller: 뷰를 반환하는 컨트롤러
- 컨트롤러 메소드는 동적인 데이터를 Model에 담고 뷰 이름을 문자열로 반환 (정적 페이지만 반환하는 경우도 있음)
- 템플릿 엔진이 Model의 데이터와 뷰(html 파일)를 합쳐 완성된 HTML 문서 생성하여 클라이언트에 응답 → 서버 사이드 렌더링 (SSR)
- 주로 서버에서 직접 UI 화면을 그려 제공하는 전통적인 웹 애플리케이션에서 사용
- 템플릿 엔진(JSP, Thymeleaf) 사용하여 서버 사이드 렌더링을 하거나 단순히 페이지 이동을 하는 경우 사용
- @RestController: 뷰를 만들지 않고 데이터를 반환하는 컨트롤러
- = @Contoller + @ResponseBody (클래스 내 모든 메소드에 @ResponseBody 적용)
- 컨트롤러 메소드는 객체 자체를 반환 (문자열을 반환하는 경우도 있음)
- HttpMessageConverter(주로 Jackson)이 객체를 JSON 문자열로 변환하여 HTTP 응답 Body에 담아 클라이언트에 응답 (문자열을 반환한 경우는 그대로 응답 본문에 담음)
- 주로 JSON/XML 형태의 객체를 반환하는 RESTful API 서버에서 사용
- 데이터를 토대로 뷰를 그려주는 프론트엔드 프레임워크(React, Vue.js, Angular)와 연동하는 API 서버에서 사용 → 클라이언트 사이드 렌더링 (CSR)
<aside>
💡
백엔드와 프론트엔드가 분리된 현대적인 아키텍처에서는 서버가 데이터만 제공하는 @RestController기반의 API 서버 구축이 일반적
</aside>
요청 매핑: 클라이언트의 요청 URL을 특정 컨트롤러 메소드와 연결하는 역할
- @RequestMapping: 특정 URL 경로와 메소드를 매핑하는 가장 기본적인 어노테이션 (method 속성을 사용하여 HTTP Method 지정 가능)
- 보통 컨트롤러 클래스 위에서 사용 (공통 URL 경로)
- @RequestMapping("/api")
- @GetMapping: 데이터 조회 요청을 처리할 때 사용 (Read)
- @RequestMapping(method = RequestMethod.GET)의 축약형
- ex) @GetMapping(”/member”)
- @PostMapping: 데이터 생성 요청을 처리할 때 사용 (Create)
- @RequestMapping(method = RequestMethod.POST)의 축약형
- ex) @PostMapping(”/members”)
- @PutMapping: 데이터 전체 수정 요청을 처리할 때 사용 (Update)
- @RequestMapping(method = RequestMethod.PUT)의 축약형
- ex) @PutMapping(”/members”)
- @PatchMapping: 데이터 일부 수정 요청을 처리할 때 사용 (Update)
- @RequestMapping(method = RequestMethod.PATCH)의 축약형
- ex) @PatchMapping(”/members”)
- @DeleteMapping: 데이터 삭제 요청을 처리할 때 사용 (Delete)
- @RequestMapping(method = RequestMethod.DELETE)의 축약형
- ex) @DeleteMapping(”/members”)
<aside>
💡
-
URL 경로 변수(@PathVariable) 사용하여 URL 자체에 리소스 식별하는 ID 포함하는 경우
→ @GetMapping(”/members/{memberId}”)
-
하나의 메소드가 여러 URL 주소를 처리하는 경우
→ @GetMapping(”/members”, “/users”)
-
HTML의 <form> 태그는 GET과 POST 방식만 지원
</aside>
요청 데이터 처리: 클라이언트가 보낸 데이터를 컨트롤러 메소드에서 파라메터로 받음 (요청 파라메터)
<aside>
💡
요청 파라메터 (API 파라미터)
-
쿼리 파라미터 (Query Parameter): URL의 ? 뒤에 붙는 값 (예: /users?page=1
)
-
경로 변수 (Path Variable): URL 경로의 일부로 전달되는 값 (예: /users/{userId}
)
-
요청 본문 (Request Body): POST나 PUT 요청의 본문에 담겨 전달되는 값 (주로 JSON)
</aside>
-
@RequestParam: URL의 쿼리 스트링(Query String) 또는 HTML Form로부터 단일 요청 파라메터 (key=value) 값을 이름(key)으로 찾아 메소드 파라메터로 받음.
- 주요 속성
- value(=name) 속성: 요청 파라메터의 이름(key)
- required 속성: 필수 여부. false로 설정 시 파라메터가 비어있어도 에러 발생안되고 null 할당 (기본 값은 true)
- defaultValue 속성: 파라메터가 없거나 비어있을 때 사용할 기본값. (사용 시, required는 자동으로 false)
//쿼리 스트링 케이스 -> 요청 URL: /api/search?keyword=spring&page=1
@GetMapping("/api/search")
public String search(
@RequestParam("keyword") String kw, //keyword는 필수
@RequestParam(value = "page", defaultValue = "1") int pageNum) {
//kw에는 spring, pageNum에는 1
...
}