Framework & Library/Spring Boot

Spring Boot - @PathVariable & @RequestParam & @ModelAttribute

임빈영 2023. 2. 6. 13:27

@PathVariable & @RequestParm & @ModelAttribute

@PathVariable

 

http://localhost:8080/api/member/17

http://localhost:8080/api/member/25

 

REST API에서 위와 같이 URI에 변수가 들어가는 것을 본 적 있을 것이다. 위 URI에서 밑줄 친 부분이 @PathVariable 애너테이션으로 처리해 줄 수 있는 부분이다.

이처럼, URI에 파라미터를 포함시킨 요청을 @PathVariable 애너테이션을 사용하여 처리할 수 있다.

 

@RestController
public class MemberController {
    
    @GetMapping("/member/{id}/{name}")
    public String findMember(
        @PathVariable String id,
        @PathVariable String name
    ) {
        return "Member ID : " + id + ", Member Name : " + name;
    }
}

위 예제와 같이, 요청 URI의 파라미터에 해당하는 부분을 { } 안에 넣어 서버에 전달할 수 있다. 컨트롤러 메서드에서는 @PathVariable 애너테이션을 활용해 URI 중 어떤 파라미터를 가져올지 지정이 가능하다. 이때 { } 안에 들어간 파라미터명과 @PathVariable 변수명이 같아야 한다.

 

@RestController
public class MemberController {
    
    @GetMapping("/member/{id}/{name}")
    public String findMember(
        @PathVariable("id") String memberId,
        @PathVariable("name") String memberName
    ) {
        return "Member ID : " + memberId + ", Member Name : " + memberName;
    }
}

URI의 파라미터명과 @PathVariable 변수명을 다르게 하고 싶다면, 위와 같이 @PathVariable 애너테이션 안에 실제 파라미터명을 지정해 주면 된다.

 

@RequestParam

 

http:/localhost:8080/api/member?name=kim&age=25&address=seoul

 

@RequestParam 애너테이션은 key=value 형식으로 전달된 파라미터를 매핑하는 애너테이션이다. GET 방식으로 전달할 경우 URI 뒤에 ?key=value 형식으로 전달되고, POST 방식의 경우 Body를 통해 전달된다.

 

@RestController
public class MemberController {
    
    @GetMapping("/member")
    public String findMember(
        @RequestParam(required = false) String name,
        @RequestParam(required = false) Integer age,
        @RequestParam(required = false) String address
    ) {
        return "Member Name : " + name + ", Member Age : " + age + ", Member Address" + address;
    }
}

위 예제와 같이, URI의 key=value 형식이 @RequestParam 애너테이션으로 선언된 변수에 전달된다.

 

@ModelAttribute

@ModelAttribute 애너테이션은 key=value 형식으로 전달된 파라미터를 매핑하는 애너테이션이다. @RequestParam 애너테이션은 변수를 한 개씩 매핑하는 반면, @ModelAttribute 애너테이션은 사용자가 정의한 객체를 통해 한번에 받을 수 있다는 장점이 있다.

 

@Getter
@Setter
public class Member {
    private String name;
    
    private Integer age;
    
    private String address;
}

매핑받을 객체를 작성할 때는 setter() 메서드와 getter 메서드를 필수로 만들어주어야 한다.

 

@RestController
public class MemberController {
    
    @GetMapping("/member")
    public String findMember(
        @ModelAttribute Member member
    ) {
        return member;
    }
}

위 예제와 같이 @ModelAttribute 애너테이션을 사용하면, 사용자가 정의한 클래스를 통해 한 번에 파라미터를 전달받을 수 있다. 또한, @ModelAttribute 애너테이션을 생략해도 동일하게 동작하는 것을 확인할 수 있다.

 

728x90