Spring @RestController ๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ ๊ฒŒ์‹œํŒ, ํŽ˜์ด์ง•

2021. 12. 6. 16:42ใ†Spring

728x90

1. REST(REpresentational State Transfer)

: ํŠน์ • URI๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณต๋ฐ›๋Š” ํ˜•์‹์ด๋‹ค. 

์ด๋ ‡๊ฒŒ REST ๋ฐฉ์‹์œผ๋กœ ์„œ๋น„์Šค์ œ๊ณต์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ RESTful ํ•˜๋‹ค๋ผ๊ณ  ํ•œ๋‹ค. 

 

 

2. @RestController 

https://hyejin.tistory.com/275

 

Spring RESTful ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๊ฒŒ์‹œํŒ

https://hyejin.tistory.com/272 Spring RESTful ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ํ”„๋กœ์ ํŠธ (@RequestBody, @ResponseBody, GET, POST, PUT, DELETE, Postman ์„ค์น˜ ๋ฐ ํ…Œ์ŠคํŠธ https://hyejin.tistory.com/265 Spring MVC, Mybatis [2]..

hyejin.tistory.com

์œ„์—์„œ๋Š” @Controller์™€ @ResponseBody๋ฅผ ํ†ตํ•ด REST ๋ฐฉ์‹์„ ์ง€์›ํ–ˆ์ง€๋งŒ, 

Spring4์—์„œ๋Š” @RestController๋ฅผ ํ†ตํ•ด REST๋ฐฉ์‹ ์—ญ์‹œ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 

@RestController๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค. 

 

 

3. Jackson, jaxb๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 

Jackson์€ java๊ฐ์ฒด๋ฅผ json์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. 

jaxb๋Š” java๊ฐ์ฒด๋ฅผ xml์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

jackson ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜
jaxb ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ 

 

 

4. @RestController๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ ๊ฒŒ์‹œํŒ ๊ตฌํ˜„ํ•˜๊ธฐ 

 

0๏ธโƒฃ board table 

๊ณ„์† ํ•œ ๊ฒŒ์‹œํŒ์— ๋Œ€ํ•ด์„œ ๋‹ค์–‘ํ•œ ์‹œ๋„๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— 

table์€ ๋˜‘๊ฐ™๋‹ค!

 

 

1๏ธโƒฃ rest.jsp ๊ฒŒ์‹œํŒ ํ™”๋ฉด ๊ตฌํ˜„ํ•˜๊ธฐ 

 

- rest.css

โ— ์ด๋ฒˆ์—๋Š” css ํŒŒ์ผ์„ ๋”ฐ๋กœ CSS ํด๋”๋ฅผ ์ƒ์„ฑํ•ด์„œ ๊ฑฐ๊ธฐ์— cssํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๋‹ค.

์ด๋•Œ ์กฐ์‹ฌํ•ด์•ผํ•  ๊ฒƒ์€ webapp ํด๋” ๋ฐ‘์— ์ƒ์„ฑํ•ด์•ผํ•˜๊ณ , ๋‹ค๋ฅธ๋ฐ ์ƒ์„ฑํ•˜๋ฉด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค..!

servlet-context.xml

๊ทธ๋ฆฌ๊ณ  context.xml์— CSSํด๋”์— ๋Œ€ํ•ด์„œ ์„ค์ •ํ•ด์ค˜์•ผํ•œ๋‹ค. 

- rest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%!
	// ํŽ˜์ด์ง• ๊ด€๋ จ ๋ณ€์ˆ˜๋“ค
%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>REST+AJAX๊ฒŒ์‹œํŒ</title>
<!-- ์Šคํƒ€์ผ, js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ -->
<!-- TODO -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<script>


</script>

<body>

<%-- ํ˜„์žฌ ํŽ˜์ด์ง€ (๋ช‡ ํŽ˜์ด์ง€) ์ •๋ณด --%>


<form id="frmWrite" onsubmit="TODO">
<table>
	<tr>
		<th>name</th>
		<td><input type="text" id="name" placeholder="์ž‘์„ฑ์ž์ด๋ฆ„" required/></td>
		<td rowspan="3"><input type="submit" value="์ƒˆ๊ธ€๋“ฑ๋ก"/></td>
	</tr>
	<tr>
		<th>subject</th>
		<td><input type="text" id="subject" placeholder="๊ธ€์ œ๋ชฉ" required/></td>
	</tr>
	<tr>
		<th>content</th>
		<td><input type="text" id="content" placeholder="๋‚ด์šฉ์ž…๋ ฅ"/></td>
	</tr>
</table>
</form>
<br>
<form name="frmDelete" id="frmDelete" onsubmit="return chkDelete()">
<table id="list">
	<thead>
		<th>#</th>
		<th>id</th>
		<th>subject</th>
		<th>name</th>
		<th>viewCnt</th>
		<th>regDAte</th>
	</thead>
	<tbody>
	
	</tbody>
</table>
<br>
<input type="submit" value="์„ ํƒ์‚ญ์ œ"/>
<button type="button" id="prev">์ด์ „ํŽ˜์ด์ง€</button>
<button type="button" id="next">๋‹ค์ŒํŽ˜์ด์ง€</button>
</form>

</body>
</html>

์•„์ง ๋™์ž‘์€ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ๋‹จ์ˆœ ํ™”๋ฉด์ด๋‹ค. 

์—ฌ๊ธฐ์— ์ด์ œ ์ ์  js ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์˜ˆ์ •์ด๋‹ค. 

 

2๏ธโƒฃ ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ ๊ตฌํ˜„ํ•˜๊ธฐ 

- ํŽ˜์ด์ง•์„ ์œ„ํ•œ view ์ƒ์„ฑ 

์šฐ์„  scott์—๋Š” ๋ทฐ ์ƒ์„ฑ ๊ถŒํ•œ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— scott์—๊ฒŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ด์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ board_view๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. 

 

- ๋‹ค์Œ์—๋Š” ์›๋ž˜ ์ž‘์„ฑ๋˜์—ˆ์—ˆ๋˜ BoardService, BoardDAO, BoardMapper๋“ฑ์— ํŽ˜์ด์ง•ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

โ— ์ด๋•Œ fromRow ๋Š” ๋ช‡๋ฒˆ์งธ row ๋ถ€ํ„ฐ ๋ณด์—ฌ์ค„ ์ง€ ๋‚˜ํƒ€๋‚ด๋ฉฐ writePages๋Š” ํŽ˜์ด์ง€๋‹น ๋ช‡๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. 

BoardService.java
BoardDAO.java
BoardServiceImpl.java
BoardDAOJDBC.java
BoardMapper.java
Board.xml ๋ฉ”ํผ sql 

โ— ์ด๋•Œ ![CDATA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”  Mybatis ์‚ฌ์šฉ์‹œ ์ฟผ๋ฆฌ ๋ฌธ์— ์ง€๊ธˆ์ฒ˜๋Ÿผ ๋น„๊ต์—ฐ์‚ฐ์ž๋‚˜ ๋ถ€๋“ฑํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ ํŠน์ˆ˜๋ฌธ์ž ์‚ฌ์šฉ์— ์ œํ•œ์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— <![CDATA[๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ์•ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋ฌธ์žฅ์„ ๋ฌธ์ž์—ด๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋ผ ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๋„ ๋ฌธ์ž์—ด๋กœ ์ธ์‹ํ•ด์ค€๋‹ค! 

 

- BoardRestController @RestController ์ƒ์„ฑํ•˜๊ธฐ 

โ— ์ด๋•Œ (page-1) * writePages + 1 ํ•  ๋•Œ ์˜ค๋ผํด์€ +1 ํ•ด์ฃผ๊ณ , mysql์€ ์•ˆํ•ด์ค˜๋„ ๋œ๋‹ค!

 

๊ทธ๋ฆฌ๊ณ  AjaxBoardList๋Š” ๊ฒฐ๊ณผ๋ฅผ responseํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค์ด๋‹ค. 

boardSerivce๋ฅผ ํ†ตํ•ด selectByRow ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„์—๋Š” AjaxBoardList์— ๊ฐ’์„ ๋‹ด์•„์„œ ๋ฆฌํ„ดํ•ด์ค€๋‹ค. 

์ด๋•Œ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜จ BoardVO ๊ฐ’์ด ๋„์ด ์•„๋‹ˆ๊ณ , ํฌ๊ธฐ๊ฐ€ 0 ์ด์ƒ์ด๋ผ๋ฉด status๋Š” ok, count์—๋Š” ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•ด์ฃผ๋ฉฐ, list์— selectByRow  ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์•„์ค€๋‹ค. 

 

- response ๋ฐ›์•„ ๋™์ ์œผ๋กœ table row ์ƒ์„ฑ 

๊ทธ๋ฆฌ๊ณ  loadPage์—์„œ ํ•ด๋‹นํ•˜๋Š” url๋กœ ์ž…๋ ฅํ•ด ๋ฐ›์€ response์˜ status ๊ฐ€ success์ด๋ฉด selectByRow ์ˆ˜ํ–‰ํ›„ result์— ๋‹ด์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ responseํ•ด์„œ ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜ ๋งŒํผ ํ…Œ์ด๋ธ”์˜ row๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค. 

 

๊ฒฐ๊ณผ ํ™”๋ฉด 

 

3๏ธโƒฃ ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ ๊ตฌํ˜„ ํ›„ ํŽ˜์ด์ง• ๊ตฌํ˜„ํ•˜๊ธฐ 

์ด ๊ฒŒ์‹œํŒ์—์„œ ํ•œ ํŽ˜์ด์ง€์—๋Š” 5๊ฐœ์˜ ๊ฒŒ์‹œ๊ธ€์ด ๋ณด์ด๋„๋ก ์„ค์ •ํ•  ๊ฒƒ์ด๋‹ค. 

๋”ฐ๋ผ์„œ writePages์˜ ๊ฐ’์ด 5์ด๋‹ค. 

๊ทธ๋ฆฌ๊ณ  url์— ์ˆซ์ž 5 ๋Œ€์‹ ์— writePages๋กœ ์ˆ˜์ •ํ•ด์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๋ช‡ ํŽ˜์ด์ง€์ธ์ง€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— hidden์œผ๋กœ page๊ฐ’์„ ์ €์žฅํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

ํŽ˜์ด์ง€๋ฅผ ๋กœ๋”ฉํ–ˆ์„ ๋•Œ ์ฒ˜์Œ์—๋Š” #page๊ฐ’์„ 1๋กœ ์ง€์ •ํ•ด์ฃผ๊ณ , loadPage(1)์„ ํ†ตํ•ด 1ํŽ˜์ด์ง€์˜ 5๊ฐœ์˜ ๊ฒŒ์‹œ๊ธ€์„ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋™์ ์œผ๋กœ row๋ฅผ ์ƒ์„ฑํ•œ๊ฒƒ์ด true์ด๋ฉด ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์˜จ page๊ฐ’์œผ๋กœ ์ง€์ •ํ•ด์ค˜ 

๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ๋ˆŒ๋Ÿฌ 2 ํŽ˜์ด์ง€๋ผ๋ฉด ํ˜„์žฌ ํŽ˜์ด์ง€๊ฐ’์ด 2์ด๋„๋ก ์ง€์ •ํ•ด์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ๋Š” ์ด์ „ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ˜„์žฌ ํŽ˜์ด์ง€๊ฐ’์„ ๋ฐ›์•„์™€ 1์ด๋ฉด alert๋ฅผ ํ†ตํ•ด ์ด์ „ ํŽ˜์ด์ง€๊ฐ€ ์—†๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋ฉฐ,

1์ด์ƒ์ผ๋•Œ๋Š” ํ˜„์žฌํŽ˜์ด์ง€์—์„œ -1 ํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ˜„์žฌ ํŽ˜์ด์ง€๊ฐ’์„ ์—ญ์‹œ ๋ฐ›์•„์˜จ ํ›„์— +1 ํ•ด์ค€๋‹ค. 

1ํŽ˜์ด์ง€์—์„œ ์ด์ „ํŽ˜์ด์ง€ ๋ฒ„ํŠผ ๋ˆŒ๋ €์„ ๋•Œ 
1ํŽ˜์ด์ง€์—์„œ ๋‹ค์Œ ํŽ˜์ด์ง€ ๋ฒ„ํŠผ ๋ˆŒ๋ €์„ ๋•Œ 

 

4๏ธโƒฃ ์ƒˆ๋กœ์šด ๊ธ€ ์ถ”๊ฐ€ํ•˜๊ธฐ 

- BoardRestController.java

์ƒˆ๋กœ์šด ๊ธ€์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฆฌํ„ดํ•  ๊ฐ์ฒด๋กœ AjaxBoardQryResult ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

- AjaxBoardQryResult.java

๊ธ€์„ ์ž‘์„ฑํ•œ ํ›„์— ๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด chkSubmit()ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

์„ฑ๊ณต์ ์œผ๋กœ ๊ธ€์„ ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ์—๋Š” ๋‹ค์‹œ 1ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ํผ์— ์ž‘์„ฑ๋˜์–ด ์žˆ๋˜ ๊ฐ’๋“ค์„ ๋ฆฌ์…‹ํ•ด์ค€๋‹ค. 

๊ฐ’ ์ž…๋ ฅ ํ›„ ์ƒˆ๊ธ€ ๋“ฑ๋ก ๋ฒ„ํŠผ ๋ˆ„๋ฅด๊ธฐ ์ „
์ถ”๊ฐ€๋œ ํ™”๋ฉด 

 

5๏ธโƒฃ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ธ€ ํ•œ๋ฒˆ์— ์‚ญ์ œํ•˜๊ธฐ 

์•„๊นŒ๋ถ€ํ„ฐ ์žˆ๋˜ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•˜๊ณ  ์„ ํƒ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•œ๊ฐœ ํ˜น์€ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

- BoardRestController.java

์—ฌ๋Ÿฌ๊ฐœ ์„ ํƒํ•˜๊ณ  ์„ ํƒ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด chkDelete() ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. 

์šฐ์„  ์ฒดํฌ๋œ ํ•ญ๋ชฉ์˜ wr_uid ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— #frmDelete iput[name=wr_uid]๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ํ•˜๋Š” ๊ฐ’์„ ids๋ผ๋Š” ๋ฐฐ์—ด์— ๋‹ด์•„์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ids์˜ ๊ธธ์ด๊ฐ€ 0์ด๋ฉด ์‚ญ์ œํ•  ๊ธ€์˜ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๋œป์œผ๋กœ ์‚ญ์ œํ•  ๊ธ€์„ ์ฒดํฌํ•ด๋‹ฌ๋ผ๋Š” ๊ฒฝ๊ณ ๋ฌธ์„ ๋„์›Œ์ค€๋‹ค. 

์ฒดํฌ ํ›„์—๋Š” ํ•œ๋ฒˆ ํ™•์ธํ•˜๋Š” ์ฐฝ์„ ๋„์›Œ ์•„๋‹ˆ์š”๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋™์ž‘ํ•˜์ง€ ์•Š๊ณ , ๋„ค ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์‚ญ์ œ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. 

์‚ญ์ œ ํ›„์—๋„ ๋‹ค์‹œ ์ž๋™์œผ๋กœ 1ํŽ˜์ด์ง€๋กœ ๋กœ๋”ฉ๋œ๋‹ค.

 

"id" : JSON.stringify(ids) -> [ 36, 37] 

"id" : JSON.stringify(ids).slice(1).slice(0,-1) -> 36, 37 

3ํŽ˜์ด์ง€์˜ id๊ฐ€ 22,24 ์‚ญ์ œํ•  ์˜ˆ์ • 

 

3ํŽ˜์ด์ง€์˜ id๊ฐ€ 22,24 ์‚ญ์ œํ•  ์˜ˆ์ • 

 

 

 

 

 

 

 

728x90