스프링 부트, 입문!

준비중..

스프링 부트, 입문!

기본 게시판 만들기!

09 폼(form) 데이터, Ajax로 주고 받기

# 폼 데이터, Ajax로 주고 받기 ## 미션 --- 폼 데이터를 Ajax 방식으로 서버에 전달하여, ![클라우드스터딩-스프링부트-JSON-데이터-전송](https://i.imgur.com/rdf6a7V.png) 해당 데이터의 로그를 확인하시오. ![클라우드스터딩-스프링부트-JSON-데이터-받기-확인](https://i.imgur.com/vzt2Y9X.png) ## 개념 --- #### ⭐ Ajax 무엇, 왜씀? JS를 사용한 비동기적 통신 기법. 이를 Ajax라 한다. Ajax를 사용하면, 신속한 데이터 변경이 가능하다. 가령 1만줄 짜리 웹 페이지 중, 단 한 데이터가 바뀌는 상황이라 하자. Ajax를 사용하면, 정확히 해당 데이터만 바꿀 수 있다. 반면, 일반 웹페이지 요청은 전체 페이지를 다 읽는 낭비가 발생한다. ![클라우드스터딩-스프링-부트-ajax란](https://i.imgur.com/Y0diVnq.png) #### ⭐ JSON Ajax 통신 시, 데이터는 JSON 형식으로 주고 받게 된다. JSON(JavaScript Object Notation)이란, 데이터를 자바스크립트 객체로 표현한 것이다. ``` // article 객체 표현 예 { title: "오늘은..", content: "치킨을 뜯고 싶어라..!" } ``` ![클라우드스터딩-스프링-부트-json이란](https://i.imgur.com/SL55YzS.png) #### ⭐ API 컨트롤러 서버 데이터를 JSON에 담아 API로 주고 받는 컨트롤러. 이를 API 컨트롤러, 다른 표현으로 REST 컨트롤러라 한다. 이를 위한 애노테이션이 @RestController이다. ![클라우드스터딩-스프링-부트-rest-컨트롤러](https://i.imgur.com/gCVb6FO.png) ## 튜토리얼 --- #### ⭐ 뷰 페이지 1) 페이지 수정: "articles/new" ``` {{>layouts/header}} <div class="jumbotron"> <h1>Article 등록</h1> <hr> <p>articles/new.mustache</p> </div> <!-- Form 태그, 기존 속성 method와 action을 삭제! 왜? JS로 보낼거니까! --> <form class="container"> <div class="form-group"> <label for="title">제목</label> <!-- name="title" 추가, DTO의 필드명과 일치해야 함! --> <input name="title" type="text" class="form-control" id="article-title" placeholder="제목을 입력하세요"> </div> <div class="form-group"> <label for="content">내용</label> <!-- name="content" 추가, DTO의 필드명과 일치해야 함! --> <textarea name="content" class="form-control" id="article-content" placeholder="내용을 입력하세요" rows="3"></textarea> </div> <!-- type="button"으로 변경, id값 추가 --> <button type="button" class="btn btn-primary" id="article-create-btn">제출</button> </form> <Script> // article 객체 생성 var article = { // 초기화(이벤트 등록) 메소드 init: function() { // 스코프 충돌 방지! (https://mobicon.tistory.com/189) var _this = this; // 생성 버튼 선택 const createBtn = document.querySelector('#article-create-btn'); // 생성 버튼 클릭 시, 동작 할 메소드를 연결! createBtn.addEventListener('click', _this.create); }, // article 생성 메소드 create: function() { // form 데이터를 JSON으로 만듬 var data = { title: document.querySelector('#article-title').value, content: document.querySelector('#article-content').value, }; // 데이터 생성 요청을 보냄 // fetch(URL, HTTP_REQUEST) fetch('/api/articles', { method: 'POST', // POST 방식으로, HTTP 요청. body: JSON.stringify(data), // 위에서 만든 폼 데이터(data)를 함께 보냄. headers: { 'Content-Type': 'application/json' } }).then(function(response) { // 응답 처리! // 요청 성공! if (response.ok) { alert('게시글이 작성 되었습니다.'); window.location.href='/articles'; // 해당 URL로 브라우저를 새로고침! } else { // 요청 실패.. alert('게시글 작성에 문제가 생겼습니다.'); } }); } }; // 객체 초기화 article.init(); </script> {{>layouts/footer}} ``` #### ⭐ API 컨트롤러 2) 생성: "api/ArticleApiController" ``` @Slf4j @RestController public class ArticleApiController { @PostMapping("/api/articles") // Post 요청이 "/api/articles" url로 온다면, 메소드 수행! public Long create(@RequestBody ArticleForm form) { // JSON 데이터를 받아옴! log.info(form.toString()); // 받아온 데이터 확인! return 0L; } } ``` #### ⭐ 확인하기 3) 데이터 보내기 ![클라우드스터딩-스프링부트-JSON-데이터-전송](https://i.imgur.com/rdf6a7V.png) 4) 서버 로그 확인 ![클라우드스터딩-스프링부트-JSON-데이터-받기-확인](https://i.imgur.com/vzt2Y9X.png) ## 훈련하기 --- - 작성한 프로젝트 코드를 저장(commit) 하고, 깃허브에 업로드(push) 하시오. ## 면접 준비 --- - 동기/비동기 프로그래밍의 차이? - Ajax란 무엇이고, 그 장/단점은? - JSON이란? - REST API란?