비동기 처리 반환 방법
1. string(text) 반환 : 데이터 여부 반환(아이디 중복검사, 좋아요 누르기)
2. Object(object) 반환 : 한번에 많은 데이터 반환
ex) List(똑같은 데이터 여러개), Map(), DTO(객체 하나 반환해야할 때), XML, JSON(아예 다른 객체)
비동기처리 어노테이션
- ViewResolver 수행을 막는 어노테이션 - @ResponseBody, @RestController
- @RequestBody - 전송된 데이터를 자바 객체로 변환하여 파라미터로 전달
- @ResponseBody - 메서드의 반환 값을 HTTP 응답 본문에 직접 작성
- @RestController : @Controller와 @ResponseBody를 결합한 어노테이션
※ dataType : 'json'을 설정하지 않으면 default = string
<pom.xml 설정파일 의존성 추가 코드>
<dependency>
<groupId>cohttp://m.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<활용 예시 코드 - BoardController.java>
package com.koreait.app.view.board;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.koreait.app.biz.board.BoardDTO;
import com.koreait.app.biz.board.BoardService;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class BoardController {
@Autowired
private BoardService boardService;
@RequestMapping(value="/boardList.do", method=RequestMethod.POST)
public @ResponseBody List<BoardDTO> boardList(@RequestBody BoardDTO boardDTO) {
System.err.println("com.koreait.app.view.board.value=boardList.do 실행");
if(boardDTO.getCondition()==null) {
System.out.println("condition=null");
boardDTO.setCondition("ALL");
}
else {
System.out.println("condition!=null");
}
if(boardDTO.getKeyword() != null && !boardDTO.getKeyword().trim().isEmpty()) {
System.out.println("keyword!=null");
}
else {
System.out.println("keyword=null");
boardDTO.setKeyword(null);
}
System.out.println(boardDTO.getKeyword());
System.out.println(boardDTO.getCondition());
List<BoardDTO> datas=boardService.selectAll(boardDTO);
System.out.println("boardList.do selectAll datas = ["+datas+"]");
return datas;
}
@RequestMapping(value="/main.do", method=RequestMethod.GET)
public String main(BoardDTO boardDTO, Model model) {
System.err.println("com.koreait.app.view.board.value=main.do 실행");
boardDTO.setCondition("ALL");
List<BoardDTO> datas=boardService.selectAll(boardDTO);
model.addAttribute("datas", datas);
return "main";
}
@RequestMapping(value="/insertBoard.do", method=RequestMethod.GET)
public String insertBoard() {
return "insertBoard";
}
@RequestMapping(value="/insertBoard.do", method=RequestMethod.POST)
public String insertBoard(BoardDTO boardDTO) {
boolean flag=boardService.insert(boardDTO);
System.out.println("insertBoard ["+flag+"]");
return "redirect:main.do";
}
}
<BoardList.js>
$(document).ready(function () {
$('#searchKeyword').on( 'click',function () {
var keyword = $('#keyword').val();
console.log('js/boardList keyword = ['+keyword+']');
var condition = $('#condition').val();
console.log('js/boardList condition = ['+condition+']');
$.ajax({
url: 'boardList.do',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({'keyword':keyword,'condition':condition}),
dataType: 'json',
success: function (datas) {
$('.board-list').empty();
console.log('boardList.js에 비동기 데이터 도착 = [' + datas + ']');
console.log('데이터 타입 = [' + typeof datas + ']');
console.log('데이터 타입 = [' + JSON.stringify(datas) + ']');
datas.forEach( data=> {
console.log('data = [' + JSON.stringify(data.content ) + ']');
console.log('data = [' + JSON.stringify(data.writer ) + ']');
var listItem = '<li class="board-item">' +
'<span class="board-title">' + data.content + '</span><br>' +
'<span class="board-writer">작성자: ' + data.writer + '</span>' +
'</li>';
$('#board-list').append(listItem);
});
},
error: function (xhr, status, error) {
console.error('AJAX 오류: ', error);
console.error('응답 내용:', xhr.responseText);
}
});
});
});
<main.jsp>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인 페이지</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
margin: 20px;
background-color: #ffffff;
}
h1 {
color: #333;
}
hr {
margin: 20px 0;
}
form {
margin-bottom: 20px;
display: flex;
align-items: center;
}
select, input[type="text"] {
padding: 10px;
margin-right: 10px;
border: 1px solid #ccc;
border-radius: 5px;
font-size: 16px;
}
input[type="submit"] .logout-link, .write-link {
background-color: #007BFF;
color: white;
padding: 10px 15px;
border: none;
border-radius: 5px;
text-decoration: none;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s;
}
input[type="submit"]:hover, .logout-link:hover, .write-link:hover {
background-color: #0056b3;
}
.board-list {
list-style-type: none;
padding: 0;
}
.board-item {
background: #fff;
margin: 10px 0;
padding: 15px;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
.board-title {
font-size: 18px;
font-weight: bold;
}
.board-writer {
color: #555;
font-size: 14px;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script src="js/boardList.js"></script>
</head>
<body>
<h1>${userID}님, 안녕하세요! :D</h1>
<hr>
<a href="logout.do" class="logout-link">로그아웃</a>
<hr>
<select id="condition">
<option value="SEARCH_WRITER">작성자로 검색</option>
<option value="SEARCH_CONTENT">글내용으로 검색</option>
</select>
<input type="text" id="keyword" placeholder="검색어 입력"/>
<input type="button" id="searchKeyword" value="검색"/>
<hr>
<h3>글 목록</h3>
<ul class="board-list" id="board-list">
<c:forEach var="data" items="${datas}">
<li class="board-item">
<span class="board-title">${data.content}</span><br>
<span class="board-writer">작성자: ${data.writer}</span>
</li>
</c:forEach>
</ul>
<hr>
<a href="insertBoard.do" class="write-link">글 작성</a>
</body>
</html>
2024.10.15
'Spring' 카테고리의 다른 글
| [Spring] 10-1. AOP 어노테이션 (0) | 2024.10.17 |
|---|---|
| [Spring] 10. AOP(관점 지향 프로그래밍) (0) | 2024.10.16 |
| [Spring] 08. 2-Layerd 아키텍처 구조 (0) | 2024.10.15 |
| [Spring] 07-5. 활용 코드 예시(Service) (0) | 2024.10.11 |
| [Spring] 07-4. 활용 코드 예시(DB) (0) | 2024.10.11 |