본문 바로가기
study/Javascript

[Javascript] 29. Websocket 채팅하기 (springmvc2/pom.xml, chat.jsp, EchoHandler.java, BoardMapper.java, kiclayout.jsp, ChatController.java, spring-mvc.xml)

by 금이패런츠 2022. 6. 7.
728x90
반응형

springmvc2/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>kr.kic</groupId>
  <artifactId>springmvc2</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>springmvc2 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
  <properties>
  	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  	<spring.version>4.3.30.RELEASE</spring.version>
  	<spring.version1>5.3.18</spring.version1>
  	<spring.version2>5.2.19.RELEASE</spring.version2>
  	<spring.version3>4.3.30.RELEASE</spring.version3>
  </properties>
  
  <!-- 원격 저장소 설정 : mvnrepository.com : 기본 원격 저장소 이외의 저장소 사용시 설정 -->
  <repositories>
	<repository>
		<id>oracle</id>
		<name>ORACLE JDBC Repository</name>
		<url>http://maven.jahia.org/maven2</url>
	</repository> 
  </repositories>
  
  <dependencies>
  
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-context</artifactId>
	    <version>${spring.version}</version>
	</dependency>
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-web</artifactId>
	    <version>${spring.version}</version>
	</dependency>
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-webmvc</artifactId>
	    <version>${spring.version}</version>
	</dependency>
	
	<!-- spring websocket을 위한 설정 -->
	<dependency>
	    <groupId>org.springframework</groupId>
		<artifactId>spring-websocket</artifactId>
	    <version>${spring.version}</version>
	</dependency>
	
	
	<!-- spring db 설정 -->
	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-jdbc</artifactId>
	    <version>${spring.version}</version>
	</dependency>
	
	<!-- 오라클 관련 설정 -->
	<dependency>
		<groupId>com.oracle</groupId>
	    <artifactId>ojdbc5</artifactId>
	    <version>11.2.0.2.0</version>
	</dependency>
	
	<!-- jstl 설정 -->
	<dependency>
		<groupId>jstl</groupId>
	    <artifactId>jstl</artifactId>
	    <version>1.2</version>
	</dependency>

	<!-- 유효성 검증 설정 -->
	<dependency>
		<groupId>javax.validation</groupId>
	    <artifactId>validation-api</artifactId>
	    <version>2.0.1.Final</version>
	</dependency>
	<dependency>
		<groupId>org.hibernate</groupId>
	    <artifactId>hibernate-validator</artifactId>
	    <version>6.1.0.Final</version>
	</dependency>
	
	<!-- 파일 업로드 설정 -->
	<dependency>
		<groupId>commons-fileupload</groupId>
	    <artifactId>commons-fileupload</artifactId>
	    <version>1.3.3</version>
	</dependency>
	<dependency>
		<groupId>commons-beanutils</groupId>
	    <artifactId>commons-beanutils</artifactId>
	    <version>1.9.3</version>
	</dependency>
	<dependency>
		<groupId>commons-digester</groupId>
	    <artifactId>commons-digester</artifactId>
	    <version>2.1</version>
	</dependency>
	
	<!-- AOP 설정 -->
	<dependency>
		<groupId>org.aspectj</groupId>
	    <artifactId>aspectjweaver</artifactId>
	    <version>1.9.6</version>
	</dependency>
	
	<!-- sitemesh 설정 -->
	<!-- http://mvnrepository.com/artifact/org.sitemesh/sitemesh -->
	<dependency>
		<groupId>org.sitemesh</groupId>
	    <artifactId>sitemesh</artifactId>
	    <version>3.0.1</version>
	</dependency>
	
	<!-- Connection Pool 관련 설정 -->
	<!-- spring-db.xml에 Connection 관련 설정-->
	<dependency>
		<groupId>com.mchange</groupId>
	    <artifactId>c3p0</artifactId>
	    <version>0.9.5.3</version>
	</dependency>
	
	<!-- MyBatis 관련 설정-->
	<!-- http://mvnrepository.com/artifact/org.mybatis/mybatis -->
	<dependency>
		<groupId>org.mybatis</groupId>
	    <artifactId>mybatis</artifactId>
	    <version>3.4.6</version>
	</dependency>
	
	<!-- http://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
	<dependency>
		<groupId>org.mybatis</groupId>
	    <artifactId>mybatis-spring</artifactId>
	    <version>1.3.2</version>
	</dependency>
	
	<!-- jsoup 설정 -->
	<dependency>
		<groupId>org.jsoup</groupId>
	    <artifactId>jsoup</artifactId>
	    <version>1.11.3</version>
	</dependency>
	
	<!-- json 설정-->
	<!-- http://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
	<dependency>
    	<groupId>com.googlecode.json-simple</groupId>
    	<artifactId>json-simple</artifactId>
    	<version>1.1.1</version>
	</dependency>

	<!-- 
		@ResponseBody에서 Collection 객체를 직접 브라우저에 전달하기 위한 설정
		List 객체 : Array 객체
		Map 객체  : Json형태 객체
	-->
	<dependency>
    	<groupId>com.fasterxml.jackson.core</groupId>
    	<artifactId>jackson-core</artifactId>
    	<version>2.10.2</version>
	</dependency>
	
	<!-- http://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
	<dependency>
  	 	<groupId>com.fasterxml.jackson.core</groupId>
    	<artifactId>jackson-databind</artifactId>
   		<version>2.10.2</version>
	</dependency>

  </dependencies>
  
  <build>
    <finalName>springmvc2</finalName>
    <!-- pom.xml의 첫번째 줄에 maven-war-plugin관련 오류 발생시 코딩 -->
    <plugins>
    	<plugin>
    		<artifactId>maven-war-plugin</artifactId>
    		<version>3.2.2</version>
    	</plugin>
    </plugins>
  </build>
</project>

chat.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- /springmvc2/src/main/webapp/WEB-INF/view/chat/chat.jsp : 채팅화면 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<title>Websocket client</title>
<%-- http://localhost:8088/springmvc2/chat/chat --%>
<%-- 요청 URL의 포트번호 : 8088 --%>
<c:set var="port" value="${pageContext.request.localPort}" />
<%-- 요청 URL의 ip주소 : localhost --%>
<c:set var="server" value="${pageContext.request.serverName}" />
<%-- 프로젝트이름. 웹컨텍스트 이름 --%>
<c:set var="path" value="${pageContext.request.contextPath}" />
<script>
	$(function() {
		//ws : websocket의 약자. 프로토콜 이름
		// ws://localhost:8088/springmvc2/chatting 요청
		let ws = new WebSocket ("ws://${server}:${port}${path}/chatting"); //접속요청
		ws.onopen = function() { //접속완료
			$("#chatStatus").text("info:connection opened")
			//keydown : key 이벤트 처리. 리스너 등록
			$("input[name=chatInput]").on("keydown", function(evt) {
				//evt : key이벤트객체
				if(evt.keyCode == 13) { //enter키가 눌려진 경우
					var msg = $("input[name=chatInput]").val();
					ws.send(msg); //서버에 데이터 전송
					$("input[name=chatInput]").val(""); //입력된 내용을 지우기.
				}
			})
		}
		//서버로부터 메세지 수신
		ws.onmessage = function(event) {
			//prepend : 첫줄에 추가
			//append : 마지막줄에 추가
			//event.data : 서버에서 전송한 메세지 내용
			$("textarea").eq(0).prepend(event.data + "\n");
		}
		//서버와 전송이 끝난 경우.
		ws.onclose = function(event) {
			$("chatStatus").text("info:connection clise");
		}
	})
</script>
</head>
<body>
<p>
	<div id="chatStatus"></div>
	<textarea name="chatMsg" rows="15" cols="40"></textarea><br>
	메세지 입력 : <input type="text" name="chatInput">
</body>
</html>

EchoHandler.java

package websocket;

import java.util.HashSet;
import java.util.Set;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

@Component //echoHandler 이름으로 객체화
public class EchoHandler extends TextWebSocketHandler implements InitializingBean {
	private Set<WebSocketSession> clients = new HashSet<WebSocketSession>();
	@Override //클라이언트와 연결완료시 호출되는 메서드
	//session : 웹소켓으로부터 연결된 객체. 클라이언트와 연결된 객체.
	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
		super.afterConnectionEstablished(session); //현재 핸들러 객체와 연결. 클라이언트 객체 한개.
		System.out.println("클라이언트 접속 : " + session.getId());
		clients.add(session); //클라이언트 객체를 Set에 추가
	}
	//클라이언트에서 메세지 수신된 경우 호출되는 메서드
	@Override
	public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
		String loadMessage = (String)message.getPayload(); //수신된 메세지의 내용
		System.out.println(session.getId() + ":클라이언트 메세지:" + loadMessage);
		clients.add(session); //clients 객체에 추가
		
		for(WebSocketSession s : clients) {
			s.sendMessage(new TextMessage(loadMessage)); //클라이언트로 메세지 전송
		}
	}
	@Override
	//클라이언트에 전송시 오류 발생된 경우 호출되는 메서드
	public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
		super.handleTransportError(session, exception);
		System.out.println("오류발생 : " + exception.getMessage());
	}
	@Override
	public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
		super.afterConnectionClosed(session, status);
		System.out.println("클라이언트 접속 해제 : " + status.getReason());
		clients.add(session);
	}
	@Override
	public void afterPropertiesSet() throws Exception { }
}

BoardMapper.java

package dao.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import logic.Board;

public interface BoardMapper {

	@Select("select count(*) from board where boardid=#{boardid}")
	int count(String boardid);
	
	@Select("select * from "
				+ "(select rownum rnum, num, writer, subject, content, file1 fileurl, regdate, "
				+ " grp, grplevel, grpstep, pass, readcnt from "
				+ "(select * from board where boardid =#{boardid} order by grp desc, grpstep asc))"
				+ " where rnum >= #{startrow} and rnum <= #{endrow}")
	List<Board> list(Map<String, Object> param);

	@Insert("insert into board "
			+ "(num, writer, pass, subject, content, file1, boardid, regdate, readcnt, grp, grplevel, grpstep, ip)"
			+ "values " 
			+ "(#{num}, #{writer}, #{pass}, #{subject}, #{content}, #{fileurl}, #{boardid}, sysdate, 0, #{grp}, #{grplevel}, #{grpstep}, #{ip})")
	void write(Board board);

	@Select("select nvl(max(num),0) from board")
	int maxNum(Map<String, Object> param);

	@Select("select num, writer, subject, content, file1 as fileurl, regdate, "
			+ " grp, grplevel, grpstep, pass, readcnt, boardid from board where num=#{num}")
	Board selectOne(Map<String, Object> param);

	
	@Update("update board set readcnt = readcnt + 1 where num=#{num}")
	void readcntadd(Integer num);

	@Update("update board set writer=#{writer}, subject=#{subject}, content=#{content}, "
	+ " file1=#{fileurl} where num=#{num}")
	void update(Board board);

	@Update("update board set grpstep = grpstep+1 "
			+ " where grp=#{grp} and grpstep >#{grpstep}")
	void grpStepAdd(Board board);

	@Insert("insert into board "
			+ " (num, writer, pass, subject, content, file1, boardid, regdate, readcnt, grp, grplevel, grpstep, ip)"
			+ " values " 
			+ " (#{num}, #{writer}, #{pass}, #{subject}, #{content}, #{fileurl}, #{boardid}, sysdate, 0, #{grp}, #{grplevel}, #{grpstep}, #{ip})")
	void reply(Board board);

	@Delete("delete from board where num=#{num}")
	void delete(int num);
	
	@Select("select num, writer, subject, readcnt from board where boardid=#{value}")
	List<Map<String, Object>> boardlist(String boardid);
}

kiclayout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="path" value="${pageContext.request.contextPath }" />               
<!DOCTYPE html>
<html>
<head>
<title><sitemesh:write property='title'/>
</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Raleway">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="${path}/css/main.css">
<style>
html,body,h1,h2,h3,h4,h5 {font-family: "Raleway", sans-serif}
#footer {position: fixed; bottom: 50px;}
</style>
<script type="text/javascript"
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
	
<%-- 글작성시 다양한 형태 사용 가능 --%>
<script type="text/javascript" 
   src="http://cdn.ckeditor.com/4.5.7/standard/ckeditor.js"></script>
	
<sitemesh:write property='head'/>
</head>
<body class="w3-light-grey">

<!-- Top container -->
<div class="w3-bar w3-top w3-black w3-large" style="z-index:4">
  <button class="w3-bar-item w3-button w3-hide-large w3-hover-none w3-hover-text-light-grey" onclick="w3_open();"><i class="fa fa-bars"></i> &nbsp;Menu</button>
  <span class="w3-bar-item w3-right">
    <c:if test="${empty sessionScope.loginUser}">
       <a href="${path}/user/login">로그인</a>
       <a href="${path}/user/userEntry">회원가입</a>
	</c:if>  
    <c:if test="${!empty sessionScope.loginUser}">
        ${sessionScope.loginUser.username}님이 로그인 하셨습니다. &nbsp;&nbsp;
       <a href="${path}/user/logout">로그아웃</a>
	</c:if>  
  </span>
</div>

<!-- Sidebar/menu -->
<nav class="w3-sidebar w3-collapse w3-white w3-animate-left" style="z-index:3;width:200px;" id="mySidebar"><br>
  <div class="w3-container w3-row">
  <img src="${path}/image/logo.png"
      class="w3-circle w3-margin-right" 
      style="width:100px;">
  <div class="w3-row">&nbsp;</div>
  <div class="w3-row">
      <c:if test="${!empty sessionScope.loginUser}">
      <span>반갑습니다. <strong>${sessionScope.loginUser.username }님</strong></span>
      </c:if>
      <c:if test="${empty sessionScope.loginUser}">
      <span><strong>로그인하세요</strong></span>
      </c:if>
      <br>
    </div>
  </div>
  <hr>
  <div class="w3-bar-block">
    <a href="#" class="w3-bar-item w3-button w3-padding-16 w3-hide-large w3-dark-grey w3-hover-black" onclick="w3_close()" title="close menu"><i class="fa fa-remove fa-fw"></i>&nbsp; Close Menu</a>
    <a href="${path}/user/mypage?id=${loginUser.userid}" class="w3-bar-item w3-button w3-padding"><i class="fa fa-eye fa-fw"></i>&nbsp; 회원관리</a>
    <a href="${path}/item/list" class="w3-bar-item w3-button w3-padding"><i class="fa fa-eye fa-fw"></i>&nbsp; 상품관리</a>
    <hr>
    <a href="${path}/board/list?boardid=1" class="w3-bar-item w3-button w3-padding"><i class="fa fa-users fa-fw"></i>&nbsp;공지사항</a>
    <a href="${path}/board/list?boardid=2" class="w3-bar-item w3-button w3-padding"><i class="fa fa-users fa-fw"></i>&nbsp;자유게시판</a>
    <a href="${path}/board/list?boardid=3" class="w3-bar-item w3-button w3-padding"><i class="fa fa-users fa-fw"></i>&nbsp;QNA</a>
    <hr>
    <a href="${path}/chat/chat" class="w3-bar-item w3-button w3-padding">
    	<i class="fa fa-bullseye fa-fw"></i>&nbsp; 채팅
    </a>
  </div>
<br><br>
<div class="w3-container">
	<div id="exchange1"></div> <%-- ajax을 통해 얻은 수출입은행 환율 정보 내용 출력 --%>
</div>  
<br>
<div class="w3-container">
	<div id="exchange2"></div> <%-- ajax을 통해 얻은 KEB하나은행 환율 정보 내용 출력 --%>
	<br>
</div>  <br>  
<br>
<br>
</nav>
<div class="w3-overlay w3-hide-large w3-animate-opacity" onclick="w3_close()" style="cursor:pointer" title="close side menu" id="myOverlay"></div>
<!-- !PAGE CONTENT! -->
<div class="w3-main" 
  style="margin-left:200px;margin-top:43px; margin-right: 20px;">
  <div class="w3-row-padding w3-margin-bottom">
  <div class="w3-container w3-light-grey w3-padding-32">
    <div class="w3-row">
      <div class="w3-container w3-col" style="width:95%;">
        <sitemesh:write property='body'/>
      </div>
      <div class="w3-container w3-col" style="width:5%;">
        <p>&nbsp;</p>
      </div>
    </div>
  </div>
  </div>
  <!-- End page content -->
</div>
<br>

<%-- 시군구 선택 --%>
<div style="margin-left:200px;">
	<span id="si">
		<select name="si" onchange="getText('si')">
			<option value="">시도를 선택하세요.</option>
		</select>
	</span>
	<span id="gu">
		<select name="gu" onchange="getText('gu')">
			<option value="">구군를 선택하세요.</option>
		</select>
	</span>
	<span id="dong">
		<select name="dong" onchange="getText('dong')">
			<option value="">동리를 선택하세요.</option>
		</select>
	</span>
</div>

<script>
// Get the Sidebar
var mySidebar = document.getElementById("mySidebar");

// Get the DIV with overlay effect
var overlayBg = document.getElementById("myOverlay");

// Toggle between showing and hiding the sidebar, and add overlay effect
function w3_open() {
  if (mySidebar.style.display === 'block') {
    mySidebar.style.display = 'none';
    overlayBg.style.display = "none";
  } else {
    mySidebar.style.display = 'block';
    overlayBg.style.display = "block";
  }
}

// Close the sidebar with the close button
function w3_close() {
  mySidebar.style.display = "none";
  overlayBg.style.display = "none";
}

$(function() {
	exchangeRate1(); //수출입은행 환율정보
	exchangeRate2(); //KEB하나은행 환율정보
///////////////////////////////////////	
	let divid;
	let si;
	$.ajax({
		url : "${path}/ajax/select",
		success : function(data) {
//			console.log(data)
			let arr = data.substring(data.indexOf('[') + 1, data.indexOf(']')).split(",");
			$.each(arr,function(i, item) {
				$("select[name='si']").append(function() {
					return "<option>" + item + "</option>"
				})
			});
		}
	})
})

function getText(name) {
		let cityval = $("select[name='si']").val();
		let guval = $("select[name='gu']").val();
		let disname;
		let toptext="구군을 선택하세요.";
		let params = "";
		if (name =="si") {
			params = "si=" + cityval.trim();
			disname = "gu"; //결과값이 출력 될 영역
		} else if (name == "gu") {
			// si = 서울특별수 & gu = 강남구
			params = "si=" + cityval.trim() + "&gu=" + guval.trim();
			disname = "dong";
			toptext = "동리를 선택하세요."
		} else {
			return;
		}
		$.ajax({
			url : "${path}/ajax/select",
			type : "POST",
			data : params,
			success : function(data) {
				let arr = data.substring(data.indexOf('[')+1,data.indexOf(']')).split(",");
				let selhtml = "<select name='" + disname + "' onchange='getText(\"" + disname + "\")'>";
				selhtml += "<option value=''>" + toptext + "</option>"
				$.each(arr,function(i,item){
					selhtml += "<option>" + item + "</option>"
				});
				selhtml += "</select>";
				$("#" + disname).html(selhtml);
			}
		})
	}
function exchangeRate1() {
	$.ajax("${path}/ajax/exchange1",{
		success : function(json) {
			console.log(json)
			let html = "<table class='nopadding'>"
			html += "<caption>수출입은행<br>" + json.date + "</caption>"
			html += "<tr><th>통화</th><th>기준율</th><th>받을때</th><th>파실때</th></tr>";
			$.each(json.list, function(i, obj) {
				html += "<tr><td>" + obj[0] + "<br>" + obj[1] + "</td>" 
				html += "<td>" + obj[2] + "</td>" 
				html += "<td>" + obj[3] + "</td>" 
				html += "<td>" + obj[4] + "</td></tr>" 
			})
			$("#exchange1").html(html + "</table>");
		},
		error : function(e) {
			alert("환율 조회시 서버 오류 :" + e.status)
		}
	})
}
</script>
</body></html>

ChatController.java

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("chat")
public class ChatContoller {
	@RequestMapping("*")
	public String chat() {
		return null;
	}
}

spring-mvc.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!-- /src/main/resources/spring-mvc.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xmlns:websocket="http://www.springframework.org/schema/websocket"
  xsi:schemaLocation="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.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop.xsd
   http://www.springframework.org/schema/mvc
   http://www.springframework.org/schema/mvc/spring-mvc.xsd
   http://www.springframework.org/schema/websocket
   http://www.springframework.org/schema/websocket/spring-websocket-4.1.xsd">
   
<mvc:default-servlet-handler /> <!-- css, js, html 웹에서 제공되는 파일의 기본 기능 -->
<!-- 
	http://localhost:8088/springmvc1/item/list
	  => ItemController 클래스를 선택
 -->
<bean class=
"org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

<!-- controller,logic,dao 패키지를 먼저 scan해서 @Component를 가진 클래스의 객체 생성 -->
<context:component-scan base-package="controller,logic,dao,aop,websocket" />

<!-- web 환경에서 객체 주입을 위한 설정 : @Autowired, @Controller... 기능 사용 -->
<mvc:annotation-driven />

<!-- AOP 기능 수행 -->
<aop:aspectj-autoproxy />

<!-- 뷰결정자 : jsp 페이지의 위치 지정 -->
<bean id="viewResolver"
     class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass">
     <value>org.springframework.web.servlet.view.JstlView</value>
  </property>
  <!-- /WEB-INF/view/item/list.jsp : 뷰 지정 -->
  <property name="prefix"><value>/WEB-INF/view/</value></property>
  <property name="suffix"><value>.jsp</value></property>
</bean>  
<!-- 
	파일 업로드 설정 : enctype="multipart/form-data"형식의 요청이 들어오면 구동. 
	maxUploadSize   : 100M. 최대 업로드 가능 크기
	maxInMemorySize : 10M. 10M까지는 메모리에 파일의 내용 저장
--> 
<bean id="multipartResolver" 
	  class="org.springframework.web.multipart.commons.CommonsMultipartResolver" 
	  p:maxUploadSize="104854600" p:maxInMemorySize="10485460">
</bean>
<!-- 
	message 코드값을 저장한 properties 파일을 설정 : message.properties
	message 처리를 위한 설정 
-->
<bean id="messageSource"
	  class="org.springframework.context.support.ResourceBundleMessageSource">
	  <property name="basenames">
	  	<list><value>messages</value></list>
	  </property>
</bean>
<!-- 예외처리 -->
 <bean id="exceptionHandler" 
 	   class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
 	   <property name="exceptionMappings">
 	   		<value>exception.LoginException=exception
 	   			   exception.CartException=exception
 	   			   exception.BoardException=exception</value>
 	   </property>
 </bean>
 <!-- 인터셉터 기능 설정 : 특정 url들은 BoardInterceptor를 태운다.-->
 <mvc:interceptors>
 	<mvc:interceptor>
 		<mvc:mapping path="/board/write"/> <!-- 요청 URL 정보 -->
 		<mvc:mapping path="/board/update"/> <!-- 요청 URL 정보 -->
 		<mvc:mapping path="/board/delete"/> <!-- 요청 URL 정보 -->
 		<mvc:mapping path="/board/reply"/> <!-- 요청 URL 정보 -->
 		<bean class="interceptor.BoardInterceptor" /> <!-- 인터셉터 클래스 객체 -->
 	</mvc:interceptor>
 </mvc:interceptors>
 
 <!-- websocket 관련 설정 -->
 <websocket:handlers>
 <!-- /chatting 요청시 echoHandler 객체로 사용 -->
 	<websocket:mapping handler="echoHandler" path="/chatting"/>
 </websocket:handlers>
 
</beans>
728x90
반응형