
Spring Boot 형식으로 좀더 표현을 바꿔볼 예정이고
오늘은 3가지 어노테이션을 추가로 포스팅하겠습니다
- @RequestParam
- @ModelAttribute
- @SessionAttributes
Spring Boot 형식으로 변경

ModelAndView 객체를 사용하여 아웃풋을 mav로 사용하고있다
더 나아가 Boot까지 공부해볼 예정이기에 Boot 형식으로 바꿔보자
ModelAndView는 값을 저장 & 경로지정을 한번에 해주는 객체였는데
Model 객체를 이용하여 값을 저장하고
return은 String 타입을 이용하여 경로를 지정해 줄 것이다
즉, 아웃풋은 String으로 통일하고
데이터저장이 필요하다면 ModelAndView 객체 대신 Model 객체 사용
>> Boot 형식

위와같이 변경해주면 된다
특히 데이터를 출력해야하는 BoardController는 mav사용이 많다
Boot형식으로 모두 바꿔주도록 하자


@RequestParam
검색로직을 예로들어 설명해보겠습니다
검색로직을 만들기위해 View에서
SearchCondition(검색종류), SearchContent(검색어) 를 만들었다
form을 통해 Controller로 값을 보내주게 되는데
** 보편적으로는 Java에서만 사용할 멤버변수 생성하여 사용한다
private String searchCondition; // 검색종류
private String searchContent; // 검색어
를 생성하여 게터세터를 생성하고 사용하게 된다
그래야 Spring에서 자동으로 SetProperty를 해주기 때문이다
하지만, 멤버변수를 못만들수 있는 상황도 분명 있을 것이다
>> API를분석하여 이용할때
>> 회사가 만든 설계라서 추가할 수 없는 상황
이때 멤버변수 생성없이 SearchCondition과 SearchContent 값을
Controller에서 가져올수 있는 어노테이션이 @RequestParam 이다.

보내준 값을 받을수 있는 인자인 String 값으로 생성을 먼저 해준다
String searchCondion을 인자로 생성하고
@RequestParam을 이용하여 아래의 속성을 넣어준다
속성 | |
value | form으로 보내준 name="이름" |
defaultValue | value가 존재하지 않다면 디폴트로 저장할 값 |
required | 필수인지 아닌지 필수라면 멤버변수로 만드는 것이 좋다 |
검색을 이용하게 되면
SearchCondition(검색종류), SearchContent(검색어)가 존재하므로
해당 메서드에 도착했을때 값이 저장되게 된다
( 그래서 로그에 검색조건 / 검색어가 찍힌다 )
단, 특수한 케이스에만 사용되고 90%이상은 Spring에서 자동으로 SetProperty 하도록
멤버변수를 이용하는 것이 보편적이다
@ModelAttribute
View 작업자 입장에서
검색기능이 있습니다. 라는 회의를 진행함
음... 검색할 페이지를 만들어야겠군...
제목/내용/작성자/... => 칼럼을 알아야 만들수 있음
Controller 작업자가
View 작업자야, 신경쓰지마.
내가 값들 넘겨줄게!
( BoardController 안의 메소드 )

Map.put("사용자에게 보여주는 값", "view에서 사용할 value값")

페이지에서 값을 꺼낼때는 key와 value 라는 변수를 이용한다
=> View 에서 사용할 데이터를 Controller에서 설정하는 용도로 사용
=> @RequestMapping 메서드보다 먼저 호출됨
=> @ModelAttribute 메서드는 실행 이후에 객체를 반환하는데, 이 반환값은 Model에 자동 저장됨
=> Model에 자동저장되기때문에, View에서 사용가능하다!
@SessionAttributes()
" NULL 업데이트 이슈 "
View 작업자는 기능만 알고, 내부로직은 모름
때문에 (필요한 데이터인데) 전달되지않는 파라미터가 발생
전달되지않은 파라미터의 값은 null이 됨
null 값이 업데이트 될수도있음
>> 등록되어있던 프로필 사진이 기본 프로필사진으로 바뀜 (꽤 자주있는 상황)
" NULL 업데이트 방지 "
컨트롤러 Class 위에 작성한다
() 인자값으로는 현제 이용하는 data의 이름을 사용 -> ex) "board"


1) 사용자가 요청 >> @SessionAttribute에 설정된 이름으로 Model에 저장
2) Model에 @SA에 설정한 이름으로 저장된 데이터가 존재한다면
해당 데이터를 세션에도 자동으로 저장하겠다는 설정
3) @ModelAttribute("이름") >> Controller의 메서드인자(== Command 객체) 앞에 붙이면
>> 해당 "이름"을 가진 데이터와 메서드 인자(== Command 객체)가 동일하다는 설정이 된다!

기능 작동 순서
1) 사용자의 요청 >> 메서드는 @SA에 설정된 이름으로 Model에 저장
>> 글상세보기 페이지 (selectOne = 이때 board가 저장됨)
>> /bupdate.do 실행시 @MA("board")에 저장되있는 데이터가
BoardVO vo 객체안에 자동매핑됨
2) Model에 @SA에 설정된 이름으로 저장된 데이터가 존재하면
그 데이터를 세션에도 자동저장해줘~ 라는 설정
3) NULL 업데이트 이슈가 발생할법한 메서드의 인자에게 @MA를 인자로 설정하면,
@SA에 의해 저장되어있던 데이터가 자동매핑됨
내용 설명
>> 글상세보기 페이지 (selectOne = 이때 board가 저장됨)
>> /bupdate.do 실행시 @MA("board")에 저장되있는 데이터가
BoardVO vo 객체안에 자동매핑됨 ( = 이때 Null 값들이 채워짐 )
>> 그 이후 vo 객체에 사용자의 입력값이 매핑됨
즉, 먼저 @SA에 저장된 값을 입혀주고, View에서 넘겨준 값을 덮어씌우는 것
'Spring' 카테고리의 다른 글
[ 에러 페이지 설정 ] @과 xml설정 (0) | 2022.09.28 |
---|---|
[ 2-Layered 아키텍처 ] MVC2로 교체하기 (0) | 2022.09.27 |
[ MVC 패턴 ] Spring으로 표현하기 (2) (0) | 2022.09.21 |
[ MVC 패턴 ] Spring으로 표현하기 (0) | 2022.09.20 |
[ JDBC ] 템플릿 메서드 패턴 (0) | 2022.09.16 |