Spring

Spring Controller 다양한 파라메터 사용 방법

구티맨 2021. 10. 5. 10:40

목차

    1. GET 요청

    1.1 단일, 복수 파라메터

    @GetMapping(path = "/search")
    public ResponseEntity<?> search(@RequestParam(name = "q") String queryText,
                                    @RequestParam(required = false) String mode){
            return ResponseEntity.ok( searchService.search(queryText, mode) );
    }

    GET /search?q="home"&mode="quick" 와 같이 값을 받는 컨트롤러 입니다.

    @RequestParam을 선언을 하면, 해당 변수로 쿼리 파라메터로 값이 넘어오게 됩니다.

    name = "q" 으로 쿼리 파라메터의 이름을 지정하거나 required = false 로 optional한 파라메터를 정의 할 수 있습니다.

     

    1.2 List 파라메터

    @GetMapping(path = "/member")
    public ResponseEntity<?> register(@RequestParam List<String> values){
        return ResponseEntity.ok(memberService(values));
    }

    GET /member?values=1,2,3 와 같이 리스트로 값을 받는 컨트롤러 입니다.

     

    @Getter
    @Setter
    public class Info{
        ArrayList<String> name;
        ArrayList<String> phone;
    }
    
    @GetMapping(path = "/member")
    public ResponseEntity<?> register(Info info){
        return ResponseEntity.ok(memberService(info));
    }

    GET  /member?name[0]=yoon&name[1]=min &phone[0]=0101234&phone[1]=0109876 와 같이 리스트로 값을 받는 컨트롤러 입니다.

    info 객체의 name에는 yoon, min 값이 그리고 phone에는 0101234, 0109876 값이 들어갑니다.

     

    @Getter
    @Setter
    public class Info{
        ArrayList<Order> order;
    }
    
    @Getter
    @Setter
    public class Order{
        String id;
        String type;
    }

    Info 클래스가 위와 같다면, /member/emp?order[0].id=1&order[0].type=direct&order[1].id=2&order[1].type=indirect 와 같이 리스트로 값을 받는 컨트롤러가 됩니다.

     

     

    2. POST 요청

    2.1 Request Body 파라메터

    @Getter
    @Setter
    public class Member{
        private String name;
        private Strign email;
        private Address addr;
        private List<Integer> etc;
    }
    
    @Getter
    @Setter
    public class Address{
        private String city;
        private String zip;
    }
    
    @PostMapping(path = "/register")
    public ResponseEntity<?> register(@RequestBody Member member){
        return ResponseEntity.ok(registerService.register(member));
    }

    register 메소드에 @PostMapping으로 POST 요청에 대한 path를 정의해주고,

    HTTP body를 받을 파라메터에 @RequestBody를 선언해 줍니다.

     

    {
        "name": "Charlie",
        "email": "chansub.shin@sk.com",
        "etc": [
            1,
            2,
            3
        ],
        "addr": {
            "city": "seoul",
            "zip": "123"
        }
    }

     

    /register URI로 위의 JSON 요청을 HTTP POST로 호출을 하면 register 메소드의 Member 변수에  JSON 데이터 값이 바인딩이 되어 호출 됩니다.

     

    2.2 List Body 파라메터

    컨트롤러 메소드에 List형 파라메터를 사용할 수는 없고, List형 파라메터를 가지고 있는 객체를 파라메터로 사용하여 List형 Body값을 받을 수 있습니다.

    결국 2.1에 Member의 etc 변수처럼 선언하여 리시트형 파라메터를 받을 수 있습니다.

     

     

    3. Path variable( GET, POST 모두 사용 가능 )

    @GetMapping(path = "/member/{type}")
    public ResponseEntity<?> analysis(@PathVariable String type, @RequestParam String name){
    	switch(type){
            case "emp":
                result = memberService(type, name);
                break;
        }
        return ResponseEntity.ok(result);
    }

     

    @PathVariable을 선언하면 {type}에 들어오는 값이 type 변수에 할당이 됩니다.

    GET /member/emp?name=yoon 과 같이 호출을 하면, type에 emp 그리고 name에 yoon 값이 할당 됩니다.