Controller은 비지니스 로직을 처리하고 데이터를 가공 하는 역할을 하는데,
이때 비지니스 로직을 처리하기위해 controller에서 데이터를 받는 방법
- HttpServletRequest
- @RequestParam
- @RequestBody
- @ModelAtrribute
- @PathVariable
localhost:8082/test?id=test
localhost:8082/test?searchType=all&keyword=er
1. HttpServletRequest.getParameter()
- 클라이언트의 요청정보를 확인하게해주는 HttpServletRequest를 이용하기
@GetMapping("/test");
public void getInfo(HttpServletRequest request){
log.info("get parameter" + request.getParameter("id"));
}
2. @RequestParam
- 파라미터를 1:1로 받기
@GetMapping("/test");
public void getInfo(@RequestParam(value="id", required="false", defaultValue="test123") String id){
log.info("get parameter" + id);
}
required는 파라미터의 필수 여부이다. 디폴트값은 true이다.
- true일 경우에 id라는 파라미터가 들어오지 않으면 error 발생
- false 일 경우에 id라는 파라미터가 들어오지 않아도 error 발생하지 않음
defaultVaule는 해당 파라미터를 받지않았다면 파라미터의 기본값을 설정해줄 수 있다.
- localhost:8082/test 로 파리미터가 오지 않았을 경우 id = test123 이다.
3. @ModelAttribute
- 파라미터를 객체로 받기 ( JavaObject로 매핑 )
import lombok.Data;
@Data
public class Search {
private String searchType;
private String keyword;
}
@GetMapping("/test");
public void getInfo(@ModelAttribute("search") Search search){
log.info("get parameter" + search.getSearchType());
}
@RequestParam과 비슷한 방법이지만, 파라미터를 1:1로 하나씩 받는게 아닌
여러 파라미터들을 받아서 자바의 객체로 매핑(객체로 한번에 바인딩해서 받는다)
때문에 변수들이 Setter함수가 없다면 저장되지않는다.
4. @RequestBody
- 파라미터를 객체로 받기 ( MessageConver를 사용하여 javaObject로 변환 )
@PosMapping("/test");
public void getInfo(@RequestBody Search search){
log.info("get parameter" + search.getKeyword());
}
@ModelAttribute와 마찬가지로 파라미터를 객체로 받는다.
하지만 @ModelAttribute와 다른점은 MessageConverter를 이용해서 자바의 객체로 변환한다는 점이다.
때문에 다음과 같은 특징을 가진다.
1. POST요청과 함께 사용되어야한다.
: MessageConverter는 HTTP 요청의 Body내용을 자바의 객체로 변환시킨다.
GET방식의 메소드는 애초에 Body가 존재하지 않기때문에 에러를 발생시킨다.
2. JSON 데이터받을 때 주로 사용
: JSON이나 XML과 같은 데이터를 MessageConverter를 이용해서 자바의 객체로 변환한다.
3. Setter가 없어도 된다.
: @ModelAttribute는 자바의 객체로 1:1 매핑이기에 Setter가 필수지만 @RequestBody는 MessageConverter를 통한 자바의 객체로 변환이기때문에 Setter가 없어도 괜찮다.
5. @PathVariable
- URL 정의 부분과 메소드 내에 파라미터에 정의하여 사용
- 단, null이나 공백값이 들어가는 파라미터라면 적용하지 말아야한다.
값에 마침표(.)가 있다면 마침표 뒤가 잘려서 나온다.
http://localhost:8082/boardMaster/3
boardMaster/{idx} 의 중괄호에 있는 idx와 @PathVariable 의 변수명이 동일 해야함.
{idx} , @PathVariable int idx
변수명을 다르게 사용하고 싶다면 다음과 같이 명시를 해줘야한다
@PosMapping("/test/{id}");
public void getInfo(@PathVariable("id") String userId){
log.info("get parameter" + userId);
}
어노테이션 생략시?
어노테이션을 생략하고 간단하게 받을 수도 있다.
대신 이경우에는 변수명과 동일한 파라미터값만 받을 수 있다.
또 String, Long타입은 @RequestParam으로 취급하지만 이외에는 @ModelAttribute로 취급한다.
@PostMapping("/test");
public void getInfo(String id, Search search){
log.info("get parameter" + id);
log.info("get parameter" + search.getSearchType());
log.info("get parameter" + search.getKeyword());
}
'Java > Spring' 카테고리의 다른 글
[ERROR] javax.servlet.ServletRequest.getRemoteAddr() is not supported (0) | 2023.06.28 |
---|---|
@Transactional 적용 안된 현상 정리 (0) | 2022.04.09 |
ERROR - java.lang.OutOfMemoryError: Java heap space (0) | 2021.09.16 |
ERROR - Parameter index out of range ... (0) | 2021.07.07 |
ERROR - Ambiguous mapping found. Cannot map ~~ (0) | 2021.07.05 |