// request handler 가 뷰 컴포넌트(jsp)에 전달하는 값 중에서
// 세션에 보관할 값의 이름을 지정하면
// 프론트 컨트롤러는 그 값을 HttpSession 객체에도 보관해 둔다.
// 또한 @ModelAttribute에서 지정한 이름의 값을 세션에서 꺼낼 때도 사용한다.
// 즉 @SessionAttributes 에 이름을 지정해 두지 않으면
// 세션에 해당 값이 들어 있어도
// @ModelAttribute가 붙은 아규먼트에 값을 넣어주지 않는다.
@SessionAttributes({"name2","age2"})
// @SessionAttributes에 등록되지 않은 이름의 값은 세션에 보관되지 않는다.
model.addAttribute("tel2", "1111-2222");
// @ModelAttribute 에 지정된 이름이 @SessionAttributes에 있는 경우
// => 세션에 해당 값이 있으면 아규먼트에 넣어 준다.
// => 세션에 해당 값이 없으면 예외가 발생한다.
@ModelAttribute("name2") String name2,
@ModelAttribute("age2") String age2,
// @ModelAttribute 에 지정된 이름이 @SessionAttributes에 없는 경우
// => 요청 파라미터에 tel2 값이 있다면 그 값을 넣어준다.
// => 요청 파라미터에 값이 없으면 아규먼트에 빈 문자열을 넣어 준다.
// => @SessionAttributes에 등록한 이름이 아니기 때문에 세션에서 값을 꺼내지 않는다.
@ModelAttribute("tel2") String tel2) {
//@ModelAttribute
// 1. @SeesionAttribute에 지정된 이름인 경우
// 1) @Http객체에 지정된 이름이 없다면, HttpSession 객체에서 꺼내 넘긴다.
// 없다면 예외가 발생 !
// 2. SessionAttribute에 지정된 이름이 없을 경우
// 1) 없으면 요청 파라미터에서 값을 꺼내 넘긴다.
// 2) 그래도 없으면, 빈 문자열을 넘긴다.
# GPT 추가 설명
`@ModelAttribute` 어노테이션은 Spring MVC 컨트롤러 메서드의 매개변수를 초기화하기 위한 어노테이션으로, 세션(attribute)이나 요청 파라미터(parameter)에서 값을 가져와서 매개변수에 할당할 때 사용됩니다. 주어진 코드 주석에서는 `@ModelAttribute` 어노테이션을 사용할 때의 동작을 설명하고 있으며, 그 동작은 다음과 같습니다:
1. **세션 속성과의 관련:**
- `@SessionAttributes`에 지정된 이름과 일치하는 경우: `@ModelAttribute` 어노테이션에 지정된 이름이 `@SessionAttributes`에 포함되어 있으면, Spring은 먼저 현재 페이지 컨트롤러의 `HttpSession` 객체에서 해당 이름으로 속성(attribute)을 찾습니다. 이것이 없으면 예외가 발생합니다.
2. **세션 속성이 없을 경우의 동작:**
- `@SessionAttributes`에 지정된 이름이 없을 경우: 만약 `@ModelAttribute` 어노테이션에 지정된 이름이 `@SessionAttributes`에 없다면, Spring은 요청 파라미터(request parameters)에서 해당 이름의 값을 찾아서 매개변수에 할당합니다.
- 만약 요청 파라미터에서도 해당 이름의 값이 없다면, `@ModelAttribute` 어노테이션에 지정된 매개변수 타입에 따라 기본값이 할당됩니다. 예를 들어, `String` 매개변수인 경우 빈 문자열(`""`)이 할당됩니다.
따라서 `@ModelAttribute` 어노테이션을 사용하면 세션 및 요청 파라미터에서 값을 가져와서 컨트롤러 메서드에 매개변수로 전달할 수 있으며, 위의 동작 설명대로 동작합니다. 이것은 Spring MVC에서 웹 애플리케이션의 데이터를 매우 편리하게 다루는 데 도움을 줍니다.