쌓고 쌓다

컨트롤러 모든 메서드 Model에 값 넣기 - @ModelAttribute 본문

프로그래밍/spring

컨트롤러 모든 메서드 Model에 값 넣기 - @ModelAttribute

승민아 2023. 8. 20. 16:25

필요성

먼저 코드를 보자.

@Controller
@RequestMapping("/form/items")
@RequiredArgsConstructor
@Slf4j
public class FormItemController {

    private final ItemRepository itemRepository;

    @GetMapping
    public String items(Model model) {
    
        Map<String, String> regions = new LinkedHashMap<>();
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU", "제주");
        model.addAttribute("regions", regions);
        
        return "form/items";
    }

    @GetMapping("/{itemId}")
    public String item(@PathVariable long itemId, Model model) {
    
        Map<String, String> regions = new LinkedHashMap<>(); // HashMap은 순서가 보장안되나 LinkedHashMap은 보장됨
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU", "제주");
        model.addAttribute("regions", regions);
        
        return "form/item";
    }

}

컨트롤러의 메서드에서 공통적으로 Model에 필요한 값을 모두 따로따로 넣어주고 있다.

 

어떤 컨트롤러에서 공통적으로 Model에 담는 값이 있다면

@ModelAttribute를 메서드에 사용하여 해당 컨트롤러의 모든 메서드에 Model.addAttribute를 적용할 수 있다.

 

적용

@Controller
@RequestMapping("/form/items")
@RequiredArgsConstructor
@Slf4j
public class FormItemController {

    //일반적인 @ModelAttribute 기능이 아니다. 이 컨트롤러의 모든 곳에 자동으로 model.addAttribute("regions",...) 추가해줌.
    @ModelAttribute("regions")
    public Map<String, String> regions() {
        Map<String, String> regions = new LinkedHashMap<>(); // HashMap은 순서가 보장안되나 LinkedHashMap은 보장됨
        regions.put("SEOUL", "서울");
        regions.put("BUSAN", "부산");
        regions.put("JEJU", "제주");
        return regions;
    }

    @GetMapping
    public String items(Model model) {
        //model.addAttribute("regions", regions);를 작성하지 않아도 model에서 꺼내 쓸 수 있다.
    }

    @GetMapping("/{itemId}")
    public String item(@PathVariable long itemId, Model model) {
        //model.addAttribute("regions", regions);
    }
}
Comments