강의를 듣다가 @SessionAttribute를 사용했다. 컨트롤러 매개 변수 단계에서 session을 받아오는 역할을 해주었다. 이때 name 속성을 사용했는데 이것저것 건드려보다 @ModelAttribute와 다른 점을 발견했다. 개인적으로 흥미로운 발견이어서 테스트하는 코드를 작성해 보았다.
@ModelAttribute의 name 속성
@ModelAttribute는 사용자의 입력 값과 객체를 바인딩 후 model에 담아준다.
name 속성을 지정해주면 그에 맞게 model의 이름이 설정된다.
name 속성을 사용하지 않으면 클래스의 첫 글자를 소문자로 바꾼 문자를 name으로 설정한다. => member
(@ModelAttribute가 클래스 이름인Member를 member로 바꿔 사용하기에 teho는 영향을 주지 않는다. )
여기까지는 전 강의에서 설명을 해주었고 @SessionAttribute에는 별다른 언급이 없어서 똑같이 동작할 거라 생각하였지만..!
@SessionAttribute()의 name 속성
session을 사용해야하기 때문에 db에 테스트 데이터를 넣고 session을 생성하여 key(이름)는 "member", value는 member타입의 테스트 데이터를 저장해 주었다.
그다음 session에서 member를 가져와 이름을 화면에 뿌려주는 코드를 작성했다.
결과는 당연히 테스트 데이터의 이름이었던 TEST1이 화면에 찍힌다.
만약에 변수 명을 바꾼다면???
내 생각대로 @ModelAttribute와 동일하게 동작하면 클래스 명인 Member를 member로 바꿔서 사용하기에 상관 없...
상관없어야 하지만 그렇지 않았다. session에 Member 타입이고 'teho'를 키로 갖는 속성은 없다고 나온다.
'teho'가 어디서 나온 것일까???? 변수 명이였다.
@ModelAttribute와 다르게 @SessionAttribute는 name 속성을 사용하지 않으면 어노테이션이 붙어있는 변수 명을 사용한다. teho를 변수 명으로 사용하고 올바르게 사용하려면 name을 member로 따로 지정해주어야 한다.
! 결론 !
@ModelAttribute는 name 속성을 사용하지 않을 경우 클래스 명의 첫 글자가 대문자라면 소문자로 바꿔서 사용한다.
@SessionAttribute는 name 속성을 사용하지 않을 경우 변수 명을 사용한다.
탐구력 +30 획득.
'Spring' 카테고리의 다른 글
Spring Builder 패턴 제대로 알고 어노테이션 사용하기 (@AllArgsConstructor, @NoArgsConstructor가 필요한 이유) (1) | 2024.03.12 |
---|---|
[Spring] 나만 보는 스프링 사전(스프링 어노테이션) (0) | 2023.06.30 |
[Spring JPA] 영속성 컨텍스트 완벽 이해!, 연관 관계 주인 mapping (cascade와 차이?) (0) | 2023.03.30 |
[Spring] JPA란? (간단정리) (0) | 2023.02.04 |
[Spring] @JoinColumn & 연관관계 맵핑 @Mappedby (외래키 주인? 연관관계 주인?) (1) | 2023.01.13 |