Spring은 전달받은 파라미터를 매핑하는 여러가지 방법을 제공합니다.

1. @PathVariable

파라미터를 URL에 포함시켜 전달하는 방법입니다.

http://localhost/api/PathVariable/member/1
    @GetMapping("/PathVariable/{type}/{id}")
    @ResponseBody
    public String pathVariableTest(
            @PathVariable Integer id,
            @PathVariable String type
    ) {
        //type : member, id : 1
        return "success";
    }

추출할 url depth에 중괄호({})를 감싸서 매핑할 수 있습니다.
중괄호 안에 들어간 name과 @PathVariable을 선언한 변수명이 같아야합니다.
다르게 하고 싶다면 아래와 같이 작성해야합니다.

    @GetMapping("/PathVariable/{type}/{id}")
    @ResponseBody
    public String pathVariableTest(
            @PathVariable("id") Integer typeId,
            @PathVariable String type
    ) {
        //type : member, typeId : 1
        return "success";
    }

 

2. @RequestParam

key=value 형식으로 전달된 파라미터를 매핑하는 어노테이션입니다.
파라미터 전달 시 content-type은 application/x-www-form-urlencoded; charset=UTF-8;으로 해주어야합니다. 
Get 방식으로 전달 할 경우 url 맨 뒤에 ?key=value 형식으로 전달되고, Post 방식일 경우 Body를 통해 전달됩니다.

1) jquery ajax

//Jquery ajax
   $.ajax({
        url: "/api/RequestParam",
        type: "GET",
        data: {
            id: 1,
            name: "kim",
            description: "member",
            address: "seoul",
            active: true
        },
        contentType: "application/x-www-form-urlencoded; charset=UTF-8;"
    });

2) Test Controller

    @GetMapping("/RequestParam")
    @ResponseBody
    public String requestParam(
            @RequestParam(required = false, value = "id") Integer memberId,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String description,
            @RequestParam(required = false) String address,
            @RequestParam(required = false) boolean active
    ) {
        //처리..
        return "success";
    }
http://localhost:8080/api/RequestParam?id=1&name=kim&description=member&address=seoul&active=true

3) 모든 파라미터 한번에 받기

모든 파라미터를 한번에 받으려면 Map을 이용하면 됩니다.

    @GetMapping("/RequestParam")
    @ResponseBody
    public String requestParam(
            @RequestParam Map<String, Object> allParameters
    ) {
        //처리..
        return "success";
    }

 Map을 통해서 파라미터를 전달받으면 편하지만, 명확하게 어떤 파라미터를 전달받는지 모른다는 단점이 있습니다.

4) 배열 객체 넘기기

    $.ajax({
        url: "/api/RequestParam",
        type: "POST",
        data: {
            arr: [1, 2, 3]
        },
        contentType: "application/x-www-form-urlencoded; charset=UTF-8;"
    });
    @PostMapping("/RequestParam")
    @ResponseBody
    public String requestParam(
            @RequestParam(required = false, value = "arr[]") List<Integer> arr
    ) {
        return "success";
    }

5) 배열 String 넘기기

    $.ajax({
        url: "/api/RequestParam",
        type: "POST",
        data: {
            arr: "1,2,3"
        },
        contentType: "application/x-www-form-urlencoded; charset=UTF-8;"
    });
    @PostMapping("/RequestParam")
    @ResponseBody
    public String requestParam(
            // form의 input 배열을 받을 때도 아래와 같이 사용한다. ex) checkbox, multiselectbox
            @RequestParam(required = false, value = "arr") List<Integer> arr
    ) {
        return "success";
    }

3. @ModelAttribute

key=value 형식으로 전달된 파라미터를 매핑하는 어노테이션입니다.
파라미터 전달 시 content-type은 application/x-www-form-urlencoded; charset=UTF-8;으로 해주어야합니다. 
@RequestParam은 변수 한개씩 매핑하는 반면에 @ModelAttribute는 Object를 통해 한번에 받을 수 있습니다.
Object의 setter와 getter를 필수로 만들어주어야 합니다.

public class Member {

    private Integer id;
    private String name;
    private String description;
    private String address;
    private boolean active;
    private List<Integer> arr;
    
    //setter,getter 생략
    
}
    $.ajax({
        url: "/api/ModelAttribute",
        type: "GET",
        data: {
            id: 1,
            name: "kim",
            description: "super member",
            address: "seoul",
            active: true,
            arr: "1,2,3"
        ),
        contentType: "application/x-www-form-urlencoded; charset=UTF-8;"
    });
    @GetMapping("/ModelAttribute")
    @ResponseBody
    public Member ModelAtrribute(
            @ModelAttribute Member member
    ) {
        return member;
    }
localhost:8080/api/ModelAttribute?id=1&name=kim&description=member&address=seoul&active=true&arr=1%2C2%2C3

Member Object 여러개 전송하기

public class MemberArray {
    private List<Member> members;
    //getter,setter 생략
}
function modelAttribute() {
    var param = {};

    for (var index = 0; index < 5; index++) {
        param[`members[${index}].id`] = index;
        param[`members[${index}].name`] = "kim";
        param[`members[${index}].description`] = "description !";
        param[`members[${index}].address`] = "seoul";
        param[`members[${index}].active`] = true;
        param[`members[${index}].arr`] = "1,2,3,4";
    }

    $.ajax({
        url: "/api/ModelAttribute",
        type: "POST",
        data: param,
        dataType: 'json',
        contentType: "application/x-www-form-urlencoded; charset=UTF-8;"
    });
}
    @PostMapping("/ModelAttribute")
    @ResponseBody
    public Object ModelAtrributePost(
            @ModelAttribute MemberArray memberArray
    ) {
        return member;
    }

4. @RequestBody

Json이나 Xml로 전송된 파라미터를 매핑할 때 사용하는 어노테이션입니다.
content-type은 application/json; UTF-8;로 해주어야합니다.

    var json = {
        id: 1,
        name: "kim",
        description: "super member",
        address: "seoul",
        active: true,
        arr: [1, 2, 3]
    };

    $.ajax({
        url: "/api/RequestBody",
        type: "POST",
        data: JSON.stringify(json),
        dataType: 'json',
        contentType: "application/json; UTF-8;"
    });

JSON.stringify() 를 이용해 객체를 JsonString으로 변환합니다.

    @PostMapping("/RequestBody")
    @ResponseBody
    public Member RequestBody(
            @RequestBody Member member
    ) {
        return member;
    }
{"id":1,"name":"kim","description":"super member","address":"seoul","active":true,"arr":[1,2,3]}

Member Json Object 여러개 전송하기

    var json = {
        id: 1,
        name: "kim",
        description: "super member",
        address: "seoul",
        active: true,
        arr: [1, 2, 3]
    };
    
    var jsons = [json, json, json];

    $.ajax({
        url: "/api/RequestBodyList",
        type: "POST",
        data: JSON.stringify(jsons),
        dataType: 'json',
        contentType: "application/json; UTF-8;"
    });
    @PostMapping("/RequestBodyList")
    @ResponseBody
    public Object RequestBodyListPost(
            @RequestBody List<Member> members
    ) {
        return members;
    }
[{"id":1,"name":"kim","description":"super member","address":"seoul","active":true,"arr":[1,2,3]},{"id":1,"name":"kim","description":"super member","address":"seoul","active":true,"arr":[1,2,3]},
{"id":1,"name":"kim","description":"super member","address":"seoul","active":true,"arr":[1,2,3]}]

+ Recent posts