* ๋ฐ์ดํฐ ์๋น์ค ํด๋์ค(NoticeService) ์ค๋นํ๊ธฐ
๊ณต์ง์ฌํญ์ ๋ฐ์ดํฐ๋ฅผ ๋ฟ๋ ค์ฃผ๊ธฐ ์ํด Notice.java(entity), NoticeService.java ํ์ผ์ ์ค๋นํ์๋ค. (www.newlecture.com ์ฐธ๊ณ )
NOTICE ํ ์ด๋ธ
CREATE TABLE NOTICE
( ID NUMBER NOT NULL,
TITLE NVARCHAR2(100) NOT NULL,
WRITER_ID NVARCHAR2(50) NOT NULL,
CONTENT CLOB,
REGDATE TIMESTAMP (6) DEFAULT systimestamp NOT NULL,
HIT NUMBER DEFAULT 0 NOT NULL,
FILES NVARCHAR2(1000),
PUB NUMBER(1,0) DEFAULT 0 NOT NULL,
CONSTRAINT "NOTICE_PK" PRIMARY KEY ("ID")
)
Notice.java
public class Notice {
private int id;
private String title;
private String writerId;
private Date regDate;
private String content;
private int hit;
private String files;
//์ดํ ์์ฑ์, getter/setter ์๋ต
}
NoticeService.java
public class NoticeService {
private String url = "jdbc:oracle:thin:@.../...";
private String uid = "...";
private String pwd = "...";
private String driver = "oracle.jdbc.driver.OracleDriver";
public List<Notice> getList(int page, String field, String query) throws ClassNotFoundException, SQLException{
int start = 1 + (page-1)*10; // 1, 11, 21, 31, ..
int end = 10*page; // 10, 20, 30, 40...
String sql = "SELECT * FROM NOTICE WHERE "+field+" LIKE ? AND ID BETWEEN ? AND ?";
Class.forName(driver);
Connection con = DriverManager.getConnection(url,uid, pwd);
PreparedStatement st = con.prepareStatement(sql);
st.setString(1, "%"+query+"%");
st.setInt(2, start);
st.setInt(3, end);
ResultSet rs = st.executeQuery();
List<Notice> list = new ArrayList<Notice>();
while(rs.next()){
int id = rs.getInt("ID");
String title = rs.getString("TITLE");
String writerId = rs.getString("WRITER_ID");
Date regDate = rs.getDate("REGDATE");
String content = rs.getString("CONTENT");
int hit = rs.getInt("hit");
String files = rs.getString("FILES");
Notice notice = new Notice(
id,
title,
writerId,
regDate,
content,
hit,
files
);
list.add(notice);
}
rs.close();
st.close();
con.close();
return list;
}
// Scalar
public int getCount() throws ClassNotFoundException, SQLException {
int count = 0;
String sql = "SELECT COUNT(ID) COUNT FROM NOTICE";
Class.forName(driver);
Connection con = DriverManager.getConnection(url,uid, pwd);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql);
if(rs.next())
count = rs.getInt("COUNT");
rs.close();
st.close();
con.close();
return count;
}
public int insert(Notice notice) throws SQLException, ClassNotFoundException {
String title = notice.getTitle();
String writerId = notice.getWriterId();
String content = notice.getContent();
String files = notice.getFiles();
String url = "jdbc:oracle:thin:@localhost:1521/xepdb1";
String sql = "INSERT INTO notice ( " +
" title," +
" writer_id," +
" content," +
" files" +
") VALUES (?,?,?,?)";
Class.forName(driver);
Connection con = DriverManager.getConnection(url,uid, pwd);
//Statement st = con.createStatement();
//st.ex....(sql)
PreparedStatement st = con.prepareStatement(sql);
st.setString(1, title);
st.setString(2, writerId);
st.setString(3, content);
st.setString(4, files);
int result = st.executeUpdate();
st.close();
con.close();
return result;
}
public int update(Notice notice) throws SQLException, ClassNotFoundException {
String title = notice.getTitle();
String content = notice.getContent();
String files = notice.getFiles();
int id = notice.getId();
String url = "jdbc:oracle:thin:@localhost:1521/xepdb1";
String sql = "UPDATE NOTICE " +
"SET" +
" TITLE=?," +
" CONTENT=?," +
" FILES=?" +
"WHERE ID=?";
Class.forName(driver);
Connection con = DriverManager.getConnection(url,uid, pwd);
//Statement st = con.createStatement();
//st.ex....(sql)
PreparedStatement st = con.prepareStatement(sql);
st.setString(1, title);
st.setString(2, content);
st.setString(3, files);
st.setInt(4, id);
int result = st.executeUpdate();
st.close();
con.close();
return result;
}
public int delete(int id) throws ClassNotFoundException, SQLException {
String url = "jdbc:oracle:thin:@localhost:1521/xepdb1";
String sql = "DELETE NOTICE WHERE ID=?";
Class.forName(driver);
Connection con = DriverManager.getConnection(url,uid, pwd);
//Statement st = con.createStatement();
//st.ex....(sql)
PreparedStatement st = con.prepareStatement(sql);
st.setInt(1, id);
int result = st.executeUpdate();
st.close();
con.close();
return result;
}
}
ListController.java
public class ListController implements Controller{
private NoticeService noticeService;
public void setNoticeService(NoticeService noticeService) {
this.noticeService = noticeService;
}
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView("notice.list"); //tiles์์ '.'์ ์ฌ์ฉํ์ฌ url์ ์
๋ ฅํ๋ ์ด์ ๋, '/'๋ก ์ค์ ๋ ๋ทฐ ๋ฆฌ์กธ๋ฒ์ ์ถฉ๋ํ ์๋ ์๊ธฐ ๋๋ฌธ.
List<Notice> list = noticeService.getList(1, "TITLE", "");
mv.addObject("list", list); //model๋ก list ์ ๋ฌ
return mv;
}
}
์ปจํธ๋กค๋ฌ์์๋ NoticeService ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ๋ค์ list๋ผ๋ ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ด๋์ด์ผ ํ๋ค.
NoticeService ns = new NoticeService();์ฒ๋ผ new ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ์คํ๋ง์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ฏ๋ก Dispatcher-servlet์์ ๋น์ ์์ฑํ๋๋ก ํ๋ค.
NoticeService ๊ฐ์ฒด๋ฅผ ํ๋๋ก ๋ฐ๊ณ setter ํจ์๋ฅผ ์ถ๊ฐํ์๋๋ฐ, ์ด๋ ์๋ Dispatcher-servlet ์ฝ๋์์ property๋ก noticeService๋ฅผ ์ฃผ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
Dispatcher-servlet.xml
<bean id="/notice/list" class="com.newlecture.web.controller.notice.ListController">
<property name="noticeService" ref="noticeService" />
<!--
name="noticeService"์ ์๋ฏธ => setNoticeService๋ผ๋ ์ธํฐ
ref="noticeService"์ ์๋ฏธ => ์๋์ ์ ์ธํ ๋น ์ฐธ์กฐ
-->
</bean>
<bean id="noticeService" class="com.newlecture.web.service.NoticeService" />
/notice/list ๋น ํ๊ทธ์ property ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋ค. name="noticeService"๋ SetNoticeService๋ผ๋ ์ธํฐ๋ฅผ ํตํด ๊ฐ์ ์ฃผ์ ํ๊ฒ ๋ค๋ ๋ป์ด๋ฉฐ, ์ฐธ์กฐํ๋ ๋น์ ์๋ bean ํ๊ทธ๋ก ์์ฑํ noticeService ๊ฐ์ฒด์ด๋ค(ref="noticeService").
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<main class="main">
<h2 class="main title">๊ณต์ง์ฌํญ</h2>
<div class="breadcrumb">
<h3 class="hidden">๊ฒฝ๋ก</h3>
<ul>
<li>home</li>
<li>๊ณ ๊ฐ์ผํฐ</li>
<li>๊ณต์ง์ฌํญ</li>
</ul>
</div>
<div class="search-form margin-top first align-right">
<h3 class="hidden">๊ณต์ง์ฌํญ ๊ฒ์ํผ</h3>
<form class="table-form">
<fieldset>
<legend class="hidden">๊ณต์ง์ฌํญ ๊ฒ์ ํ๋</legend>
<label class="hidden">๊ฒ์๋ถ๋ฅ</label> <select name="f">
<option value="title">์ ๋ชฉ</option>
<option value="writerId">์์ฑ์</option>
</select> <label class="hidden">๊ฒ์์ด</label> <input type="text" name="q"
value="" /> <input class="btn btn-search" type="submit" value="๊ฒ์" />
</fieldset>
</form>
</div>
<div class="notice margin-top">
<h3 class="hidden">๊ณต์ง์ฌํญ ๋ชฉ๋ก</h3>
<table class="table">
<thead>
<tr>
<th class="w60">๋ฒํธ</th>
<th class="expand">์ ๋ชฉ</th>
<th class="w100">์์ฑ์</th>
<th class="w100">์์ฑ์ผ</th>
<th class="w60">์กฐํ์</th>
</tr>
</thead>
<tbody>
<c:forEach var="n" items="${list }">
<tr>
<td>${n.id }</td>
<!-- getId() -->
<td class="title indent text-align-left"><a href="detail"></a>${n.title }</td>
<td>${n.writerId }</td>
<td>${n.regDate }</td>
<td>${n.hit }</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<div class="indexer margin-top align-right">
<h3 class="hidden">ํ์ฌ ํ์ด์ง</h3>
<div>
<span class="text-orange text-strong">1</span> / 1 pages
</div>
</div>
<div class="margin-top align-center pager">
<div>
<span class="btn btn-prev" onclick="alert('์ด์ ํ์ด์ง๊ฐ ์์ต๋๋ค.');">์ด์ </span>
</div>
<ul class="-list- center">
<li><a class="-text- orange bold" href="?p=1&t=&q=">1</a></li>
</ul>
<div>
<span class="btn btn-next" onclick="alert('๋ค์ ํ์ด์ง๊ฐ ์์ต๋๋ค.');">๋ค์</span>
</div>
</div>
</main>
list.jsp ํ์ด์ง์ ์๋จ์ jstl ํ๊ทธ๋ฅผ ์ถ๊ฐํ๊ณ , jstl์ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ฟ๋ ค์ค๋ค. forEach ๋ฐ๋ณต๋ฌธ์ ํตํด ๊ฐ์ ธ์จ ${list }์์ ๊ฐ๊ฐ id, title, writerId, regDate, hit์ ๊ฐ์ ธ์จ๋ค. ${n.id }์ ์๋ฏธ๋, Notice ์ํฐํฐ ๊ฐ์ฒด์ getId() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค(ํ๋๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ ์๋๋ผ ๊ฒํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ).
* ์๋น์ค ๊ฐ์ฒด์ ๊ฒฐํฉ๋ ฅ ๋ฎ์ถ๊ธฐ
ํ์ฌ๋ JDBC๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง ์ดํ์ JPA ๋ฑ ๋ค๋ฅธ ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ๋ ์๋ ์๋ค. ์ ์ง๋ณด์์ ํธ๋ฆฌํจ์ ์ํด์๋ ๊ฒฐํฉ๋ ฅ์ ๋ฎ์ถ๋ ๊ฒ์ด ์ข๊ณ , ๋ฐ๋ผ์ ์๋น์ค ๊ฐ์ฒด์ ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํด ๋ณด๋๋ก ํ๋ค.
com.newlecture.web ํจํค์ง ์์ service ํจํค์ง์ jdbc ํจํค์ง๋ฅผ ์ถ๊ฐํ๊ณ , ๊ธฐ์กด์ NoticeService.java ํ์ผ์ ์ด๋ฆ์ JDBCNoticeService.java๋ก ์์ ํ๋ค. service ํจํค์ง์ NoticeService ์ธํฐํ์ด์ค๋ฅผ ์ถ๊ฐํ๋ค.
ํ์ฌ๋ jpa ์๋น์ค ๊ฐ์ฒด๊ฐ ์๋ ์ํ์ด์ง๋ง ์๋ฅผ ๋ค์ด ์ฐจํ์ ์์ ํ๊ฒ ๋ ๊ฒฝ์ฐ์๋ ์ฝ๋๊ฐ ์ด๋ฐ ์์ผ๋ก ๊ตฌ๋ถ๋ ๊ฒ์ด๋ค.
NoticeService.java
public interface NoticeService {
List<Notice> getList(int page, String field, String query) throws ClassNotFoundException, SQLException;
int getCount() throws ClassNotFoundException, SQLException;
int insert(Notice notice) throws SQLException, ClassNotFoundException;
int update(Notice notice) throws SQLException, ClassNotFoundException;
int delete(int id) throws ClassNotFoundException, SQLException;
}
dispatcher-servlet.xml
<bean id="/notice/list" class="com.newlecture.web.controller.notice.ListController">
<property name="noticeService" ref="noticeService" />
</bean>
<!-- ๊ตฌํ์ฒด๊ฐ ์๋๋ผ, ์ธํฐํ์ด์ค์ธ noticeService๋ก setting ํ๋ค.-->
<bean id="noticeService" class="com.newlecture.web.service.jdbc.JDBCNoticeService" />
<!--
<bean id="noticeService" class="com.newlecture.web.service.NoticeService" />
-->
ํ์ JDBCNoticeService๊ฐ JPANoticeService๋ก ์์ ๋๋ค๋ฉด class="com...." ๋ถ๋ถ๋ง ์์ ํ๋ฉด ๋๋ ๊ฐํธํ๋ค.
* DB ์ฐ๊ฒฐ์ ๋ณด ๋ถ๋ฆฌํ๊ธฐ
ํ์ฌ๋ JDBCNoticeService.java ํ์ผ์ DB ์ฐ๊ฒฐ์ ๋ณด(url, id, pwd, driver)๊ฐ ์ ์ฅ๋์ด ์๋ค. ํ์ง๋ง ์์ค ์ฝ๋๋ฅผ ๋ฐฐํฌํ ์ดํ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฐ๊พธ๋ ์ํฉ์ ๊ฐ์ ํด ๋ณด์. java ํ์ผ์ ์ ์ฅ๋ ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์, ๋จ์ํ ํ์ผ์์ ๋น๋ฐ๋ฒํธ๋ง ์ฐพ์์ ๋ณ๊ฒฝํ ์ ์๊ณ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ปดํ์ผ์ ๋ค์ ํด์ผ ํ๋ ๋ถํธํจ์ด ์๋ค. ๋ฐ๋ผ์ ์ฐ๊ฒฐ์ ๋ณด๋ฅผ xml ํ์ผ๋ก ๋ถ๋ฆฌํ๋ค.
JDBCNoticeService.java
public class JDBCNoticeService implements NoticeService{
// private String url = "jdbc:oracle:thin:@...";
// private String uid = "...";
// private String pwd = "...";
// private String driver = "oracle.jdbc.driver.OracleDriver";
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public List<Notice> getList(int page, String field, String query) throws ClassNotFoundException, SQLException{
int start = 1 + (page-1)*10; // 1, 11, 21, 31, ..
int end = 10*page; // 10, 20, 30, 40...
String sql = "SELECT * FROM NOTICE WHERE "+field+" LIKE ? AND ID BETWEEN ? AND ?";
//Class.forName(driver);
//Connection con = DriverManager.getConnection(url,uid, pwd);
Connection con = dataSource.getConnection();
PreparedStatement st = con.prepareStatement(sql);
st.setString(1, "%"+query+"%");
st.setInt(2, start);
st.setInt(3, end);
ResultSet rs = st.executeQuery();
List<Notice> list = new ArrayList<Notice>();
while(rs.next()){
int id = rs.getInt("ID");
String title = rs.getString("TITLE");
String writerId = rs.getString("WRITER_ID");
Date regDate = rs.getDate("REGDATE");
String content = rs.getString("CONTENT");
int hit = rs.getInt("hit");
String files = rs.getString("FILES");
Notice notice = new Notice(
id,
title,
writerId,
regDate,
content,
hit,
files
);
list.add(notice);
}
rs.close();
st.close();
con.close();
return list;
}
//์ดํ ์๋ต
}
๊ธฐ์กด์ ํ๋๋ก ์ ์ธ๋์ด ์ฌ์ฉํ๋ url, uid, pwd, driver๋ฅผ ์ฃผ์์ฒ๋ฆฌ ํ๊ณ , DataSource๋ฅผ ์ด์ฉํ์ฌ Connection ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ๊ทธ๋ฆฌ๊ณ DataSource๋ฅผ ์ฃผ์ ํ๋ฌ ๊ฐ๋ค.
dispatcher-servlet.xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@..." />
<property name="username" value="..." />
<property name="password" value="..." />
</bean>
์ด์ DB ์ฐ๊ฒฐ์ ๋ณด์ ๋ณ๊ฒฝ์ด ์๊ฒผ์ ์ java ์์ค ์ฝ๋๋ฅผ ์์ ํ ํ์์์ด xml ํ์ผ๋ง ์์ ํ๋ฉด ๋๋ค.
* Spring ์ค์ ํ์ผ ๋ถ๋ฆฌํ๊ธฐ
ํ์ฌ ์คํ๋ง ์ค์ ํ์ผ์ webapp\WEB-INF\dispatcher-servlet.xml ์ด๋ค. ์คํ๋ง ์ค์ ํ์ผ์ ์ํ๋ ์์น์ ์ํ๋ ํ์ผ๋ช ์ผ๋ก ๋ง๋ค ์ ์๋ค. dispatcher-servlet.xml ํ๋๋ก ๊ด๋ฆฌ๋๋ ์คํ๋ง ์ค์ ์ security-context(๋ณด์ ๊ด๋ จ ์ค์ ), service-context(์๋น์ค ๊ด๋ จ ์ค์ ), servlet-context(์ ์ถ๋ ฅ ๊ด๋ จ ์ค์ ) ๋ฑ ์ฌ๋ฌ ๊ฐ๋ก ๋๋์ด ๋ณด๋๋ก ํ๊ฒ ๋ค. ์ฌ๋ฌ ๊ฐ์ ์ค์ ๋ค์ ์น ๋ฃจํธ ์ spring ํด๋์ ์์นํ๊ฒ ํ๋ค.
์ฌ๋ฌ ์ฌ๋์ด ํจ๊ป ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ค ๋ณด๋ฉด ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ญํ ์ ๊ฐ์ง๊ฒ ๋ ์ ์๋ค. ๋ณด์ ๊ด๋ จ ์ค์ , ์๋ธ๋ฆฟ ๊ด๋ จ ์ค์ ๋ฑ ์ค์ ์ญ์ ์ฌ๋ฌ ์ฌ๋์ด ํ๊ฒ ๋ ์ ์๋ค. ํ๋์ ํ์ผ์์ ์คํ๋ง ์ค์ ์ ํ๋ค๋ฉด ์ฌ๋ฌ ์ฌ๋์ด ๊ฑฐ๋ญํด์ ์์ ํ์ ๋ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์์ผ๋ฏ๋ก ๊ทธ ๋ด์ฉ์ ๋ฐ๋ผ ํ์ผ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค. ์ค๋ น ํผ์ ๋ง๋๋ ํ๋ก์ ํธ๋ผ๊ณ ํ๋๋ผ๋ ๋ถ๋ฆฌํด ๋๋ ๊ฒ์ด ๊ฐ๋ฐ, ๊ด๋ฆฌ์ ์ฉ์ดํ ๊ฒ์ด๋ค.
service-context.xml
<bean id="noticeService" class="com.newlecture.web.service.jdbc.JDBCNoticeService">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@14.35.198.58:1522/orcl" />
<property name="username" value="USER01" />
<property name="password" value="1111" />
</bean>
servlet-context.xml
<bean id="/index" class="com.newlecture.web.controller.IndexController" />
<bean id="/notice/list" class="com.newlecture.web.controller.notice.ListController">
<property name="noticeService" ref="noticeService" />
</bean>
<bean id="/notice/detail" class="com.newlecture.web.controller.notice.DetailController" />
<!-- Tiles ViewResolver -->
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />
<property name="order" value="1" />
</bean>
<bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions" value="/WEB-INF/tiles.xml" />
</bean>
<!-- View Resolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
<property name="order" value="2" />
</bean>
<mvc:resources location="/static/" mapping="/**"></mvc:resources>
๋ณด์ ๊ด๋ จํ ์ค์ ์ ์์ง ์์ผ๋ฏ๋ก security-context.xml์ ๋ด์ฉ์ ์๋ค.
์ด์ ์ด์ ์ dispatcher-servlet ํ์ผ์ ์ค์ ํ์ผ๋ก์์ ์ญํ ์ ํ์ง ์์ผ๋ฏ๋ก ํ์ฅ์๋ฅผ ๋ฐ๊ฟ์ค๋ค. (dispatcher-servlet.backup์ผ๋ก ๋ณ๊ฒฝ)
web.xml
<!-- ๋ฆฌ์ค๋ : ํฐ์บฃ์ด ์์, ์ข
๋ฃ๋ ๋ ํ์๋ฅผ ํ ์ ์๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/service-context.xml
/WEB-INF/spring/security-context.xml
</param-value>
</context-param>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet> ํ๊ทธ ์์ <init-param> ํ๊ทธ๋ฅผ ์ด๊ณ <param-value>์์ servlet-context.xml์ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ค. ์ด ํ๊ทธ๊ฐ ์๋ค๋ฉด ๊ธฐ๋ณธ ์ค์ ์ธ /WEB-INF/dispatcher-servlet.xml์ ์ฝ์ ๊ฒ์ด๋ค.
๋๋จธ์ง ์ค์ ํ์ผ๋ ์ถ๊ฐํ๊ธฐ ์ํด์ <listener>, <context-param>์ ์ถ๊ฐํ๋ค.
<servlet> ์ค์ ์ ์๋ธ๋ฆฟ์ ์ฒซ ์์ฒญ์ด ๋ค์ด์์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๊ฒ ๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ์ฒซ ์์ฒญ์ ์๋๊ฐ ๋๋ ค์ง๊ฒ ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ค์ ์ ์ฒซ ์์ฒญ์ด ์ค๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ด ์ข๋ค. <load-on-startup>์ ํฐ์บฃ์ด ๋ก๋๋์์ ๋ ์ด ์ค์ ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๊ฒ ํ๋ค๋ ๋ป์ด๊ณ , 1์ด๋ผ๋ ์ฐ์ ์์๋ฅผ ๋์๋ค. <async-supported>๋ฅผ ํตํด ๋น๋๊ธฐ ์คํ์ด ๊ฐ๋ฅํ๊ฒ ํ์๋ค.
๋ด๋ ์ฒ ์คํ๋ง ํ๋ ์์ํฌ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๊ฒ์๊ธ์ ๋๋ค.
'๐ปStudy > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ด๋ ธํ ์ด์ ์ผ๋ก ์๋น์ค ๊ฐ์ฒด ์์ฑํ๊ธฐ(@Service) / ์ปจํธ๋กค๋ฌ ์ ๋ฆฌํ๊ธฐ (@Controller) (0) | 2021.03.03 |
---|---|
๊ฐ์ฒด DI๋ฅผ ์ด๋ ธํ ์ด์ ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ (0) | 2021.03.02 |
์ ์ ํ์ผ ๋งคํ / Tiles์ TilesResolver (0) | 2021.02.26 |
Spring MVC ๊ฐ๋ฐํ๊ฒฝ ์ธํ / Dispatcher Servlet / View Resolver (0) | 2021.02.20 |
Spring MVC (0) | 2021.02.14 |