-
03/24(Wed) @Transactional๊ณผ @RequestBodyHangHae99/TIL-hanghae99 2021. 3. 24. 22:33
๐ฉ ์ด์ ๊น์ง CR๋ง ๋ง๋ค์๊ณ ์ค๋์ UD๋ฅผ ๋ง์ ๋ง๋ค์ด๋ณด์
@Transactional๊ณผ @RequestBody๋ฅผ ๋นผ๋จน๊ณ ์ฝ๋๋ฅผ ์์ฑํ์ ๋ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์์๋ณด์.
์์ฃผ ๋นผ๋จน๊ณ ์์ฑํ๋ ๋ฐ๋์ ์ด๋ค ์ผ์ด ์ผ์ด๋ฌ๋์ง ์ด๋ฏธ ์๊ณ ์์ง๋ง ์ ๋ฆฌ ํ๊ณ ๋์ด๊ฐ์ผ๊ฒ ๋ค.
๐ Update์ Delete
๐ ์ฝ๋ ํ๋ฆ
1. ์ญ์ ๊ธฐ๋ฅ
์ญ์ ๋ ๊ฐ๋จํ๋ค. ์ญ์ ๋ฒํผ์ ๋๋ ์ ๋ ๊ฒ์๊ธ์ด ์์ด์ง๋ฉด ๋๋๊น ํด๋ผ์ด์ธํธ -> ์ปจํธ๋กค๋ฌ ๋งคํ์ ํด๋ณด์.
function addBoardHTML(id, title, username, createdAt, contents) { let tempHtml = `<div class="card board"> <div class="card-header title-area"> <div class="one-title">${title}</div> <footer class="blockquote-footer">${username} | <cite title="Source Title"> ${createdAt} | </cite> <span id="${id}-board-edit" class="board-edit" onclick="location.href='rewrite.html?id=${id}'">์์ |</span> <span id="${id}-board-del" class="board-del" onclick="delBoard(${id})">์ญ์ </span> </footer> </div> <div class="card-body"> <blockquote class="blockquote mb-0 content-area"> <p class="one-content">${contents}</p> </blockquote> </div> </div>` $('#boards-box').append(tempHtml); }
detail.html์์ ์ญ์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด delBoard(id) ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ค.
delBoard(id)ํจ์๋ ์๋์ ๊ฐ๋ค.
function delBoard(id) { $.ajax({ type: "DELETE", url: `/api/boards/${id}`, success: function (response) { alert("์ญ์ ๋์์ต๋๋ค.") window.location.assign("index.html"); } }) }
ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ ํ์ผ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
@DeleteMapping("api/boards/{id}") public Long deleteOneBoard(@PathVariable Long id) { boardRepository.deleteById(id); return id; }
repository์์ deleteById(id) ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋์ด๋ค.
์ญ์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ ์ฝ๋๋ค์ด ์คํ์ด ๋๊ณ ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต์ ์ ํด์ฃผ๋๋ฐ, ๋ทฐ์์๋ ์ญ์ ๋์๋ค๋ alert์ฐฝ์ด ๋จ๊ณ index.html ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๋๋ค.
1) ํ ์คํธ
๊ฒ์๊ธ์ 2๊ฐ๋ฅผ ์์ฑํด ๋ณด์๋ค. ์ ์ผ ์์ ์๋ ๊ธ์ ์ญ์ ํด๋ณด์.
๊ฒ์๊ธ์ ํด๋ฆญํ๊ณ detail.html ํ์ด์ง๋ก ๋ค์ด์์ ์ญ์ ๋ฒํผ์ ๋๋ฅด๋ ์ญ์ ๊ฐ ๋์๋ค๊ณ ํ๋ค.
์ ์ผ ์์ ์๋ ๊ธ์ด ์์ด์ง ๊ฑธ ํ์ธํ ์ ์๋ค.
2. ์์ ๊ธฐ๋ฅ
detail.html ์์ ์์ ๋ฒํผ์ ํด๋ฆญํ์ ๋ rewrite.html ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๋ง๋ค์๋ค.
์ด๋ํ๋ฉด์ url์ ์ฟผ๋ฆฌ๋ก ์์ด๋๋ฅผ ๊ฐ์ด ๋ณด๋ธ๋ค.
ํ์ด์ง๋ ์ด๋ ๊ฒ ๊ตฌ์ฑํด๋จ๊ณ , ์์ ๊ธฐ๋ฅ์ ๋ง๋ค๋ฉด์ ์ค์๋ฅผ ๋ง์ด ํด์ ์ ๋จน์ ๋ถ๋ถ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
๋จผ์ ํด๋ผ์ด์ธํธ์์ ์ปจํธ๋กค๋ฌ๋ก ์์ฒญํ๋ ๋ถ๋ถ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
$.ajax({ type: "PUT", url: `/api/boards/${id}`, contentType: "application/json", data: JSON.stringify(data), success: function (response) { alert("์์ ๋์์ต๋๋ค."); window.location.href="index.html"; } })
์ปจํธ๋กค๋ฌ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
@PutMapping("api/boards/{id}") public Long updateBoard(@PathVariable Long id, @RequestBody BoardRequestDto boardRequestDto) { boardService.update(id, boardRequestDto); return id; }
์ฌ๊ธฐ์ ๋ฑ์ฅํ๋ @RequestBody.
์ฒ์์ @RequestBody๋ฅผ ๋นผ๋จน๊ณ ์ฝ๋๋ฅผ ์์ฑํ ์ฑ๋ก ์ฝ๋๋ฅผ ๋๋ ธ๋ค. ์ด๋ ๊ฒ ์๋ฒ๋ฅผ ๋๋ฆฌ๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋ ๊น? ์ด๋ฏธ ๊ฒช์ด๋ดค์ง๋ง ๋ค์ ํ ๋ฒ ์์๋ณด์.
1) @RequestBody
์์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด rewrite.html ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๋๊ณ , rewrite.html์ ํ์ด์ง๋ ์๋์ ๊ฐ๋ค.
edit ๋ฒํผ์ ํด๋ฆญํด๋ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์๋๋ค.
์ธํ ๋ฆฌ์ ์ด ์ฝ์์ ์ดํด๋ณด์.
๋๋ฆฌ๊ฐ ๋ฌ๋ค.
๋ค์ @RequestBody๋ฅผ ์์ฑํด์ฃผ๊ณ ์๋ฒ๋ฅผ ๋๋ ค๋ณด์.
index.html, rewrite.html, detail.html ํ์ด์ง ๋ชจ๋ ์ ๊ธฐ์ ์ผ๋ก ์ ์ฐ๊ฒฐ๋ผ์ ๊ฒฐ๊ณผ๋ฌผ์ด ๋์จ๋ค.
@RequestBody๊ฐ ๋๋์ฒด ๋ญ๊ธธ๋... ๋ผ๋ ์๊ฐ์ ์ํ ์๊ฐ ์๋ค.
@RequestBody๋ HTTP body์์ JSON ํ์์ผ๋ก ๋์ด์จ ๋ฐ์ดํฐ๋ฅผ Java Objectํ์ ์ผ๋ก ๋ณํ์์ผ์ฃผ๋ ์ญํ ์ ํ๋ค.
ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ค์ ๋ณด์.
function rewriteBoard(id) { let title = $('#inputTitle-re').val(); let username = $('#inputUsername-re').val(); let contents = $('#inputContents-re').val(); let data = {'title':title, 'username':username, 'contents':contents}; $.ajax({ type: "PUT", url: `/api/boards/${id}`, contentType: "application/json", data: JSON.stringify(data), success: function (response) { console.log(response) alert("์์ ๋์์ต๋๋ค."); window.location.href="index.html"; } }) }
ํด๋ผ์ด์ธํธ์์ ์ปจํธ๋กค๋ฌ์๊ฒ data๋ฅผ ์ ์ด์จ ํ์์ผ๋ก ๋๊ฒจ์คฌ๋ค.
์ปจํธ๋กค๋ฌ๋ ์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ผ ํ๋๋ฐ, ์ด๋ฅผ java์์ ๋ฐ์ผ๋ ค๋ฉด java object๋ก ๋ณํ์ ํด์ค์ผ ํ๋ค.
์ด๋ฐ ์์ ์ ํด์ฃผ๋ ๊ฒ์ด @RequestBody์ด๋ค.
์์ฝํ์๋ฉด @RequestBody๋ http ์์ฒญ ๋ด์ฉ์ ์๋ฐ ๊ฐ์ฒด๋ก ๋งคํํ๋ ์ญํ ์ ํ๋ค.
@PutMapping("api/boards/{id}") public Long updateBoard(@PathVariable Long id, @RequestBody BoardRequestDto boardRequestDto) { boardService.update(id, boardRequestDto); return id; }
@PathVariable ์ ์ด์ฃผ๋ ๊ฑด ์๊น๋จน๋๋ฐ, @RequestBody๋ ๋ช ๋ฒ ๋นผ๋จน๊ณ ์ ์ด์ ์ค๋ฅ๊ฐ ๋ง์ด ๋ฌ๋ค.
์์ง๋ง์.
2) @Transactional
@Transactional์ ๋ฌ์์ฃผ์ง ์์์ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ ๊น..?
BoardService.java ํ์ผ์์ @Transactional ์ด๋ ธํ ์ด์ ์ ๋นผ๋ฒ๋ฆฌ๊ณ ์๋ฒ๋ฅผ ๋ค์ ๋๋ ค๋ณด์.
๊ฒ์๊ธ์ ํ๋ ๋ฑ๋กํ๋ค.
๊ฒ์๊ธ์ ์์ ํด๋ณด์.
๊ฒ์๊ธ์ด ์์ ๋์๋ค๊ณ ํ๋ค. ์์ ๋์๋ค๋ alert์ฐฝ์ด ๋ด๊ณ , ํ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ค์ index.html ํ์ด์ง๋ก ๋์๊ฐ๊ฒ ๋ ๊ฒ์ด๋ค.
...?
๋ถ๋ช ํ ์์ ์ด ๋๋ค๊ณ ํ๋๋ฐ, ์ด๋ํ index.html ํ์ด์ง์๋ ์์ ์ ๊ธ์ด ๊ทธ๋๋ก ๋ณด์ธ๋ค.
@Transactional ์ด๋ ธํ ์ด์ ์ ๋นผ๋จน์ ๋๊ฐ์ด๋ค.
@Transactional ์ด๋ ๋ญ๊น? ์ ์์ ๊ธ์ด ๋ฐ์์ด ์๋๋ ๊ฑธ๊น?
๊ตฌ๊ธ๋งํ๋ฉด์ ๊ณต๋ถํด๋ณด๋ ํธ๋์ญ์ ์ ๋จผ์ ์์์ผ ํ๋๋ฐ, ํธ๋์ญ์ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ์์ ๋๋ ํ๋ฒ์ ์ํ๋์ด์ผ ํ๋ ์ฐ์ฐ๋ค์ ์๋ฏธํ๋ค๊ณ ํ๋ค.
@Transactional์ ์ ์ธ์ ํธ๋์ญ์ ์ด๋ผ๊ณ ํ๋๋ฐ, xmlํ์ผ์์ ์ค์ ํด์ฃผ๊ฑฐ๋ ์ด๋ ๊ฒ ์ด๋ ธํ ์ด์ ์ ๋ฌ์์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ Spring์์ JPA ๊ธฐ์ ์ ์ธ ๋ ๋นผ๋์ ์ ์๋ ๊ธฐ๋ฅ ์ค ํ๋๊ฐ @Transactional์ด๋ผ๊ณ ํ๋๋ฐ, transaction begin, commit์ ์๋์ผ๋ก ์ํํด์ฃผ๊ณ , ์์ธ๊ฐ ๋ฐ์๋๋ฉด rollback์ฒ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ํํด์ค๋ค๊ณ ํ๋ค.
public Long update(Long id, BoardRequestDto boardRequestDto) { Board board = boardRepository.findById(id).orElseThrow( () -> new IllegalArgumentException("์์ด๋๊ฐ ์กด์ฌ ํ์ง ์๋๋ค. ์ต์ ์ ํฐ์ง") ); board.update(boardRequestDto); return board.getId(); }
@Transactional ์ด๋ ธํ ์ด์ ์ ๋ฌ์ง ์๊ณ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ด ๋ฉ์๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ฌด๋ฐ ๊ด๋ จ์ด ์๋ ๋ฉ์๋๊ฐ ๋ผ๋, ์ ์ฝ๋๊ฐ ์คํ์ด ๋ผ๋ db์๋ ์๋ฌด๋ฐ ์ํฅ์ ๋ชป๋ฏธ์ณ์ ์ ๋ฐ์ดํธ๊ฐ ๋์ง ์์๋ ๊ฑด๊ฐ...?
์๋๋ฉด ์คํ์ ๋๋๋ฐ commit์ ์ํด์ค์ ์ ๋ฐ์ดํธ๊ฐ ์๋ ๊ฑด๊ฐ..? ์ด ๋ถ๋ถ์ ์ ๋ชจ๋ฅด๊ฒ ๋ค.
(์์๋ ๋ถ ๊ณ์๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.)
๊ฐ์ ์๋ฃ์๋ @Transactional์ SQL ์ฟผ๋ฆฌ๊ฐ ์ผ์ด๋์ผ ํจ์ ์คํ๋ง์๊ฒ ์๋ ค์ค๋ค๊ณ ๋ผ์๋๋ฐ, ์ด ๋ถ๋ถ์ ์ข ๋ ํ๋ด์ผ๊ฒ ๋ค.
@Transactional์ ๋ฌ๊ณ ์๋ฒ ์ฌ์์ํ๋ ์์ ์ด ์ ๋๊ณ , ๋ฐ์๋ ์ ๋๋ค.
@Transactional public Long update(Long id, BoardRequestDto boardRequestDto) { Board board = boardRepository.findById(id).orElseThrow( () -> new IllegalArgumentException("์์ด๋๊ฐ ์กด์ฌ ํ์ง ์๋๋ค. ์ต์ ์ ํฐ์ง") ); board.update(boardRequestDto); return board.getId(); }
'HangHae99 > TIL-hanghae99' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Port 8080 was already in use. (0) 2021.03.25 03/25(Thu) ํฌํธํฌ์๋ฉ์ด ์๋ ๋ (0) 2021.03.25 03/23(Tue) findById์ window.location.search (0) 2021.03.23 03/21(Sun) 3๊ณ์ธต ์๋ฌ (Controller, Service, Repository) (0) 2021.03.21 03/20(Sat) ์ธํ ๋ฆฌ์ ์ด(IntelliJ) ํ๋ก์ ํธ ์ธํ ๊ธฐ๋ณธ - ์คํ๋ง (5) 2021.03.20