ㅁ 패키지 익스플로러 - 우클릭 - spring legacy project
- 베이스 패키지는 중요하다.
- 프로젝트 생성 후 빨간 X가 뜬다. 정상이다.
ㅁ 항상 프로젝트를 생성한 후엔 pom.xml을 열어서 버전체크를 해야 한다.
- 옛날 버전으로 세팅되어 있어서 한번 수정해야 한다.
- 첫번째 프로젝트를 생성하면서 바꿨던 버전대로 pom.xml을 수정한다.
- 프로젝트 우클릭 - maven - update project하면 자바11버전으로 보여진다.
ㅁ 스프링 특징3
ㅁ MVC 패턴
- 디자인 패턴 중 하나로 하나의 애플리케이션을 구현할 때 구성요소들을 Model, View, Controller로 역할을 구분하는 패턴.
- 클래스마다 로직이 분리되어 있지 않고 한 클래스에 모든 코드가 작성되어 있으면 문제 발생시 문제점 파악이 어렵다. 유지보수에도 불편하다.
- MVC 패턴을 적용하면 로직이 분리되어 있기 때문에 유지보수에 용이해진다.
ex) 요청 처리 관련 문제 발생 -> controller 클래스만 수정
ex) 화면 관련 문제 발생 -> jsp파일만 수정
(1) Model
- 애플리케이션의 데이터와 관련된 역할을 수행한다.
- Java 파일 (src/main/java에서 작업)
(2) View
- 애플리케이션의 시각적인 요소와 관련된 역할을 수행한다. (화면, 사용자 인터페이스 요소 등)
- JSP 파일 (src/main/webapp/WEB-INF/views에서 작업)
(3) Controller
- 애플리케이션의 요청처리 관련된 역할을 수행한다.
- Java 파일 (src/main/java에서 작업)
- view와 model 사이에서 데이터의 흐름을 제어한다.
ㅁ 스프링 전에는 컨트롤러를 서블릿 클래스로 직접 구현했다.
- Spring에서는 직접 서블릿을 만들지 않고, 모든 URL 요청을 처리하는 하나의 서블릿(DispatcherServlet)을 사용한다.
- 서블릿의 개념이 아예 없는 것은 아니다. 스프링에선 모든 url 요청에 대한 서블릿을 하나 둔다.
Spring에서는 DispatcherServlet이 모든 요청을 받아서 각 컨트롤러에 분배하는 역할을 한다.
ㅁ 불필요한 파일 삭제
- src/main/java/com/br/mvc 패키지의 HomeController.java 삭제
- src/main/webapp/WEB-INF/views 폴더의 home.jsp 삭제
ㅁ 패키지 생성
- com.br.mvc.controller
- com.br.mvc.service
- com.br.mvc.dao
- com.br.mvc.dto
ㅁ 메인페이지 만들기
- src/main/webapp/WEB-INF/views 폴더에 main.jsp를 만든다. 파일명은 상관없다.
- url mapping값이 "localhost:8888/mvc/"나 "localhost:8888/mvc/main.do" ~
- 서블릿을 두지 않고 저런 url 요청시 ~ 컨트롤러 클래스를 만들어서 매핑시킬 예정이다.
- 매 요청마다 서블릿 클래스를 따로따로 두지 않을 예정이다.
ㅁ 스프링 사용 전
- 서블릿 클래스를 직접 만들었다.
- @WebServlet("/ 또는 /main.do") 어노테이션으로 url mapping값을 작성하면 get방식이냐 post 방식이냐에 따라서 메소드들이 자동으로 실행됐었다.
public void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
// forwarding
request.getRequestDispatcher("/WEB-INF/views/main.jsp").forward(request, response);
// redirect
response.sendRedirect("재요청할url");
}
ㅁ 스프링 사용 후
- 요청 처리를 담당하는 역할의 Controller 클래스 상단에 @Controller 작성
- 해당 클래스 내에 url 요청별로 실행시킬 메소드를 작성 후 @RequestMapping으로 url 매핑값 작성
ㅁ @RequestMapping(value="" [method=])
- 메소드 상단에 작성한다.
- 요청을 인식하는 어노테이션으로 url 매핑값과 요청메소드(GET, POST)를 인식함.
- url 요청과 실행시킬 메소드를 매핑시킨다.
- value 속성에 URL Mapping값을 작성한다. 여러개 작성할 수 있다. value만 쓸 때는 속성명을 생략할 수 있다.
- method 속성에 요청 방식을 작성한다.
get 방식은 RequestMethod.GET
post 방식은 RequestMethod.POST
라는 상수값으로 작성해야 한다. 생략시 get, post 둘 다 허용함.
<메소드 작성법>
(1) 반환타입
- String, void 외에도 더 있는데 나중에 배운다.
- String : 응답할 jsp의 경로를 문자열로 반환값을 작성한다.
- void : 반환값을 작성하지 않는다. 이때 응답할 jsp 경로는 url 매핑값과 동일하게 인식된다.
ex) /board/list.do라는 url 요청이 오는 경우
/board/list.jsp 페이지로 이동
(2) 메소드명
- 아무 역할이 없다. 아무렇게나 작성 가능.
(3) 매개변수
- 마음대로 써도 된다. 보통 요청과 응답을 위한 각종 변수들을 선언한다.
- 주로 사용되는 매개변수 몇가지만 (엄청 많음)
HttpServletRequest request
HttpServletResponse response
HttpSession session
일반 변수(int num, String name 등)를 쓰면 요청시 전달되는 파라미터를 받는 변수로써 활용된다.
커맨드 객체를 쓰면 요청시 전달되는 파라미터들을 담는 객체
Model model : 응답페이지에서 필요한 데이터(attribute)를 담는 객체 (request scpoe다) (포워딩하는거)
ModelAndView mv : Model(데이터) + View(뷰 정보)를 같이 담을 수 있는 객체
RedirectAttributes arr : redirect할 때 필요한 정보(flash attribute)가 있다면 담는 객체 (redirect하는거)
ㅁ com.br.mvc.controller 패키지에 MvcController 일반 클래스를 만든다.
- 컨트롤러 용도의 클래스 상단에 @Controller라는 어노테이션을 붙인다.
@Controller는 클라이언트의 요청을 처리할 클래스를 Bean으로 등록하기 위해 작성하는 어노테이션이다.
- url 요청시 자동으로 Controller 내의 메소드가 수행되기 위해서는
스프링이 해당 객체를 관리할 수 있도록 Bean으로 등록되어 있어야 한다.
- "servlet-context.xml" 파일의 <component-scan> 태그가 base-package로 작성된 패키지를 가지고 있는 모든 클래스들을 스캔(= 빈 스캐닝)하면서 @Component 타입의 어노테이션이 붙어있는 클래스들을 자동으로 빈으로 등록한다.
- 그러기 위해서는 <annotation-driven>에 의해서 @Component 타입의 어노테이션인 @Controller가 활성화 되어 있어야 한다.
- url mapping값은 컨트롤러 클래스 내에 @RequestMapping이라는 어노테이션으로 작성한다.
- HTTP 요청 방식은 "method=RequestMethod.GET"라는 상수필드를 사용해서 지정한다.
- 메소드를 만든다. 메소드 이름은 자유롭게 설정할 수 있으며, 스프링이 요청에 맞춰 자동으로 호출한다.
- 메소드 위에 @RequestMapping 어노테이션만 있으면 되는게 아니고 그 클래스를 빈으로 등록시키는 @Controller 어노테이션이 필요하다.
- 반환값은 DispatcherServlet의 ViewResolver에 전달된다.
이때 반환값 앞(prefix)에 "/WEB-INF/views"가 붙고, 뒤(suffix)에 ".jsp"가 붙으면서 응답뷰 경로가 완성된다.
- 기본적으로 포워딩으로 인식돼서 포워딩처리까지 자동으로 진행된다.
- 앞이랑 뒤에 붙을 걸 고려해서 그 사이에 들어갈 문자열만 반환하면 포워딩으로 인식돼서 포워딩이 진행된다.
- 만약 포워딩이 아니라 redirect를 하고 싶다면 반환 문자열 앞에 "redirect:"를 붙여주면 된다.
ex) return "redirect:url경로";
ㅁ 원리
- web.xml이 먼저 실행된다.
- 여기서 root-context.xml이 실행된다. 여기에 빈으로 등록된 파일이 있으면 그 컨테이너에 보관된다.
- 이게 어제까지 내용.
- 그 아래보면 <servlet>이랑 <servlet-mapping> 태그가 있다.
- 알게 모르게 servlet이 하나 있다.
- <servlet> + <servlet-mapping>에 어떤 url로 요청하든 스프링에서 제공하는 DispatcherServlet이 작동되도록 mapping되어 있다.
- 이때 servlet-context.xml(서블릿과 관련된 환경설정 파일) 파일을 읽어들이면서 DispatcherServlet 객체가 생성된다.
- 요청과 관련된 설정 및 빈 등록은 servlet-context.xml에 작성한다.
이 파일이 Spring Bean Configuration File이다.
ㅁ servlet-context.xml
- InternalResourceViewResolver 클래스가 빈으로 등록되어 있다.
ViewResolver 클래스에 의해 응답페이지가 보여진다.
- 앞과 뒤에 prefix와 suffix가 붙는다.
prefix(접두어)의 값으로 "/WEB-INF/views/"
suffix(접미어)의 값으로 ".jsp"
request.getRequestDispatcher("/WEB-INF/views/~.jsp").forward(request, response);
- <annotation-driven /> 태그와 <context:component-scan base-package="com.br.mvc" /> 태그 덕분에 ~
(1) <annotation-driven>
- @Controller 어노테이션을 활성화하는 태그다.
- Spring MVC에서 각 요청에 따른 Controller를 실행시키기 위한 HandlerMapping과 HandlerAdapter를 자동으로 bean으로 등록한다.
(2) <context:component-scan>
- base-package로 작성된 패키지를 가지고 있는 모든 클래스들을 스캔(= 빈 스캐닝)하면서 @Component 타입의 어노테이션이 붙어있는 클래스들을 자동으로 빈으로 등록한다.
- MvcController 클래스도 com.br.mvc.controller 패키지였다.
- @Component 타입의 어노테이션으로 @Controller, @Service, @Repository가 있다.
MVC 역할별로 세분화되어 있다. 컨트롤러, 서비스, dao 단에 붙이는 어노테이션이다.
- @Component 타입의 어노테이션을 쓰고 싶다면 활성화되어 있어야 한다.
활성화 시키는 게 <annotation-driven> 태그다.
- 일반 클래스를 빈으로 등록시키고 싶으면 @Component를 붙이면 된다.
- 내가 만든 클래스가 아닌 어디선가 제공되는 클래스를 빈으로 등록하고 싶다면 xml 방식이나 java 방식으로 해야 한다.
내가 만든 클래스를 빈으로 등록할 때는 주로 어노테이션 방식으로 할 예정이다.
'Spring' 카테고리의 다른 글
[Spring] MVC (3) book 서비스 (1) | 2024.10.16 |
---|---|
[Spring] MVC (2) resources 등록 (0) | 2024.10.16 |
[Spring] DI(의존성 주입) (2) | 2024.10.15 |
[Spring] IOC(제어의 역전) (0) | 2024.10.14 |
[Spring] 첫번째 프로젝트 생성, pom.xml (2) | 2024.10.14 |