스프링에서는 컨트롤러 마다 중복된 데이터를 model에 담는 상황을 효율적으로 처리하기 위하여 다음과 같은 기능을 지원한다.
예로 두개의 컨트롤러에서 중복된 데이터를 model에 담는다고 가정해보자.
public class controller {
@GetMapping("/add")
public String add(Model model) {
Map<String, String> regions = new LinkedHashMap<>();
regions.put("SEOUL", "서울");
regions.put("BUSAN", "부산");
regions.put("JEJU", "제주");
model.addAttribute("regions", regions);
return "add";
}
@GetMapping("/results")
public String results(Model model) {
Map<String, String> regions = new LinkedHashMap<>();
regions.put("SEOUL", "서울");
regions.put("BUSAN", "부산");
regions.put("JEJU", "제주");
model.addAttribute("regions", regions);
return "results";
}
}
위 코드는 SEOUL, BUSAN, JEJU를 Key로 가지는 Map regions을 model에 담아서 반환한다. add와 results 모두 중복된 코드를 가지고 있다. 물론, 해당 부분만 Method로 뽑아내서 사용해도 무방하지만 Spring에서는 특별한 ModelAttribute
기능을 지원한다.
public class controller {
@ModelAttribute("regions")
public Map<String, String> regions() {
Map<String, String> regions = new LinkedHashMap<>();
regions.put("SEOUL", "서울");
regions.put("BUSAN", "부산");
regions.put("JEJU", "제주");
return regions;
}
}
@ModelAttribute
애노테이션을 이용하여 다음과 같이 Method를 만든다면 controller를 호출하는 모든 요청에 return 데이터 regions
이 model
에 담기게 된다.