SPRING/Spring MVC

[SpringMVC] HTTP 요청 파라미터 - @ModelAttribute

IT록흐 2023. 8. 11. 22:39
반응형

 

 

[SpringMVC] HTTP 요청 파라미터 - @RequestParam

[SpringMVC] 요청(Request)의 종류 ( GET, POST, JSON ) [SpringMVC] 웹서비스에서 Request(요청)가 처리되는 원리 ( + Servlet ) JAVA Runtime Enviroment(JRE)는 하나의 프로세스, 다수의 스레드 환경이다. JVM은 하나의 프로

lordofkangs.tistory.com

 

 

지난 포스팅에서 GET, POST 같은 방식으로 요청이 들어오는 경우, @RequestParam 어노테이션으로 요청 데이터를 가져오는 과정을 다루어 보았다. 

 

 

 

Handler, 즉 Controller는 Request 객체에 직접 의존하지 않고 HandlerAdapter에게 파라미터로 필요한 데이터를 명시하는 방법을 사용한다. 이로써 Controller는 오로지 비즈니스 로직에 필요한 데이터만 전달받을 수 있게 된다. 여기서 필요한 데이터를 구체적으로 명시하기 위해 어노테이션을 사용하는데, 대표적으로 @RequestParam과 @ModelAttribute가 있다. 

 

@RequestParam은 String, int, Integer 같은 단순한 타입의 데이터를 가져올 때 사용한다. @ModelAttribute는 조금더 복잡한 이유로 사용된다. 

 

Controller

@RequestMapping("/request-attribute")
public String modelAttributeV0(@RequestParam String username,@RequestParam int age){

    HelloData helloData = new HelloData(); // 객체 생성
    helloData.setUsername(username); 
    helloData.setAge(age);

    // [ 비즈니스 로직... ]

    return "OK";
}

 

보통 Request에서 데이터를 가져오면, 비즈니스 로직에 들어가기 전에 데이터를 토대로 객체를 생성한다. Spring WEB은 이 과정을 자동화하는 어노테이션을 제공하는데, 그것이 @ModelAttribute이다. Request의 데이터를 토대로 객체를 생성하여 파라미터로 전달하는 것이다. 

 

Controller

@RequestMapping("/request-attribute")
public String modelAttributeV1(@ModelAttribute  HelloData helloData){ 

    //[ 비즈니스 로직 ]

    return "OK";
}

 

@ModelAttribute로 표시된 파라미터를 보면 HelloData를 확인할 수 있다. HelloData의 필드는 Request의 데이터와 일치하는 이름으로 되어 있다. 

 

HelloData

@Data
public class HelloData {
    private String username;
    private int age;
}

 

HelloData 객체가 자동으로 생성될 때 Setter 함수로 데이터를 주입받는다. 그러므로 @ModelAttribute의 파라미터로 사용되는 객체는 반드시 setter 함수가 있어야 한다. @Data는 getter와 setter를 만들어주는 어노테이션이다. 

 

Controller

@RequestMapping("/request-attribute")
public String modelAttributeV1(HelloData helloData){ 

    //[ 비즈니스 로직 ]

    return "OK";
}

 

@ModelAttribute가 생략된 형태도 가능하다. String,int, Integer가 아니라 특정 객체를 매개변수로 한다면 @ModelAttribute가 생략되어도 @ModelAttribute로 선언된 것으로 디폴트로 인식하고 요청 데이터를 주입하여 객체를 생성하고 파라미터로 넘긴다. 

 

정리하면, GET, POST 같은 방식으로 들어온 데이터를 특정한 객체로 받고 싶다면 매개변수를 특정 객체로 지정하고 @ModelAttribute로 표시를 남겨야 한다. 이때 특정한 객체는 반드시 Setter 함수가 있어야 한다. 그리고 @ModelAttribute는 생략 가능하다. 

 

 

 


 

 

참고자료

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

반응형