-- INDEX --
1. bean 등록 | 2. ViewResolver | 3. 요청 처리 방식 | 4. 데이터 받기 | 5. 데이터 담기 | 6. 상위타입받기 |
@annotation .xml @bean |
prefix suffix |
(value, method) @GetMapping @PostMapping |
Request로 받기 변수로 받기 객체로 받기 |
Request에 담기 Model에 담기 |
Interface |
1. bean 등록하기
1-1 : bean 등록하는 방법
- @annotation
- .xml
어노테이션으로 하는 방법이 쉽지만.
어노테이션으로 bean 만드는 것은
클래스 위에 / 메서드위에 /필드위에 작성해 주어야 했다.
즉, class파일안에 작성했어야 했다..
1-2 : BUT. 예를 들어 SqlSession 얻어오려면?
- 우리가 만든 클래스 파일이 아니고,
- 이미 만들어진 jar파일 가져다 사용하는 경우에는 수정할 수 없다. = 어노테이션 붙일 수가 없다.
- 해당 클래스 파일에서 수정할 수 없으니 xml문서를 가지고 동적으로 자바 코드를 만드는 작업 해주어야 한다.
- <bean class=“” SqlSession =“” ~~ >
+@ 추가된 방법 1가지
- @Bean 어노테이션을가지고 – 자바 코드로도 작업이 가능하게 해 주었다
- xml파일로 bean 등록하는 과정을 워낙 어려워하고 요구가 많아져서 생겼다.
- 이 과정도 쉽지는 않다고 하심.
2. ViewResolver
return "board/write"만 해줬는데
어떻게 해당 경로를 찾아서 화면이 보이는지?
# return 값이 무엇인지 – 어떻게 돌아가는지 알아보자
2-1 : 클라이언트가 요청을 보내게 되면은 – DS이 요청을 잡는다. - 요청 url에 맞춰 해당 컨트롤러 호출
2-2 : 요청을 처리한 후 ㅡ DS는 응답을 해줘야 하는데 뭘로 해주나?
- 요청 url인 write는 컨트롤러에게 줘버렸다
- ( 정확히는 컨트롤러 안에 있는 method에게 = @RequestMapping된 메서드에게 )
2-3 : ViewResolver가 넘겨준 값으로 응답해준다.
- 컨트롤러는 작업이 끝난 후 어떤 문자열을 Dispatcher Servlet에게 전달하고
- Dispatcher Servlet는 전달받은 문자열을 ViewResolver에게 전달
- ViewResolver에서 어떤 작업을 진행한 뒤 - 그 문자열을 DS에게 return
- DS는 ViewResolver로부터 전달받은 값으로 화면을 선택 - 클라이언트에 전달
2-4 : ViewResolver는 어떤 작업을 해서 DS에게 전달해 주는가?
- ViewResolver 가 어떻게 작동하는지 어떤 내용이 있는지 보고 싶으면 종속되어있는 DS 설정 파일을 보면 된다.
- DS 설정 파일 = servlet-context.xml 파일
- 스프링 context 안에 있는 객체를 이제 bean이라고 할 것이다.
#초록색
- 어떤 bean(객체)를 만들 것이다 – 어떤 객체? viewResolver 클래스를 이용해 만든 객체
#보라색
- property 는 setter 호출하는 것이다. - prefix라는 변수에 /Web-INF/views를 대입 – suffix변수에 .jsp 값 대입
#이것을 알았으면 ViewResolver가 하는 작업 체크
- DS에게 전달받은 값 ( 문자열 )을 가지고
- prefix + 문자열 + suffix 작업을 해준다.
- [ prefix+문자열 + suffix ] 해준 값으로 DS(디스패쳐서블릿) 에게 전달한다!
2-5 : 스프링에서 --- 리다이렉트 하는 법
- ViewResolver의 prefix / suffix 처리 받지 않도록 해주는 법
- redirect 하는 것이라고 알려주기
- return "redirect:/";
[ return = " / "; ] 만 해주면
return 값이 ViewResolver에게 전달되어서
prefix 값과 suffix 값이 앞뒤로 붙어서 처리된다.
prefix와 suffix 처리되지 않도록 해주기 위해서는
redirect 하는 거라고
3. 메서드 요청 방식에 따라 처리하기 ( 겟방식, 포스트방식 )
- doGet() , doPost() 했던 것처럼 처리하기
3-1 : @RequestMapping
여러 가지 요청에 대해서 요청마다
새로운 클래스(컨트롤러)를 생성해서 처리하는 것이 아니라
하나의 컨트롤러에서
들어오는 요청에 매핑되어서 처리하는 메서드만 여러 개 만들어서 사용 가능하다.
HOW ?
메서드에 @RequestMapping 하는 방식으로 사용하기 때문에!
3-2 : 클래스(컨트롤러)에 공통 url 지정 가능
- 클래스에 @RequestMapping() 적용하여서
- 메서드에 @RequestMapping() 처리 시 공통으로 들어가는 url = /board를 지정해 놓을 수 있다.
- 즉, BoardController에서는 /board 라는 url 이 모든 메서드에 공통으로 들어갈 텐데
- 공통url을 등록해 놓을 수 있다.- 등록해놓으면 메서드 부분에서는 /board 생략 가능
- 공통url 지정해 놓으면 - /board 없애도 잘 작동한다.
- + board앞에 / [ 슬래쉬 ] 없애도 잘 작동한다.
- + write 앞에 / 없애도 잘 작동한다.
3-3 : get요청 처리의 정석 방식과 @GetMapping
- @RequestMapping에서
- 파라미터를 value만 전달해주는 경우에는 굳이 value 명시해서 사용해줄 필요 없다.
- ( 1개의 값만 넣어주는 경우에는 value값으로 처리된다. )
- 여러 개의 파라미터를 사용하는 경우에는 value=" " 명시해주어야 한다.
( 현재 스프링 프레임워크 최신 버전으로 설정하기 전 )
스프링 버전 설정 끝나면@GetMapping 사용 가능
@Getmapping 통해서 method부분 없앨 수 있다 = value 파라미터만 전달해주면 된다. = /write만써도된다
4. 사용자가 입력한 데이터 가져오기
- 스프링에서 파라미터 데이터 가져오기
4-1 : 메서드 파라미터로 HttpServletRequest 객체 받아서 가져오기
- 서블릿과 똑같이 getParameter로 가져오기
- 요청을 처리하는 메서드의 파라미터로 HttpServletRequest req 추가
- DS가 해당 메서드 호출할 때 파라미터 타입(HttpServletRequest)에 맞춰서 req객체 넣어준다.
- 해당 객체로 파라미터 값 가져오기 - req.getParameter(" ")
4-2 : 메서드 파라미터 변수로 가져오기
- 요청을 처리하는 메서드의 파라미터로 - 변수 넣어주기
- 결국 하려는 일이 – getParameter 해오고 – 변수에 담고 – 변수를 이용해서 vo를 만드는 것이다.
- 메서드의 파라미터로 변수를 받아오게 해 주면 – Spring이 알아서 변수에 값을 넣어준다.!
- req 객체를 넣어주었듯이 변수에 값을 넣어준다.
# 조건
- 클라이언트에서 넘어오는 name값과
- 서버측(컨트롤러)에서 받아주는 변수명이 같을 때에만 받아준다!
# 정석
- 정석은 @RequestParam 어노테이션이 붙어있어야지-
- Spring이 이거는 클라이언트 쪽에서 넘어오는 name값으로 – getParameter하라는 거구나 판단하고 채워주는 것이다.
- 생략하고 간편하게 사용해도 괜찮다..
다만 파라미터에 대한 옵션을 설정해줄 때에는 어노테이션 사용해주어야 한다..
어떤 옵션?
title의 값이 없을 때 출력될 defalut값 지정 같은 옵션
4-3 : 메서드 파라미터 객체로 가져오기
- 클라이언트가 입력한 데이터를 받아오는 이유는
- getParameter 해오고 – 변수에 담고 – 변수를 이용해서 vo를 만드는 것이다.
- 파라미터에 이렇게 객체만 써주면
- 해당 객체 찾아가서 필드 값을 매칭 해서 자동으로 채워준다!
# 조건
- 클라이언트에서 넘어오는 name값과
- 서버측(컨트롤러)에서 받아주는 BoardVo 객체의 필드명이 같아야 한다.
+ 받는 파라미터가 다르므로 똑같은 이름의 메서드 사용 가능
5. 포워딩 전에 - 요청 처리 결과 담기
5-1 : 파라미터에 HttpServletRequest req 객체 받아서 req.setAttribute()해서 담은 뒤 포워딩
5-2 : Model 객체 이용해서 담은 뒤 포워딩
springframework의 Model 이용
.addAttribute() 메서드 이용
key, value 형태로 담아서 보내주기
화면에서 확인
새로운 저장소는 아니고 –
request 에 있는 map같은 거라고 보시면됩니다.
Spring에서 request대신에
model이라는 곳에 담아라 이런 느낌으로 만든 애다..
6. 상위 타입인 Interface 로 객체 받기
# 컨트롤러 객체가 태어나기 위해서는 서비스 객체를 필요로 하고 있고
서비스 객체가 태어나기 위해서는 dao객체를 필요로 하고 있다.
# 이 상황에서 "서비스객체"가 "서비스22" 객체로 변경된다면?
- 객체를 생성하는 곳, 받아주는 곳 뿐만아니라 메서드명이 바뀌었다면 메서드명까지 수정이 필요하다.
- 이런 것을 방지하기 위해 상위 타입인 인터페이스를 만들어서 구현하도록 해 주고
- 생성된 객체는 상위 타입인 Interface 타입으로 받아주기로 하였다.
앞으로 서비스 객체 자리에 들어올 객체는
MemberService 인터페이스를 상속받아 구현한 애만 올 것이니까 받아줄 수 있다.
마찬가지로 dao객체 자리에 들어올 객체도
MemberDao 인터페이스를 상속받아 구현한애만 올것이니까 받아줄 수 있다.
메서드 명도 인터페이스에서 정해져 있으므로 동일하다. = 수정 작업 필요 없다.
6-1 : new interface - MemberService
MemberService 타입으로 변경!
그럼 이제
컨트롤러가 태어날 때 필요한 인터페이스에
파란 객체가 오던 / 주황 객체가 오던
수정 작업 필요 없이 받아 줄 수 있다.
6-2 : 상위 타입인 인터페이스로 객체 받아주기
- 서비스 객체를 필요로 하는 컨트롤러 부분에서 상위 타입인 인터페이스로 객체 받아주기
- 이렇게 되면 어떤 서비스 객체가 오더라도 받아 줄 수 있다.
- 서비스 객체가 변경되더라도 컨트롤러 부분에서는 수정할 작업 없다.
6-3 : 서비스 부분에서도 같은 작업 해주기
- new interface - MemberDao
- 상위 타입인 MemberDao 로 dao 객체 받기
# 체크
- 어노테이션은 인터페이스가 아닌 – 인터페이스를 구현한 클래스에 달아주기
- 인터페이스로는 객체를 만들 수 없다.
'Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원 > 9월' 카테고리의 다른 글
22.09.13 - [ Spring ] pom.xml / web.xml / context.xml 설정 파일 및 DB 설정 파일 (0) | 2022.09.19 |
---|---|
22.09.12 - [ 추석 연휴 휴강 ] (0) | 2022.09.15 |
22.09.08 - [ Spring ] @Component , @Autowired , injection , IoC 와 DI (0) | 2022.09.15 |
22.09.07 - [ Spring ] DispatcherServlet, spring legacy 프로젝트 생성 및 구조 살펴보기 (0) | 2022.09.14 |
22.09.06 - [ Mybatis ] - 게시글 검색, 검색 게시글 페이징처리, 동적sql (1) | 2022.09.08 |