Java/Spring

Controller parameter 받는 방법

코딩공부 2022. 4. 9. 18:35

Controller은 비지니스 로직을 처리하고 데이터를 가공 하는 역할을 하는데,

이때 비지니스 로직을 처리하기위해 controller에서 데이터를 받는 방법

 

  1. HttpServletRequest
  2. @RequestParam
  3. @RequestBody
  4. @ModelAtrribute
  5. @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());
}