주니 개발 도서관

Spring

[ MVC 패턴 ] Spring으로 표현하기 (3)

주니홍 2022. 9. 23. 09:41

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에서 넘겨준 값을 덮어씌우는 것