๐Ÿ’ป PROJECT/[์Šคํ”„๋ง ๋ถ€ํŠธ] ๊ฒŒ์‹œํŒ

[์Šคํ”„๋ง ๋ถ€ํŠธ] 5. ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ ๊ฒŒ์‹œ๋ฌผ ๋ฆฌ์ŠคํŒ…

devCloud 2023. 10. 24. 15:26
728x90

01. ํ…Œ์ŠคํŠธ ํ”„๋กœ์‹œ์ €

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด๋ ค๋ฉด ์–ด๋А ์ •๋„์˜ ๊ธ€์ด ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ๊ฐœ๋ฐœํ•˜๋Š”๋ฐ ๋ถˆํŽธํ•˜๋‹ค. ์ฆ‰, ์ง๊ด€์ ์œผ๋กœ ๋ณด๊ณ  ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

 

์‹คํ–‰ ๊ฒฐ๊ณผ 

120๊ฐœ๊นŒ์ง€ ์ƒ์„ฑ๋˜๊ฒŒ ํ–ˆ๋Š”๋ฐ ํ…Œ์ด๋ธ”์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด 120๊ฐœ์˜ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

02. ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€ ์ƒ์„ฑ

board > main > resource > templates์— ๊ฒŒ์‹œ๋ฌผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์ค„ html ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. (boardlist)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€</title>
</head>

<style>
  .layout {
      width : 500px;
      margin : 0 auto;
      margin-top : 40px;
  }
  table, th, td {
        border: 1px solid #bcbcbc;
      }
  td {
    text-align: center;
  }
</style>

<body>
  <div class="layout">
    <table border=1>
      <thead>
        <tr>
          <th>๊ธ€๋ฒˆํ˜ธ</th>
          <th>์ œ๋ชฉ</th>
        </tr>
      </thead>
      <tbody>
          <tr>
            <td>1</td>
            <td>์ œ๋ชฉ์ž…๋‹ˆ๋‹ค.</td>
          </tr>
      </tbody>
    </table>

  </div>
</body>
</html>

html ์ฝ”๋“œ๋Š” ์ค‘์š”ํ•œ ๊ฒŒ ์•„๋‹ˆ๋ฏ€๋กœ ๋””์ž์ธ์€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๋Š”๋‹ค. 

 

02-1. BoardController์— ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€

BoardController์— List๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์•ž์—์„œ ๋งŒ๋“ค์—ˆ๋˜ html ํŒŒ์ผ์˜ ์ด๋ฆ„๊ณผ ๋™์ผํ•˜๊ฒŒ url์„ ์ง€์ •ํ•ด์ค€๋‹ค.

 

์‹คํ–‰ํ•˜๊ธฐ(http://localhost:8080/board/list)

์‹คํ–‰ ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜จ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

02-2. BoardService์— ์ถ”๊ฐ€

๋‹ค์Œ์œผ๋กœ ๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์ด๋Š” ์„œ๋น„์Šค์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.

Board - Entity ํด๋ž˜์Šค

boardRepository - JPA Repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•˜๋˜ ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. 

findAll - JpaRepository ๊ธฐ๋ณธ์ ์ธ CRUD ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ๊ทธ ์ค‘์— findAll() ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ๋‹ค.  ์กฐ๊ฑด ์—†์ด ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒํ•œ๋‹ค.

 

์—ฌ๊ธฐ์„  Board๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ๋‹ด๊ธด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

 

02-3. BoardController ์ˆ˜์ •

๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ณด๋Š” ํŽ˜์ด์ง€๋กœ ๋ณด๋‚ด์ค˜์•ผ ํ•˜๋Š”๋ฐ ์ด๋•Œ ์“ฐ๋Š” ๊ฒƒ์ด Model์ด๋‹ค. 

Model - JSP์— ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„์„œ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์กด์žฌ์ด๋‹ค. Model ๊ฐ์ฒด๋Š” Controller ์—์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์•„ View ๋กœ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.

  • model.addAttribute(String name, Object value) : value ๊ฐ์ฒด๋ฅผ name ์ด๋ฆ„์œผ๋กœ ์ถ”๊ฐ€ํ•จ. ๋ทฐ ์ฝ”๋“œ์—์„œ๋Š” name์œผ๋กœ ์ง€์ •ํ•œ ์ด๋ฆ„์„ ํ†ตํ•ด์„œ value๋ฅผ ์‚ฌ์šฉํ•จ.

 

ํ•ด์„ํ•˜๋ฉด, "List"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ณด๋‚ผ๊ฑด๋ฐ boardService์˜ boardList๋ฅผ ๋‹ด์•„์„œ ๋ณด๋‚ผ๊ฑฐ๋ผ๋Š” ๋ง์ด๋‹ค. boardService์˜ boardList๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฐ˜ํ™˜๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ "List"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ›์•„์„œ ๋„˜๊ธด๋‹ค.

 

03. Thymeleaf 

์ด์ œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋“ค์„ ์ผ์ผ์ด ์ถœ๋ ฅํ•ด์ค˜์•ผ ํ•œ๋‹ค. ์ด๋•Œ ์“ฐ๋Š” ๊ฒƒ์ด thymleaf์ธ๋ฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

03-1. boardlist.html ์ˆ˜์ •

<!DOCTYPE html>
<html lang="en" xmlns:th="http://thymeleaf.org">
              .
              .
              .
      <tbody>
          <tr th:each="board : ${List}">
            <td th:text="${board.id}">1</td>
            <td th:text="${board.title}">์ œ๋ชฉ์ž…๋‹ˆ๋‹ค.</td>
          </tr>
      </tbody>
    </table>
  </div>
</body></html>

ํƒ€์ž„๋ฆฌํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ thyeleaf๋ฅผ ์‚ฌ์šฉํ•  html ํŒŒ์ผ์— ํƒ€์ž„๋ฆฌํ”„ url ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค. (๊ทธ ์ „์— ํƒ€์ž„๋ฆฌํ”„ ์˜์กด์„ฑ ์ฃผ์ž… ํ™•์ธ)

xmlns:th - ํƒ€์ž„๋ฆฌํ”„์˜ th์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ ์–ธ๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด๋‹ค.

th : each - ๋ฐ˜๋ณต ์ถœ๋ ฅ

th : text 

  • ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ด๋‹น ์†์„ฑ์€ ์ผ๋ฐ˜์ ์ธ ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค.

 

์‹คํ–‰ํ•˜๊ธฐ(http://localhost:8080/board/list)

์‹คํ–‰ ๊ฒฐ๊ณผ, DB์—์„œ ๋„ฃ์–ด์คฌ๋˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ 120๊ฐœ๊ฐ€ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€์—์„œ๋„ ๋ณด์ด๊ฒŒ ๋œ๋‹ค. 

 

04. ์ƒ์„ธ ํŽ˜์ด์ง€ ์ƒ์„ฑ

๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€๊นŒ์ง€ ๊ตฌํ˜„์ด ์™„๋ฃŒ ๋˜์—ˆ์œผ๋‹ˆ ์ด์ œ ์ œ๋ชฉ์„ ๋ˆ„๋ฅด๋ฉด ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค. 

board > main > resource > templates์— ์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค„ html ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. (boardview)

04-1. boardview.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€</title>
</head>
<body>
  <h1>์ œ๋ชฉ์ž…๋‹ˆ๋‹ค.</h1>
  <p>๋‚ด์šฉ์ด ๋“ค์–ด๊ฐˆ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.</p>
</body>
</html>

 

04-2. BoardController์— ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€

 

์‹คํ–‰ํ•˜๊ธฐ(http://localhost:8080/board/view)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€</title>
</head>
<body>
    <h1>์ œ๋ชฉ์ž…๋‹ˆ๋‹ค.</h1>
    <p>๋‚ด์šฉ์ด ๋“ค์–ด๊ฐˆ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.</p>
</body>
</html>

์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด์„œ ๋งŒ๋“ค์—ˆ๋˜ ์ƒ์„ธ ํŽ˜์ด์ง€๊ฐ€ ๋ณด์ด๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค.

 

04-3. BoardService์— ๋ฉ”์†Œ๋“œ ์ถ”๊ฐ€

๊ธ€๋งˆ๋‹ค ๋„˜์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ๊ฐ ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค.

findById

  • ์‹ค์ œ DB ์— ์š”์ฒญํ•ด์„œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ 1์ฐจ ์บ์‹œ๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์‹ค์ œ DB ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

get

  • optional์ด๋‹ค. ๋ฐ˜ํ™˜ํƒ€์ž…์„ ๊ฐ์‹ธ์ฃผ๋Š”๋ฐ Optional ๋‚ด๋ถ€์— ๋‹ด๊ธด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • null์ผ ์ˆ˜๋„ ์žˆ๋Š” ๊ฐ์ฒด๋„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค. 

 

โ€ป JPA ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ID ๊ฐ’์œผ๋กœ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋‘ ๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. getById์™€ findById๊ฐ€ ์žˆ๋‹ค.

 

04-4. BoardController ์ˆ˜์ •

localhost:8080/board/view?id=1 url๋กœ ๊ฐ€๋ฉด url์— ์žˆ๋Š” 1์ด Integer id์ชฝ์— 1์ด ๋“ค์–ด๊ฐ€๊ณ , ๋“ค์–ด๊ฐ„ 1์ด boardview๋ฉ”์†Œ๋“œ์˜ id๋กœ ๋‹ค์‹œ ๋“ค์–ด๊ฐ€์„œ ๊ฒŒ์‹œ๊ธ€์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

 

get ๋ฐฉ์‹์€ ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ URL์— ๋ถ™์—ฌ์„œ ์ „์†กํ•˜๋Š” ๊ฒƒ์ด๋‹ค. url์—์„œ ? ๋’ค์—๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ผ๊ณ  ํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ id์— ์ง‘์–ด๋„ฃ์€ ํ›„์— ๋‹ค์‹œ ์›น์— ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. (์ •ํ™•ํ•œ ์„ค๋ช…์€ ์•„๋‹ˆ๋‹ค.)

 

04-5. boardView.html์— Thyeleaf ์ถ”๊ฐ€

๊ทธ๋Ÿฌ๋‚˜ ๋„˜๊ฒจ์ฃผ๊ธฐ๋งŒ ํ•˜๊ณ  ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„์ด ์—†์œผ๋ฏ€๋กœ thymeleaf ์ถ”๊ฐ€

<!DOCTYPE html>
<html lang="en" xmlns:th="http://thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€</title>
</head>
<body>
    <h1 th:text="${article.title}">์ œ๋ชฉ์ž…๋‹ˆ๋‹ค.</h1>
    <p th:text="${article.content}">๋‚ด์šฉ์ด ๋“ค์–ด๊ฐˆ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.</p>
</body>
</html>

 

์‹คํ–‰ํ•˜๊ธฐ(localhost:8080/board/view?id=1)

1 ์ž๋ฆฌ์— ๋‹ค๋ฅธ ์ˆซ์ž๋ฅผ ๋„ฃ์œผ๋ฉด ๊ฐ’์— ๋งž๋Š” ๊ฒŒ์‹œ๋ฌผ์ด ๋œฌ๋‹ค.

 

04-6. boardview.html ์ˆ˜์ •

์ œ๋ชฉ์„ ๋ˆŒ๋ €์„ ๋•Œ ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•œ๋‹ค.

<!DOCTYPE html>
        .
        .
        .
      <tbody>
          <tr th:each="board : ${List}">
            <td th:text="${board.id}">1</td>
            <td>
                <a th:text="${board.title}" th:href="@{/board/view(id=${board.id})}"></a>
            </td>
          </tr>
      </tbody>
    </table>
  </div>
</body></html>

 

์‹คํ–‰ํ•˜๊ธฐ(localhost:8080/board/list)

์ด์ „๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ œ๋ชฉ์„ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์กŒ๋‹ค. "์ œ๋ชฉ ์ž‘์„ฑ ํ…Œ์ŠคํŠธ" ์ œ๋ชฉ์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

728x90