๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ปStudy/Spring

๋ฐ์ดํ„ฐ ์„œ๋น„์Šค ํด๋ž˜์Šค ์ถ”๊ฐ€ / ์„œ๋น„์Šค ๊ฒฐํ•ฉ๋ ฅ ๋‚ฎ์ถ”๊ธฐ / DB ์—ฐ๊ฒฐ์ •๋ณด ๋ถ„๋ฆฌ / Spring ์„ค์ • ๋ถ„๋ฆฌ

* ๋ฐ์ดํ„ฐ ์„œ๋น„์Šค ํด๋ž˜์Šค(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>๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์˜€๋‹ค.

 


๋‰ด๋ ‰์ฒ˜ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ •๋ฆฌํ•œ ๊ฒŒ์‹œ๊ธ€์ž…๋‹ˆ๋‹ค.

www.youtube.com/user/newlec1