MVC(Model - View - Controller) Pattern
Model
- Service, Dao
- 애플리케이션 상태의 캡슐화
- 상태 쿼리에 대한 응답
- 애플리케이션의 기능 표현
- 변경을 view에 통지
View
- .jsp
- 모델을 화면에 시각적으로 표현
- 모델에게 업데이트 요청
- 사용자의 입력을 컨트롤러에 전달
- 컨트롤러가 view를 선택하도록 허용
// servlet-context.xml
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
- redirect view
>> view 이름에 "redirect:" 접두어를 붙이면 지정한 페이지로 redirect 됨
>> redirect:/board/list.html?pg=1
>> redirect:http://localhost/board/list.html?pg=1
@Controller
public class HomeController {
@Autowired
private HelloService helloService;
@RequestMapping(value = "board/register.html", method = RequestMethod.GET)
public String register(@ModelAttribute("article") BoardDto boardDto) {
boardService.registerArticle(boardDto);
return "redirect:board/list.html?pg=1";
}
Controller
- Controller
- 애플리케이션의 행위 정의
- 사용자 액션을 모델 업데이트와 mapping
- 응답에 대한 view 선택
- Client의 요청을 처리
- 자기가 일을 하는 것이 아니라 일을 시킴(service에게)
@Controller
@RequestMapping("/home") // 공통 부분
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@Autowired
private HelloService helloService;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home() {
return "index";
}
@RequestMapping("/hello")
public ModelAndView hello() {
ModelAndView mav = new ModelAndView();
HelloDto helloDto = new HelloDto();
helloDto.setMessage("Hello Spring Web MVC!!!");
mav.addObject("hello", helloDto);
mav.setViewName("step01/hello");
return mav;
}
// servlet-context.xml
<context:component-scan base-package="com.test.board.controller"/>
Parameter Type | 설명 |
@PathVariable | URI 템플릿 변수에 접근할 때 사용 |
@RequestParam | HTTP 요청 파라미터를 매핑 >> Map을 DTO처럼 사용할 수 있음(ModelAndView) |
@CookieValue | HTTP 쿠키 매핑 |
@RequestBody | HTTP 요청의 body 내용에 접근할 때 사용 |
@ModelAttribute | DTO의 모델명을 설정할 수 있음(기본은 클래스 이름) |
Spring MVC
Spring MVC 요청 흐름
Spring MVC 구성
DispatcherServlet (Front Controller) - web.xml
- 모든 클라이언트의 요청을 전달받음
- Controller에게 클라이언트의 요청을 전달하고, Controller가 리턴한 결과값을 View에게 전달하여 알맞은 응답을 생성
HandlerMapping
- 클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정
- URL과 요청 정보를 기준으로 어떤 핸들러 객체를 사용할지 결정하는 객체이며, DispatcherServlet은 하나 이상의 핸들러 매핑을 가질 수 있음
Controller
- 클라이언트의 요청을 처리한 뒤, Model을 호출하고 그 결과를 DispatcherServlet에 알려준다
ModelAndView
- Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체
ViewResolver
- Controller가 리턴한 뷰 이름을 기반으로 Controller의 처리 결과를 보여 줄 View를 결정
View
- Controller의 처리 결과를 보여 줄 응답 화면을 생성
Spring MVC 구현
Spring MVC를 이용한 Application 구현 Step
- web.xml에 DispatcherServlet 등록 및 Spring 설정파일 등록(DI, AOP)
>> web.xml, web과 관련된 xml, non-web인 xml 총 세 개의 xml을 만들어야 함
>> web.xml, servlet-context.xml, root-context.xml
>> src/main/webapp/WEB-INF/web.xml
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- init-param을 설정하지 않으면 <servlet-name>-servlet.xml 파일에서 applicationContext의 정보를 load -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<!-- WAS startup시 초기화 작업진행 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<!-- DispatcherServlet이 처리하는 URL Mapping pattern을 정의 -->
<!-- Servlet이므로 1개 이상의 DispatcherServlet 설정 가능 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
- 설정 파일에 HandlerMapping 설정, Controller에 등록
- Controller 구현 및 Context 설정 파일(servlet-context.xml)에 등록
>> src/main/java/com.test.web.controller/HomeController.java
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client local is {}.", local);
model.addAttribute("message", "안녕하세요 스프링");
return "index";
}
}
>> src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
- Controller와 JSP의 연결을 위해 View Resolver 설정
- JSP 코드 작성
1. config.java 설정
- @EnableWebMvc
2. web.xml 파일에 DispatcherServlet 설정
3. 컨트롤러 구현
4. JSP 구현
Spring Web Aplication의 동작 원리
1. web.xml 로딩
2. ContextLoaderListener 생성
3. root-context.xml 로딩
4. ServiceImpl, DAO, VO 생성
5. 클라이언트 요청
6. DispatcherServlet 생성
7. servlet-context.xml 로딩
8. Controller
Spring Legacy Project
Please specify the top-level package e.g. com.mycompany.myapp*(웹주소)
pom.xml
<!-- 10~15 -->
<!-- 수정 전 -->
<properties>
<java-version>1.6</java-version>
<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<!-- 수정 후 -->
<properties>
<java-version>1.8</java-version>
<org.springframework-version>5.3.18</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<!-- 136~147 -->
<!-- 수정 전 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<!-- 수정 후 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
>> 다른 버전들도 확인하기
>> 프로젝트 오른쪽 마우스 - Maven - Update Project - Froce Uopdate of Snapshots/Releases
.jsp
직접 접속하지 않는다
>> src/main/webapp/WEB-INF/views 안으로 옮김
오류
500 - Controller에서 NullPointException 뜰 때 or 실행이 안 될 때
>> 첫번째 에러를 찾는다
>> 에러 메시지의 제일 뒤부터 살핀다
@Controller
public class HomeController {
@Autowired
private HelloService helloService;
@Service
public class HelloServiceImpl implements HelloService {
@Repository
public class HelloDaoImpl implements HelloDao {
'프로그래밍 > SPRING' 카테고리의 다른 글
09. MVC 2 - 커맨트 객체 값 검증 및 에러 메시지 처리 (0) | 2022.08.03 |
---|---|
08. MVC 1 - 컨트롤러, 뷰 구현 (0) | 2022.08.02 |
06. AOP (0) | 2022.04.26 |
05. DI 적용 (0) | 2022.04.24 |
04. DI (0) | 2022.04.23 |