잡동사니에도 사랑을

[21.11.17] WAC (Web Application Context) 등록 - (chapter06_SpringWebMaven) 본문

SPRING

[21.11.17] WAC (Web Application Context) 등록 - (chapter06_SpringWebMaven)

luvforjunk 2021. 11. 17. 15:01
728x90
반응형

★ WAC (Web Application Context) 등록

 

1. ContextLoaderListener가 생성하는 Root WAC

- 웹 환경과 독립적인 빈 등록

- 디폴트 설정 파일 /WEB-INF/applicationContext.xml 으로 설정 된다

- 서비스계층과 데이터 액세스 계층을 포함해서 웹 환경과 직접 관련이 없는 모든 빈들을 여기에 등록 한다

 

 → 만약에 사용할 이름이 다르거나 설정파일이 여러 개인 경우

      contextConfigLocation 파라미터를 추가해서 설정해주면 된다

 

2. DispatcherServlet이 생성하는 WAC

- DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈을 등록

- 디폴트 설정 파일 /WEB-INF/서블릿이름-servlet.xml으로 설정된다

  

  → 만약에 사용할 이름이 다르거나 설정파일이 여러 개인 경우

      contextConfigLocation 파라미터를 추가해서 설정해주면 된다

 

 

[예제] Spring MVC + mybatis + jQuery

 

http://localhost:8080/chapter06_SpringWebMaven/main/index

 

Project : chapter06_SpringWebMaven (

 

Package : main.controller

Class : IndexController.java

 

Package : user.controller

Class : UserController.java

 

Package : user.bean

class : UserDTO.java

 

Package : user.service

Interface : UserService.java

Class : UserServiceImpl.java

 

Package : user.dao

Interface : UserDAO.java

Class : UserDAOMybatis.java

         : userMapper.xml

 

File : index.jsp

 

Folder : user

File : writeForm.jsp

          write.jsp

 

Folder : js

File : user.js

 

src : mybatis-config.xml

 

스프링 설정 파일

/WEB-INF/dispatcherServlet-servlet.xml → /WEB-INF/spring/appServlet/servlet-context.xml

 

/WEB-INF/spring/root-context.xml

 

 

 

 

////////index.jsp

 

//-------------중략-------------------

<body>
<h1>*** 메인화면 ***</h1>
<hr>
<h3>
<p><a href="/chapter06_SpringWebMaven/user/writeForm">입력</a></p>
<p><a href="">출력</a></p>
<p><a href="">수정</a></p>
<p><a href="">삭제</a></p>
</h3>
</body>

웹 페이지의 시작 위치가 되는 index.jsp파일이다.

 

결과 화면을 먼저 보면 다음과 같다.

 

 

 

Bean 등록을 위해 xml파일을 먼저 설정해주려고 한다.

 

설정에 앞서 servlet-context.xml / root-context.xml / web.xml 의 차이에 대해 정리해보자.

 

우선, xml 파일은 모두 객체(Bean)을 정의한다.

 

1. servlet-context.xml - '요청'과 관련된 객체 정의

url과 관련된 controller, @어노테이션, ViewResolver, Interceptor, MultipartResolver 등의 설정을 해준다.

DispatcherServlet과 관련된 설정을 반드시 해야한다.

 

2. root-context.xml

servlet-context.xml과는 반대로 view와 관련되지 않은 객체를 정의한다.

Service / Repository(DAO) / DB 등 비즈니스 로직과 관련된 설정을 해준다.

 

 

3. web.xml - 설정파일

WAS 최초 구동 시의 설정을 정의한다.

여러 xml파일을 인식하도록 파일을 가리키는 역할을 한다.

 

 

 

////////web.xml

<!-- 
  	웹과는 독립된 WAC
  	/WEB-INF/applicationContext.xml 
  	-> 변경 /WEB-INF/spring/root-context.xml
  -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>/WEB-INF/spring/root-context.xml</param-value>
  </context-param>
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener> 
  
  <!-- 
	웹과 관련된 WAC
	/WEB-INF/dispatcherServlet-servlet.xml 
	-> 변경 /WEB-INF/spring/appServlet/servlet-context.xml로 변경한다. -->
	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 파일명이나 위치를 변경할 때 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>
				/WEB-INF/spring/appServlet/servlet-context.xml
			</param-value>
            
//------------------------중략--------------------------------

 

 

 

////////writeForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
div {
	color: red;
	font-size: 8pt;
	font-weight: bold;
}
</style>
</head>
<body>
	<form id="writeForm" method="post">
	<img alt="네오앤프로도" src="../image/neoNprodo.gif" width="80" height="80" 
	onclick="location.href='../index.jsp'" style="cursor: pointer;">

		<table border="1" cellspacing="0" cellpadding="5">
			<tr>
				<td width="50" align="center">이름</td>
				<td>
					<input type="text" name="name" id="name">
					<div id="nameDiv"></div>
				</td>
			</tr>

			<tr>
				<td width="50" align="center">아이디</td>
				<td>
					<input type="text" name="id" id="id">
					<div id="idDiv"></div>
				</td>
			</tr>
			
			<tr>
				<td width="80" align="center">비밀번호</td>
				<td>
					<input type="password" name="pwd" id="pwd">
					<div id="pwdDiv"></div>
				</td>
			</tr>

			<tr>
				<td colspan="2" align="center">
					<input type="button" value="회원가입" id="writeBtn">
					<input type="reset" value="다시작성">
				</td>
			</tr>
		</table>
	</form>
<script type="text/javascript" src="http://code.jquery.com/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../js/user.js"></script>
</body>
</html>

 

 

 

////////UserController.java

package user.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import user.service.UserService;

@Controller
public class UserController {
	private UserService userService;

	@RequestMapping(value = "/user/writeForm", method = RequestMethod.GET)
	public String writeForm() {
		return "/user/writeForm";
	}
	
	@RequestMapping(value = "/user/checkId", method = RequestMethod.POST)
	@ResponseBody
	public String checkId(@RequestParam String id) {
		
		return "exist"; // @ResponseBody를 쓰지 않게 되면 "exist"라는 jsp파일을 찾음 
		// 문자열이 들어올 수 있도록 @ResponseBody를 써줘야 한다
	}
}

 

 

 

////////servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="suffix" value=".jsp"></property>
	</bean>

	<context:component-scan base-package="user.controller" />

	<mvc:resources location="/js/" mapping="/js/**" />
	<mvc:resources location="/image/" mapping="/image/**" />

	<mvc:annotation-driven />
</beans>

 

 

 

구문을 하나하나 살펴보자!

 

 

<context:component-scan>

 

특정 패키지 내의 클래스를 스캔하고, Annotation(@Component @Controller @Service @Repository) 확인한 후

Bean인스턴스로 생성한다.

이를 이용하면 @Autowired@Qualifier Annotation을 인식할 수 있다.

context:component-scan을 선언했다면 context:annotation-config를 선언할 필요가 없다.

 

 

 

 

<mvc:resources>

Spring은 기본적으로 JSP 등 동적인 페이지와는 달리 HTML, CSS, JavaScript 등 정적인 리소스에 대한 접근을 막는다.

정적인 리소스를 서비스해야 한다면 dispatcher-servlet.xml에 <mvc:resources>를 추가함으로써 접근을 허용할 수 있다.

 

 

 

 

<mvc:annotation-driven>

 

 

index.jsp에서 '입력' 클릭 시 writeForm으로 화면 이동이 생기도록

<p><a href="/chapter06_SpringWebMaven/user/writeForm">입력</a></p>

다음과 같이 설정해두었다.

 

위 이미지와 같이 console창에 'No mapping for GET~ ' 이라는 메시지가 뜨면서 웹 화면에는 404 에러가 뜬다.

 

하지만 servlet-context.xml 파일에 <mvc:annotation-driven> 입력하였더니 화면 이동이 정상적으로 이루어진다.

그 기능에 대해 알아보자.

 

1. Spring Web MVC를 하기 위해 설정해야 하는 값들을 자동으로 추가해준다. 
2. Spring MVC가 @Controller에 요청을 보내기 위해 필요한 HandlerMappingHandlerAdapter를 bean으로 등록한다.
- HandlerMapping : HTTP 요청정보를 이용해서 컨트롤러를 찾아주는 기능 
- HandlerAdapter : HandlerMapping을 통해 찾은 컨트롤러를 직접 실행하는 기능을 수행 
3. bean을 생성하기 위해 xml 파일에 context:component-scan을 명시하면 이 태그를 포함하지 않아도 MVC 애플리케이션은 작동한다.

 

 

 

////////user.js

$('#writeBtn').click(function(){

});

// 중복체크
$('#id').focusout(function(){
	$('#idDiv').empty();
		if($('#id').val() == '')
			$('#idDiv').html('아이디 입력');
		else
			$.ajax({
				url : '/chapter06_SpringWebMaven/user/checkId',
				type : 'post',
				data : 'id=' + $('#id').val(), // = {'id' : $('#id').val()} / 'id='안에는 절대 공백이 들어가면 안된다
				dataType : 'text', //서버로 받을 타입 exist - 사용불가능, non-exist-사용가능
				success : function(data) {
					if(data == 'exist'){
						$('#idDiv').text('사용 불가능');
					}else if(data == 'non_exist'){
						$('#idDiv').text('사용 가능');
					}
				},
				error : function(err){
					console.log(err);
					}
		});
});

 

 

[결과]

 

728x90
반응형

'SPRING' 카테고리의 다른 글

[21.11.18]  (0) 2021.11.18
[21.11.17] (chapter06_1)  (0) 2021.11.17
[21.11.16] 스프링 MVC (chapter06)  (0) 2021.11.16
[21.11.11] (sample01 - chapter03_SpringMaven)  (0) 2021.11.11
[21.11.11] AOP 예제 (sample01 - chapter03)  (0) 2021.11.11