본문 바로가기
Spring

[스프링 MVC] 모델에 공통 데이터 자동으로 넣기 - @ModelAttribute

by jeonghaemin 2021. 7. 12.
728x90

메서드에 붙은 @ModelAttribute

여러 컨트롤러에서 같은 데이터를 모델에 공통적으로 넣을 때 데이터를 반환하는 메서드를 만들고, @ModelAttribute 애노테이션을 해당 메서드에 사용하여 코드 중복을 제거할 수 있습니다.

예를 들어 다음과 같은 컨트롤러 클래스가 있다고 하겠습니다.

@Controller
public class HelloController {

    @GetMapping("/hello1")
    public String hello1(Model model) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");

        model.addAttribute("list", list);

        return "hello1";
    }

    @GetMapping("/hello2")
    public String hello2(Model model) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");

        model.addAttribute("list", list);

        return "hello2";
    }

    @GetMapping("/hello1")
    public String hello3(Model model) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");

        model.addAttribute("list", list);

        return "hello3";
    }
}

hello1, hello2, hello3 메서드를 보면 셋다 같은 원소를 가진 리스트를 모델에 담고 있는 것을 볼 수 있습니다.

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");

model.addAttribute("list", list);

이 경우 리스트를 반환하는 메서드를 만들고 해당 메서드에 @ModelAttribute 애노테이션을 사용하여 리스트를 만들고 모델에 전달하는 코드 중복을 제거할 수 있습니다.

@Controller
public class HelloController {

    //옵션으로 전달된 문자열이 model에 담을때 사용할 키 값이 된다.
    @ModelAttribute("list")
    public List<String> list() {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");

        return list;
    }

    @GetMapping("/hello1")
    public String hello1(Model model) {
        return "hello1";
    }

    @GetMapping("/hello2")
    public String hello2(Model model) {
        return "hello2";
    }

    @GetMapping("/hello1")
    public String hello3(Model model) {
        return "hello3";
    }
}

hello1, hello2, hello3 요청이 어디로 들어오든 간에 자동으로 list()의 반환 값이@ModelAttribute의 value(name) 속성 값을 키로 하여 model에 담기게 됩니다.

참고

김영한님의 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

댓글