알아야할 지식 : 텔레토비의 청소기
- 콩자루: 스프링 월드 안의 청소기가 들고 다니는 것. 스프링 청소기가 흡입해서 (메모리에) 적재하는 애들이 담기는 자루 - @component: 서버로 요청이 들어왔을 때 '요청이 a이면 ㅁㅁ 클래스를 호출해줘' 라고 지정하고서 남긴 표시. 청소기가 발견하면 흡입해서 서버 동작에 반영함 - @bean: 콩자루에 들어간 클래스의 매소드 중에서 @bean이 달린 애는 호출(실행)해달라고 청소기 앞으로 남겨놓은 표시. 청소기가 흡입하며 호출됨. - model: map 자료형의 객체. 스프링에 내장되어 있음. 콩자루 아님. 그냥 전화번호부 같은 거임. view에서 변수 h가 사용되면 스프링은 객체 model에서 이름이 h인 애를 찾아 걔랑 묶인 객체를 참조함. 다시 한번 얘기하지만, 콩자루 아니고 그냥 스프링에 내장된 여러 객체 중 하나. (POJO는 view를 직접 포워딩할 수 없는데 (포워딩은 서블릿끼리만 가능) 이렇게 POJO에서 Model model 이라고만 적어주고 데이터를 넣어주기만(!) 하면 그 이후는 스프링이 알아서 하는 것) |
cf) Plain Old Java Object
Spring은 텔레토비 동산과도 같다.
거기에는 '청소기'라는게 있는데 실제 텔레토비에서 청소기가 막 흡입을 했듯이, Spring도 청소기같은게 있어서는 '콩자루'에 우리가 작성한 코드들 중 @annotation 붙은 것들을 다 메모리에 들어가게 한다.
콩자루에 Data를 한 번 넣어보자.
크게 1, 2 번 방법이 있다 (3번은 view 단 설명을 위해 같이 캡쳐)
코드가 잘 보이지 않으니 크게 봐보자.
26. ModelAndView라는 class를 따로 생성해준 적 없지? 그런데도 사용할 수 있는건 이미 Spring이 가지고 있는거기 때문에. (예전에 사용했던 방식)
28~41. 이전 jsp 때와 다를 바 없음
44. mv 생성
45. view 이 주소로 가
46. addObject ("list" 이름으로, list 위에 값들 받아서)
48. return mv
- 이 48번째줄 때문에 한참을 헤맸는데
- 45, 46 정보를 '담은' mv가 return 되었기 때문에, (예를 들어 한 페이지 가지고 와서 보면) 이렇게 list.jsp에서도 ${list}라고 사용 가능한 것
- 내가 헷갈렸던 부분은 실질적으로 return된 mv를 어디서 받은거지? 하는 부분이었는데 저렇게 45,46 정보를 담은 mv를 return해주기만(!)하면 지금 보고 있는 list.jsp처럼 활용 가능
POJO 안에서
변수 선언 가능 Model model
- 객체 만든게 아니라 선언만 한건데...! 이렇게 POJO에서 선언만 하면 / 프론트 컨트롤러가 알아서 모델 만들어서 전달함
요지는 변수 선언만 하면 된다.
26. 그냥 일반 String 형식의 list라는 함수를 만들어서 / 인자로 (Model model) 을 넣고
28~41. list 안에 데이터 넣고
43. model에 추가해주는 일만(!) 해주면 됨. 그 이후는 Model을 객체로 가지고 있는 프론트 컨트롤러(스프링)이 알아서~ 해준다.
45. 이 아이의 경우 return으로 view와 연결시켜주면 됨
// 1번 방법과 M, V 관련 코드들이 있는건 같지만 다른 점은 ModelAndView처럼 직접 생성해주지 않아도 되니 더 간편해짐.
- 라이브러리에 잠자고 있는 tiles를 일하라고 깨운 것
원래 ResourceViewResolver라고 함 (view를 찾아주는 역할) < TIlesViewResolver : 붙여서 돌려주는 역할
- ViewResolver가 2개 (tiles가 조금 더 큰 개념)
13. @configuration
- @어노테이션 해준것. 청소기야 이거 흡입해! 라면서
- 아래 그림에서 9~12번째거로 넣어줘도 되나 CSS에서 <section> 태그도 <nav>, <aside> 등 속성에 어울리는거를 써줬듯 @어노테이션도 성격에 맞게 써준다.
28. 콩자루에 들어간 클래스의 매소드 중에서 @bean이 달린 애는 호출(실행)해달라고 청소기 앞으로 남겨놓은 표시. 청소기가 흡입하며 호출됨.
29. 콩자루 안에서의 식별자는 '29번째줄의 소문자로 시작하는 이름'을 디폴트 값으로 한다.
31 ~ 33. 기계적으로 적고
- 33번째 줄은 '가장 먼저' 실행해줘라는 의미로 추정
35. 일반 함수와 다르게 return '값'이 아니라 (이해하기 쉽게 말하면, 31~33에 다 속성값을 넣어줬듯) 이 함수의 속성이 이렇게 담겼다~ 하는걸 return. 즉 tilesViewResolver 그 자체라고 생각하면 됨
cf) 참고
client <-> dispatcher Servlet 사이
1. clident가 요청. "/user" 이런 페이지 가지고 왔어~~ 일해줘 ~~
10. dispatcher가 최종결과 출력 : 처리 결과는 이래 :)
dispatcher Servlet의 노고
2, 3. client가 요청한 url과 매칭되는 컨트롤러가 있는지 확인
4. 만약 있으면 '그' Controller에게 일하라고 요청 (나의 역할은 여기까지다~ 세부 사항은 이제 네가 진행해!)
7. POJO로부터 1) ModelAndView라는 상자에 담아서 M,V 정보를 받거나 2) Model model 활용한다고 하면 그 방법으로 M,V 정보를 받거나 -> V 정보 토대로 이제 ViewResolver한테 일을 시킴 ("POJO가 이 view 위치라고 엄청 주장하더라고.... 너 가지고 있어?")
Controller의 역할 (POJO -> 스프링)
- dispatcher Servlet이 이제 너 일하라고 했잖아? (url과 매칭되는거)
그럼 무슨 일을 해줘야하냐면 POJO로서 스프링에 전달하는 방법 2가지 위에 적어줬잖아. 이걸 해줘야 하는 것.
5,6. 데이터를 담아주고 (담아주기만! 하면 됨. 포워딩 X. 그 이후 스프링이 알아서 해줌),
View 위치가 어디인지를 알려줌
ViewResolver 역할
8,9 (위에 7번과 이어지면) "어 있어!"
- viewResolver는 스프링
애 기능은 view를 찾아주고 템플릿 엔진(Thymeleaf) 연결시켜주는거
10은 어디에서 오는가
-> 아래 첨부한 그림들에서 이 흐름이 통일되지 않아서 헷갈렸는데, 상세하게 따지자면 위의 그림.
+ tiles.xml하고 SubLayoutPreparer 보고 순서.
1) Dispatcher Servlet이 -> NoticeController에 "/admin/notice/list" url 요청왔다고, 실행하라고 하잖아.
그리고 M,V 심어서 Dispatcher Servlet에 보내지 (포인트는 M이 이미 심어져있다는거임. (예시 request가 preparer보다 먼저라는 얘기가 여기서 나온 것) ex) title = "테스트"라고 해보자.)
2) ViewResolver 실행해서 넘겨받은 view 위치(admin.notice.list)로 이동하겠지.
3) admin.notice.list 이기 때문에 tiles.xml에서 7번째 조건에 걸린 것.
template 주소 가래 (layout.jsp) 그래서 그 아래들을 tiles '합체'를 해줄건데...
4) preparer의 등장. 디폴트값은 설정해주자~ 하는.
아래 코드.
18. 만약 18번째줄 있으면 preparer가 M 뒤에 실행되기 때문에 내가 M에 심어준 데이터(title="테스트")는 보이지 않고, 여기서 심어준 "뉴렉처 온라인"이 뜨게 되는 것
21. 만약 title 가지고 왔는데
22. title 값이 없으면
23. "뉴렉처 온라인2" 를 넣어주겠다.
//
5) 이렇게 view 디폴트값 / tiles로 레이아웃 합체 해준 다음에 Dispatcher Servlet 가고 Dispatcher Servlet은 클라이언트한테 View 처리한걸 보여주게 되는거지.
9번
Model 부분
75일 - DI, @Autowired로 결합하는 과정 (0) | 2021.06.07 |
---|---|
75일 - MySQL 다운, NoticeDao, NoticeService(비즈니스 로직) 인터페이스 생성, DI 개념 (0) | 2021.06.07 |
74일 - tiles.xml에 preparer 기능 넣어 '디폴트값' 넣어주기 (with 'request에 값이 없을 때에만 되도록 조건문') (0) | 2021.06.04 |
74일 - POJO에서 model 만들어서 전달하는 방법 2가지 (ModelAndView, Model model //직접 포워딩은 하지 못한다는거), tiles.xml 집중화(*) (0) | 2021.06.04 |
73일 - Tiles 생성과 리졸빙 (0) | 2021.06.03 |