티스토리 뷰

Spring으로 개발하면 주로 화면을 JSP나 Thymeleaf를 쓰는곳이 많이 있다. 이 두가지를 쓰면서 제일 많이하는 것중 하나가 session 또는 model에 데이터를 담아서 view 페이지와 함께 렌더링 하는 작업을 많이하게 되는데
이때 주의해야할 점이 있다. 예제코드를 살펴보자.

회원정보 조회

회원 아이디로 DB에서 회원정보를 조회한 후 'member' 라는 key로 session에 저장한 코드이다.

회원정보 출력

session에 저장된 회원의 이름과 주소를 출력해보았지만 저장된 정보가 나오지 않았다.

왜 나오지 않는지 스프링 코드를 한번 살펴보자

동작 살펴보기

RequestAttributes.java

Spring에서는 RequestAttributes 인터페이스를 제공하는데 request와 session의 scope 우선순위값을 관리하는데
request의 scope상태가 더 높다. 여기서 더 높다라는 의미는

JSTL이나 Thymeleaf 템플릿 문법으로 데이터를 화면 에 그릴때 request scope에 존재하는 데이터를 찾고 없으면 session scope에 존재한 데이터를 찾는다.



이 코드를 자세히 살펴보면 이상한점이 있다.
'member' 라는 key로 session에 저장해두었고 화면에서 출력할땐 request scope엔 존재하지 않지만
session scope엔 존재하니 데이터가 나와야 되는게 정상아닌가?

사실 'member' 라는 key는 이미 페이지가 렌더링이 되기전 request scope에 저장되있었다.

ModelAttributeMethodProcessor

요청이 들어오면 ModelAttributeMethodProcessor가 동작하게 된다. 번역기를 돌려보면

메서드 매개변수에 @ModelAttribute 어노테이션이 선언되있다면 해당 기본생성자를 호출하여 인스턴스를 생성하고
요청 매개변수에 데이터를 바인딩을 해주며 모델에 추가된다.

@ModelAttribute 어노테이션은 생략이 가능하다.



Model은 key, value구조다보니 내부적으로 Map의 entry형태로 이뤄진걸 알 수 있어서 entry 값들을 확인해본 결과
이미 'member' 라는 key가 model에 저장되며 model에 저장하면 내부적 request에 저장이 된다.'

 

@ModelAttribute 어노테이션이 선언후 인자에 선언된 key값으로 model에 담기며 어노테이션이 생략시

파라미터 타입 클래스이름의 맨 앞글자만 소문자로 바꾼 값이 key가 된다.

마무리

session에 저장된 데이터를 가져올땐 'session' 이라는 값을 앞에다 붙혀주면 된다.

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함