
@Controller 는 클라이언트 요청이 들어오면 View로 이동한다. View는 Thymeleaf 같은 템플릿 엔진을 통해 HTML을 만들고, ui와 data가 합쳐진 완성된 HTML을 브라우저에 전달한다. 브라우저는 받은 HTML을 그대로 보여주기만 하면 된다. 즉, Controller가 데이터를 직접 주는 게 아니라 템플릿 엔진이 템플릿 안의 ui를 자동으로 찾아서 실행하고 완성된 html을 만드는 역할을 담당한다.
@RestController 는 View 없이 클라이언트 요청에 바로 응답한다. Java 객체를 반환하면 Jackson이 자동으로 JSON 또는 XML 형태로 직렬화해서 응답 본문에 담아 전달한다.
@Controller | @RestController | |
|---|---|---|
| 응답 형태 | HTML (템플릿 엔진 필요) | JSON/XML |
| View 존재 여부 | O (Thymeleaf 등) | X |
| 반환값 | View 이름 (String) | Java 객체 |
| 주 용도 | 화면이 있는 MVC | REST API |
클래스 위에 @RequestMapping(”/경로”) 를 붙이면 공통 경로를 지정할 수 있다. 메소드별로 세부 경로를 추가해서 URL을 구성한다.
@Controller
@RequestMapping("/users")
public class UserController {
@GetMapping("/info") // GET /users/info
@PostMapping("/join") // POST /users/join
@PutMapping("/{id}") // PUT /users/1
@DeleteMapping("/{id}") // DELETE /users/1
}
경로 뒤에 데이터가 ?key=value 형태로 붙는다. 단순한 데이터 조회 요청에 사용하낟. Postman에서는 Params 탭에 작성한다.
요청 Body에 데이터를 담아 전송한다. 로그인, 회원가입처럼 서버에 특정 작업을 요청할 때 사용한다. 데이터 크기 제한이 없다. Postman에서는 Body 탭에 작성한다.
수정 요청에 사용한다. PUT은 전체 수정, PATCH는 일부 수정이지만 실무에서는 대부분 PUT을 사용한다.
삭제 요청에 사용한다.
HTTP 메시지는 세 부분으로 구성된다.
시작행 (딱 한 줄) : GET /users/1 HTTP/1.1
헤더 (여러 줄) : Content-Type, Authorization 등
바디 (POST 전용): 전송할 데이터
POST 방식으로 전송할 때는 항상 Body에 데이터를 넣어야 한다. Body에 데이터를 넣는 방식은 여러 가지가 있다. 대표적으로
| Body 형식 | 설명 | 사용 상황 |
|---|---|---|
| x-www-form-urlencoded | key=value 문자 전송 | 기본 폼 전송 |
| form-data | 멀티파트 형식 | 파일 첨부 시 사용 |
| raw (JSON) | JSON 문자열 직접 전송 | REST API 요청 |
데이터를 받는 방식은 어떤 Body 형식으로 보냈느냐에 따라 달라진다.
@PathVariable
URL 경로 자체에 값을 포함해서 보낼 때 사용한다. URL의 {변수명}과 매핑되며, 변수명이 다를 경우 @PathVariable("실제경로명")처럼 명시한다.
@RequestParam
URL 뒤에 ?key=value 형태로 붙는 쿼리 파라미터를 받을 때 사용한다.
@ModelAttribute
x-www-form-urlencoded 또는 form-data로 보낸 경우 사용한다. key=value 형태의 데이터를 DTO 객체에 자동으로 바인딩한다.
@RequestBody
Postman의 raw(JSON)으로 보낸 경우 사용한다. JSON 문자열을 DTO 객체로 자동 변환한다.
@RequestPart
form-data로 파일을 포함한 데이터를 보낼 때 사용한다. 문자 파트와 파일 파트를 각각 따로 받는다. 파일이 클 때는 BufferedReader로 조금씩 읽어서 메모리를 절약한다.
@RequestHeader
HTTP 헤더에 담긴 값을 받을 때 사용한다.
@Slf4j 로그 출력, 클래스 위에 붙이면 로그를 출력할 수 있다.
일단 실습하면서 나온 것만 간단히 정리하겠다.
| 코드 | 의미 |
|---|---|
| 200 | 요청 성공 |
| 201 | 생성 성공 (POST) |
| 400 | 잘못된 요청 (클라이언트 오류) |
| 401 | 인증 필요 |
| 403 | 권한 없음 |
| 404 | 리소스 없음 |
| 500 | 서버 내부 오류 |
공부하면서 생겼던 의문점 등