-
03/23(Tue) findById์ window.location.searchHangHae99/TIL-hanghae99 2021. 3. 23. 22:30
๐ฉ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์ ์ธํ CRUD๋ฅผ ๊ตฌํํ ํ์ด์ง ๋ง๋ค๊ธฐ
์ด์ ๊ทธ๋ฆฌ๊ณ ์ค๋ ๊ณ์ ํด๊ฒฐ์ด ์๋๋ ๋ฌธ์ 2๊ฐ์ง. ํ๋ฃจ ์จ์ข ์ผ ํด๊ฒฐ์ ๋ชปํด์ ๊ฒฐ๊ตญ ๋ฉํ ๋์ด ํด๊ฒฐํด์ฃผ์ จ๋ค.
๋ชจ๋ฅด๋ ๊ฒ ๋๋ฌด ๋ง์์ ๋ง๋งํ๊ณ , ๋ต๋ตํ๋ค. ์ด์ ๋ ๋๋ฌด ํ๋ค์๋๋ฐ ์ ๋์ด๊ฐ๊ณ ํ๋ค๊ฒ ์ป์ด๋ธ ๊ฒ ์ ๋ฆฌ ์ํ๊ณ ๋์ด๊ฐ์.
๐ ํด๋ ๊ตฌ์ฑ
๋ฉ์ธ์ด ๋๋ ํ์ด์ง๋ index.html
๊ธ์ ์์ฑํ๋ ํ์ด์ง๋ write.html
๊ฒ์๊ธ ์์ธ์กฐํ ํ์ด์ง๋ detail.html
index.html์ ์ ์ฒด ๊ฒ์๊ธ์ด ๋ณด์ฌ์ง๊ณ , ๊ทธ ์ค ํ ๊ฒ์๊ธ์ ์ ๋ชฉ์ ํด๋ฆญํ์ ๋๋ detail.html๋ก ๋์ด๊ฐ์ ๊ฒ์๊ธ ์ ๋ชฉ, ์์ฑ์, ์์ฑ์ผ, ๋ด์ฉ์ ๋ณด์ฌ์ฃผ๊ฒ ๋ง๋ค์๋ค.
index.html์์ ๊ธ์ฐ๊ธฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๊ธ์ ์์ฑํ ์ ์๋ write.html๋ก ๋์ด๊ฐ๊ฒ ๋๋ค.
๐ ์ฝ๋ ํ๋ฆ
1. ๊ธ์ฐ๊ธฐ ๋ฒํผ์ ํด๋ฆญํด์ write.html๋ก ํ์ด์ง๊ฐ ๋์ด๊ฐ๋ค.
<nav aria-label="breadcrumb"> <ol class="breadcrumb"> <li class="breadcrumb-item active write" aria-current="page"><a href="write.html" class="write-link">write</a></li> </ol> </nav>
2. write.html์์ write๋ฒํผ์ ํด๋ฆญํ๋ฉด writeBoard()ํจ์๋ฅผ ํธ์ถํ๋ค.
<div id="btn-done"> <button type="submit" onclick="writeBoard()" class="btn btn-primary">write</button> </div>
2-1. writeBoard()ํจ์
function writeBoard() { let title = $('#inputTitle').val(); let username = $('#inputUsername').val(); let contents = $('#inputContents').val(); let data = {'title':title, 'username':username, 'contents':contents}; $.ajax({ type: "POST", url: "/api/boards", contentType: "application/json", data: JSON.stringify(data), success: function (response) { alert("๊ธ์ด ์์ฑ๋์์ต๋๋ค."); window.location.href="index.html"; } }) }
๊ฐ inputํ๊ทธ๋ค์ value๊ฐ์ ๋ณ์์ ๋ด์๋๊ณ ์ด๋ค์ data ๋ณ์์ JSONํ์์ผ๋ก ๋ด์๋๋ค.
์ปจํธ๋กค๋ฌ์ ์์ฒญํ ๋ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ๋ณด๋ธ๋ค. ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ์๋ต์ด ์ค๋ฉด index.html๋ก ์ด๋ํ๊ฒ ํ๋ค.
3. index.html -> ํน์ ๊ฒ์๊ธ ํด๋ฆญ -> detail.html ์ด๋
index.html์์ 'ํฌ๋ก์๋!' ์ ๋ชฉ์ ํด๋ฆญํ๋ฉด
๊ฒ์๊ธ ์ ๋ชฉ์ ํด๋ฆญํ๋ฉด detail.html๋ก ์ด๋ํ๊ฒ ํด๋๋๋ฐ, ์ด ๋ url์ id๋ฅผ ๊ฐ์ด ์ฟผ๋ฆฌ๋ก ๋๊ธด๋ค.
function addHTML(id, username, title, contents, createdAt) { console.log("addHTMlํ์ ์ ๋ค์ด์์.") let tempHtml = `<div class="list_content"> <a class="title-edit" href="detail.html?id=${id}" onclick="showOneList('${id}'> <strong id="${id}-title">${title}</strong> </a> <div class="info-edit"> <p class="info-username" id="${id}-username">${username}</p> | <span id="${id}-time">${createdAt}</span> </div> </div>` $('#list-box').append(tempHtml); }
4. ์ด ๋ชจ๋ ๊ณ ๋์ด ์ฌ๊ธฐ์ ์์๋์๋ค. detail.html
1) ๊ณ ๋ 1
url๋ก id๋ฅผ ๋๊ฒจ ์คฌ๋๋ฐ, url์์ ์ด id๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅธ๋ค.
๋ฐฉ๋ฒ์ ์ฐพ๋ค๊ฐ ๋ชจ๋ฅด๊ฒ ์ด์, a ํ๊ทธ์ showOneList(id)๋ก๋ id๋ฅผ ๋๊ฒจ๊ฐ๋ฉฐ ์ด๊ฒ์ ๊ฒ ๊ณ ์ณ๋ดค๋๋ฐ, ์ด๋ป๊ฒ ๋๊ธฐ๋๋ผ๊ณ id ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ชป ์ฐพ์์๋ค.
๋ค์ url๋ก ๋๊ธด id ๊ฐ์ ธ์ค๋ ๋ฒ์ ์ฝ๋๋ก ๋ณด์.
$(document).ready(function() { $('#boards-box').empty(); let id = window.location.search.split('=')[1]; //?id=2 // "?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8" console.log(id); //์ ๋์ค๊ณ showOneList(id); })
detail.html์ ๋ค์ด์์ ๋ ์คํ๋๋ ์ฝ๋๋ค.
๊ทธ๋ฆฌ๊ณ url๋ก ๋๊ธด id๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋ - window.location.search
์ด๋ ๊ฒ ํ๋ฉด "?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8" ์ด๋ฐ์์ผ๋ก url๋ค์ ์ฟผ๋ฆฌ๋ก ๋๊ธด ๊ฒ๋ค์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
๋ด ์ฝ๋์์ id=2๋ฅผ ๋ฐ๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ๋๋ ์์ด๋ ๊ฐ๋ง ํ์ํ๋ฏ๋ก ' = '๋ฅผ ๊ธฐ์ค์ผ๋ก split()๋ฅผ ํ๊ณ ์ธ๋ฑ์ค[1]์ ๊ฐ์ ธ์ค๋ฉด ์์ด๋ ๊ฐ๋ง ์ป์ ์ ์๋ค. ์ด๊ฑธ let id ๋ณ์์ ๋ด๊ณ showOneList(id)์ id๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
2) ๊ณ ๋ 2
showOneList(id) ํจ์๋ฅผ ์ดํด๋ณด์.
function showOneList(id){ // id ์ ๋ฐ์์๋์ง ํ์ธํด๋ณด์. console.log(`id: ${id}`) $.ajax({ type: 'GET', url: `/api/boards/${id}`, success: function (resp) { addBoardHTML( resp.title, resp.username, resp.createdAt, resp.contents ); } }) }
์ปจํธ๋กค๋ฌ์ id์ ๊ฐ์ด ์์ฒญ์ ํ๋๋ฐ, ์ด๊ฒ๊ณผ ๋งค์น๋๋ ์ปจํธ๋กค๋ฌ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
@GetMapping("/api/boards/{id}") public Board getOneBoard(@PathVariable Long id) { return boardService.readOne(id); }
์๋น์ค์์ readOne(id)ํจ์๋ฅผ ํธ์ถํ์ผ๋ฏ๋ก ์๋น์ค ์ฝ๋๋ฅผ ๋ณด์.
@Transactional(readOnly = true) public Board readOne(Long id) { log.info("id: {}", id); final Board board = boardRepository.findById(id).orElseThrow( () -> new IllegalArgumentException("ํด๋น ์์ด๋๊ฐ ์กด์ฌํ์ง ์๋๋ค.") ); log.info("board: {}", board); return board; }
์ด ๋ถ๋ถ์ด ์ดํด๊ฐ ์๋๋ค.
final Board board = boardRepository.findById(id).orElseThrow( () -> new IllegalArgumentException("ํด๋น ์์ด๋๊ฐ ์กด์ฌํ์ง ์๋๋ค.") );
repository์์ find by id๋ฅผ ํ๋ฉด ๊ฒฐ๊ณผ ๊ฐ์ด id ๊ฐ ํ๋๋ผ๊ณ ์๊ฐํ๋ค. ์ด๊ฑธ board์ ๋ด์ผ๋ฉด, board์ ์๋ id ๋ฉค๋ฒ๋ณ์๋ง ์ค์ ๋๋ ๊ฑฐ ์๋๊ฐ ๋ผ๊ณ ์๊ฐ์ ํ๋, return ํด์ board๋ฅผ ๋ฐํํด๋ดค์ ์ปจํธ๋กค๋ฌ๋ id๋ง ์ค์ ๋ผ์๋ board๋ฅผ ๋ฐํํ ๊ฒ์ด๊ณ , ์ปจํธ๋กค๋ฌ๋ ์ด board๋ฅผ ํด๋ผ์ด์ธํธ์ ์๋ตํด์คํ ๋ฐ ์ด๋ป๊ฒ ๊ฒฐ๊ณผ๊ฐ์ด ์ ์ฐํ๋ ๊ฑด์ง ์ดํด๊ฐ ๋์ง ์์๋ค.
์ด ๋ถ๋ถ์ ํ์๋ค๊ป ์ฌ์ญค๋ดค๋๋, findById๋ฅผ ํ๋ฉด id๋ง ์ฃผ๋ ๊ฒ ์๋๋ผ ๊ทธ ์์ด๋์ ์ผ์นํ๋ ๋ฐ์ดํฐ ํ ํ์ ๋ฆฌํดํด ์ฃผ๋ ๊ฒ์ด๋ผ๊ณ ํ์ จ๋ค. ์ค๋ธ์ ํธ ํ์ผ๋ก ๋ฐํ์ด ๋๋ค๊ณ ํ์ จ๋๋ฐ ๊ทธ๊ฑด ์์ง ๋ฌด์จ ์๋ฏผ์ง ๋ชจ๋ฅด๊ฒ ๋ค. ์ฐพ์๋ด์ผ์ง.
์ง์์ ํ์๋คํํ ์ฌ์ญค๋ณผ ๊ฑธ...
๋ค์ ์ฝ๋๋ก ๋์๊ฐ์ log.info๋ฅผ ๋ณด๋ฉด board์ ์ด๋ค ๊ฐ์ด ๋ค์ด๊ฐ์๋์ง ํ์ธํด ๋ณผ ์ ์๋๋ฐ, ์ด๊ฑธ ํ์ธํด๋ณด์.
log.info("board: {}", board);
์์์ ์์๋ก ๋ 'ํฌ๋ก์๋!' ๊ฒ์๊ธ์ ํด๋ฆญํ์ ๋ board์ ๋ค์ด์๋ ๋ฐ์ดํฐ ๊ฐ.
์ด๋ ๊ฒ ๋์ผ๋ก ํ์ธํ๋๊น ์ดํด๊ฐ ์ ๋๋ค.
'HangHae99 > TIL-hanghae99' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
03/25(Thu) ํฌํธํฌ์๋ฉ์ด ์๋ ๋ (0) 2021.03.25 03/24(Wed) @Transactional๊ณผ @RequestBody (0) 2021.03.24 03/21(Sun) 3๊ณ์ธต ์๋ฌ (Controller, Service, Repository) (0) 2021.03.21 03/20(Sat) ์ธํ ๋ฆฌ์ ์ด(IntelliJ) ํ๋ก์ ํธ ์ธํ ๊ธฐ๋ณธ - ์คํ๋ง (5) 2021.03.20 03/19(Fri) ์ฃผํน๊ธฐ ์ฃผ์ฐจ ์์ (0) 2021.03.20