본문 바로가기
Spring

[Spring] 09. Spring 비동기 처리

by ssunooo 2024. 10. 15.

 

 

비동기 처리 반환 방법


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