@Slf4j
@Controller
public class RequestParamController {
@GetMapping("/request-params")
public void params(
HttpServletRequest request,
HttpServletResponse response
) throws IOException {
String key1Value = request.getParameter("key1");
String key2Value = request.getParameter("key2");
log.info("key1Value={}, key2Value={}", key1Value, key2Value);
response.getWriter().write("success");
}
}
response.getWriter().write()@Slf4j
@Controller
public class RequestBodyController {
@PostMapping("/form-data")
public void requestBody(
HttpServletRequest request,
HttpServletResponse response
) throws IOException {
String key1Value = request.getParameter("key1");
String key2Value = request.getParameter("key2");
log.info("key1Value={}, key2Value={}", key1Value, key2Value);
response.getWriter().write("success");
}
}
HttpServletRequest.getParameter("key")를 사용하면 두 경우 모두 데이터 형식(key=value)이 같기 때문에 해당 값에 접근이 가능@RequestParam
@Slf4j
@Controller
public class RequestParamControllerV2 {
@ResponseBody
@GetMapping("/v1/request-param")
public String requestParamV1 (
@RequestParam("name") String userName,
@RequestParam("age") int userAge
) {
// logic
log.info("name={}", userName);
log.info("age={}", userAge);
return "success";
}
}
@Controller + @ResponseBody = @RestController@RequestParam@RequestParam("속성값")@ResponseBody
@GetMapping("/v4/request-param")
public String requestParam (
@RequestParam(required = true) String name, // 필수
@RequestParam(required = false) int age // 필수가 아님
) {
// logic
log.info("name={}", name);
log.info("age={}", age);
return "success";
}
ex) http://localhost:8080/request-param?name=@ModelAttribute
@RequestParam의 과정을 자동화한다.@ResponseBody
@PostMapping("/v2/tutor")
public String modelAttributeV2(@ModelAttribute Tutor tutor) {
String name = tutor.getName();
int age = tutor.getAge();
return "tutor name = " + name + " age = " + age;
}
여기서 Tutor 클래스에는 Getter와 Setter가 있어야 설정이 된다.
그 때 파라미터 이름과 필드 이름이 반드시 같아야된다.
HTTP Message Body에 직접적으로 Data를 전달하는 경우이다.
REST API에서 주로 사용하는 방법
POST, PUT, PATCH에서 주로 사용하는 방법이다. (Create, Update)
JSON, XML, TEXT 등을 데이터 형식으로 사용한다.
위의 어노테이션인 @RequestParam과 @ModelAttribute는 GET + Query Parameter과 POST + HTML Form Data의 데이터를 바인딩 하는 방법
HTTP Request, Response 예시

TEXT
HTTP Entity를 사용하면 HTTP Message Converter가 사용된다.@PostMapping("/v3/request-body-text")
public HttpEntity<String> requestBodyTextV3(HttpEntity<String> httpEntity) {
// HttpMessageConverter가 동작해서 아래 코드가 동작하게됨
String body = httpEntity.getBody();
// 매개변수 = Body Message
return new HttpEntity<>("response = " + body);
}
Object Mapper
- Java 객체를 JSON 형태로 변환하거나, JSON을 Java 객체로 변환시키는 Jackson 라이브러리 클래스
- 생성비용이 비싸기 때문에 bean/static으로 사용하는 것이 좋다.
@RequestBody
@RequestBody를 사용하면 객체를 매핑할 수 있다.HttpEntity<>이나@RequestBody를 사용하면 HTTP Message Converter가 Request Body의 데이터를 개발자가 원하는 String이나 Object로 변환- 쉽게 설명하면 HTTP Message Converter가 Object Mapper를 대신함
@RequestBody를 생략하면@ModelAttribute가 된다.
- 요청 파라미터를 처리하도록 된다는 것
- Request Header의 Content-Type은 꼭 application/json 이여야 한다.
- 위 설정 정보를 기반으로 Message Converter가 실행된다.
- 클라이언트로부터 JSON 데이터를 요청 받았을 때 파라미터로 바로 바인딩 해준다.
Layered Architecture
- 애플리케이션을 세 가지 주요 계층으로 나누어 구조화 하는 방법
- 각 계층간 역할 분담이 이루어져 코드의 재사용성, 유지 보수성, 확장성을 높임
- Layered Architecture 구조
- Presentation Layer
- 사용자의 요청을 받고 응답하는 역할을 수행한다.
- 화면을 응답하거나 데이터를 응답하는 API를 정의한다.
- Business Layer (Service Layer)
- 비즈니스 로직을 수행한다.
- 요청을 해석해 Repository Layer에 전달한다.
- 일반적으로 하나의 비즈니스 로직은 하나의 트랜잭션으로 동작한다.
- Data Access Layer (Repository Layer)
- DB와 연동되어 실제 데이터들을 관리한다.
- 용어 설명
- DTO (Data Transfer Object)
- 계층간 데이터 전달을 위해 사용되는 객체
- Model
- Entity
- JPA와 관련이 있으며, JPA에서는 Entity라는 형태로 데이터를 반환한다.
- DAO (Data Access Object)
- Layered Architecture 적용
- Controller
- 클라이언트의 요청을 받는 역할을 수행한다.
- 요청에 대한 처리를 Service Layer에 전달한다.
- Service에서 처리 완료된 결과를 클라이언트에 응답한다.
- 사용하는 Annotation :
@Controller,@RestController
- Service
- 사용자의 요청 사항을 처리한다.
- DB와 상호작용이 필요한 경우 Repository Layer에게 요청한다.
- 사용하는 Annotation :
@Service
- Repository
- DB와 상호작용을 수행한다.
- Connection 연결, 해제
- CRUD 작업 처리
- 사용하는 Annotation :
@Repository
- DTO
- 계층간 데이터 전달을 위해 사용된다.
- 요청 데이터를 처리하는 객체를 일반적으로
RequestDto로 명명- 응답 데이터를 처리하는 객체를 일반적으로
ResponseDto로 명명