07. Spring Web MVC
728x90

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 {

 

 

728x90

'프로그래밍 > 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