본문 바로가기
Spring 프레임워크/이론

@ModelAttribute("이름") 어노테이션

by Hwanii_ 2023. 8. 7.
728x90

그외의 어노테이션 정리 참고 :
 
https://hwanii96.tistory.com/309

 

스프링 컨테이너 어노테이션 메모

1. com.spring.biz 하위 폴더에, 모든 자료형을 (클래스 파일) 대상으로 객체화를 해주게 하는 코드 이다. 위와 같이 applicationContext.xml 기능 설정 파일 내부에, 코드를 작성 하고, 자바에서 @ (어노테이

hwanii96.tistory.com

 
1.
@ModelAttribute("이름") 어노테이션은 View 에서 사용할 데이터를
세팅하기위한 목적으로 활용 되는 어노테이션 이다.
 
@ModelAttribute("이름") 어노테이션을 사용함으로써,
View 에서 "이름" 으로 된 데이터를 사용 할 수 있게 된다.
 
만약에 @ModelAttribute("이름")이 어노테이션을 사용 하지 않았더라면 ?
해당 메서드를 수행하고,
View에게 데이터를 넘겨 주게 하기 위해서,
 

 
위와 같이 코드를 작성 해야 할듯 하다.
그러니까, 한 메서드 내부에 모든 코드를 몰아 넣고, 보내줄 데이터를 model 을 주체로 해서
addAttribute() 를 하는 모습인데,
이렇게 되면 틀린 코드는 아니지만,
.do 요청 들어올때마다
HashMap을 객체화 하기 때문에
싱글톤 패턴이 깨지고,
가독성 측면에서도 불리 한듯 싶다..
 
2.
@ModelAttribute("이름") 어노테이션은 다음과 같은 특징을 가진다.
 
@Controller 어노테이션이 명시 되어 있는 XxxController.java 파트 내부에서,
@ModelAttribute("이름") 어노테이션을 메서드 레벨에서  사용 하면,
@RequestMapping() 어노테이션 보다 먼저 수행 된다.
 
그래서, @ModelAttribute("이름") 어노테이션은 Xxx.Controller.java 파일 내부에,
아래와 같이, 상단에 작성 한다.

 

(메서드 레벨에서 사용하는 상황이 아니라면, 먼저 수행 되는 개념은 아닌듯 하다) 

(실행 순서는 상황에 따라 달라지는듯 하다)
 
++
23.08.08 추가 하기.
 
사용자가 최초로 main.do 요청을 하면,
@RequestMapping이 사용자의 요청을 매핑 하고,
그때 딱 한번만 @ModelAttribute("searchMap") 를 한다.
즉, 최초 한번만 searchMap 이라는 파라미터명으로 객체화 하기 때문에,
싱글톤 패턴 개념이라고 볼 수 있다.
 

 
3.
 

 
위의 코드는 다음과 같다.
 
@ModelAttribute("searchMap") 이라는 파라미터명으로,
View 에게 HashMap 인스턴스를 가리키는 map 참조변수를 return 한다.
 
View의 코드를 확인해보자.
 

 
MainController.java 에서, main.jsp 로 경로를 보내주면,
요청을 수행 하고, main.jsp 페이지를 보여 준다.
 
27번째 라인을 확인하면, c 코어를 사용해서, forEach 태그가 작성 되어 있다.
 
View 에서 확인 하면 아래와 같다.
 

 
해시맵을 사용 해서, 키와 키에 대한 값 한쌍을 put() 해놓으면,
 
View에서는 그냥 사용 하면 된다.
 
 
 
4.
Controller 와 View 간의
Controller가 @ModelAttribute("이름") 어노테이션을 사용 해서 테스트 하기.
 
Controller 가 @ModelAttribute("이름") 를 사용 하는 이유로 또 한가지가 있다.
 
C와 V 에서 데이터가 오고가고 잘 되는지를 C가 확인 하고 싶을 때,
 
@ModelAttribute("이름") 어노테이션을 사용해서, 객체를 View 에게 넘겨준다.
 
코드를 확인해보자.
 

 
41번째 라인의 @ModelAttribute("mem")MemberVO mVO 를 확인 할 수 있다.
 
이는, MemberVO 클래스명 (자료형 / 타입명) 을 mem 으로 보내주는 것을 의미 한다.
 
그래서, Command 객체 개념을 사용해서, View 에서
 

 
이렇게 작성 해야 했지만,
 

 
@ModelAttribute("mem") 어노테이션 사용 예시를 들기 위해서, 위와 같이 수정 했다.
 
Command 객체를 별도의 설정 없이 바로 View 파트에서 사용 해보기 !
 
Command 객체는 별도의 설정없이 바로 View 에서 EL 표현식으로 사용이 가능하다.
단, 클래스 타입을 소문자로 시작 해야지 사용 할 수 있다.
 
JavaBeans 규약에 따라 자바 클래스의 프로퍼티 이름이 대문자로 시작하면,
이를 소문자로 바꾼 후에 해당 프로퍼티에 접근 한다고 한다..
 
위의 Command 객체로 View 에서 EL 표현식으로 바로 사용하는 경우는
사실 거의 없다고 보면 된다.
이렇게 안한다.
이런 기능이 있다는것 정도만 알아 두기.
 

 

 
위와 같이, C에서 테스트를 위해, mid랑 mpw를 set 하면,
이 데이터가 
 

 
로 가서도 살아 있기 때문에,
 

 
값이 value 에 꽂혀 있게 된다.
 

 
5.
짚고 넘어가기.
 
사실,
 

 
main 메서드의 인자로 Model model이 작성 되어 있을 때,
 

 
위의 이 코드는, 아래와 동일 하다.
 

 
하지만, Controller 입장에서, 가독성 등의 측면을 고려한다면
 
어노테이션을 사용하는 방식보다,
 
직접적으로 addAttribute() 를 작성하는것이 더 좋을 수도 있다.
 
어느것이 정답 이라고 할 수는 없고, 선호도 또는 상황에 따라
적절한 코드로 작성 하면 될듯 하다.
 
 

반응형