๐Ÿ“ฆ ์ƒํ’ˆ๋ชฉ๋ก ํŽ˜์ด์ง€ ๋””์ž์ธ & DB ๋ฐ์ดํ„ฐ ์ถœ๋ ฅ (Thymeleaf)

EthAnalogยท2025๋…„ 8์›” 22์ผ

Spring Boot

๋ชฉ๋ก ๋ณด๊ธฐ
9/16
post-thumbnail

โœ… ์–ด๋–ค ๊ธฐ๋Šฅ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ธ๊ฐ€?

  • DB์— ์žˆ๋Š” ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์ƒํ’ˆ ๋ชฉ๋ก ํŽ˜์ด์ง€์— ์ถœ๋ ฅ
  • CSS๋ฅผ ์ ์šฉํ•ด ๋””์ž์ธ ๊ฐœ์„ 
  • th:each ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณต ์ถœ๋ ฅ

๐Ÿ‘‰ ์™œ ์ด๊ฑธ ๋ฐฐ์›Œ์•ผ ํ•˜์ง€?

  • REST API๋กœ ๋ฐ์ดํ„ฐ๋งŒ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ฑด ๊ธฐ์ดˆ ์ˆ˜์ค€
  • ์‹ค์ œ ์›น์„œ๋น„์Šค๋Š” ๋ฐ์ดํ„ฐ + ํ™”๋ฉด(UI) ์„ ํ•จ๊ป˜ ์ œ๊ณตํ•ด์•ผ ์˜๋ฏธ ์žˆ์Œ
  • Spring + Thymeleaf๋ฅผ ํ™œ์šฉํ•˜๋ฉด DB โ†’ ์„œ๋ฒ„ โ†’ HTML ํ๋ฆ„์„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ“š ๊ฐœ๋… ์ •๋ฆฌ

๊ฐœ๋…์„ค๋ช…
th:each๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ HTML์— ์ถœ๋ ฅํ•  ๋•Œ ์‚ฌ์šฉ
Model.addAttribute์„œ๋ฒ„์—์„œ HTML๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉ
@ToStringํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ถœ๋ ฅํ•ด์ฃผ๋Š” Lombok ๊ธฐ๋Šฅ
List์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ณ€์ˆ˜์— ๋‹ด๋Š” ์ž๋ฃŒํ˜•
static ํด๋”CSS, JS, ์ด๋ฏธ์ง€ ๊ฐ™์€ ์ •์  ์ž์›์„ ๋ณด๊ด€ํ•˜๋Š” ํด๋”

โš™๏ธ ๊ตฌํ˜„ ํ๋ฆ„ ๋ฐ ์ฝ”๋“œ

1. ์ƒํ’ˆ ๋ชฉ๋ก ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ (list.html)

<div class="card" th:each="i : ${items}">
  <img src="https://placehold.co/300">
  <div>
    <h4 th:text="${i.title}">๋ฐ”์ง€</h4>
    <p th:text="${i.price}">7์–ต</p>
  </div>
</div>
  • th:each="i : ${items}" โ†’ ์„œ๋ฒ„์—์„œ ๋ณด๋‚ธ items ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ฐ˜๋ณต ์ถœ๋ ฅ
  • ${i.title} โ†’ i ๊ฐ์ฒด์˜ title ์ปฌ๋Ÿผ ์ถœ๋ ฅ
  • ${i.price} โ†’ i ๊ฐ์ฒด์˜ price ์ปฌ๋Ÿผ ์ถœ๋ ฅ

2. CSS ์ ์šฉ (main.css, static ํด๋”์— ์ €์žฅ)

.card {
  margin : 30px auto;
  display : flex;
}
.card img {
  width : 150px;
  margin-right : 20px;
}
<link href="/main.css" rel="stylesheet">

3. ์„œ๋ฒ„ ์ฝ”๋“œ (ItemController.java)

@GetMapping("/list")
String list(Model model) {
  List<Item> result = itemRepository.findAll();
  model.addAttribute("items", result);
  return "list.html";
}

4. @ToString (Item.java)

@Entity
@ToString
public class Item {
  public Long id;
  public String title;
  public Integer price;
}
  • @ToString ๋ถ™์ด๋ฉด System.out.println(item); ์‹คํ–‰ ์‹œ ๋ชจ๋“  ๋ณ€์ˆ˜๊ฐ’์ด ์ถœ๋ ฅ๋จ

๐Ÿ’ก ์ด๋Ÿฐ ๊ณณ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”

  • ์‡ผํ•‘๋ชฐ ์ƒํ’ˆ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ
  • ๊ฒŒ์‹œํŒ ๊ธ€ ๋ชฉ๋ก ์ถœ๋ ฅ
  • ์œ ์ € ํ”„๋กœํ•„ ๋ชฉ๋ก ์ถœ๋ ฅ
  • ๊ณต์ง€์‚ฌํ•ญ / ์ด๋ฒคํŠธ ๋ชฉ๋ก ํŽ˜์ด์ง€

โœ๏ธ ๊ฐœ์ธ ์ •๋ฆฌ ๋ฐ ํšŒ๊ณ 

  • REST API๋งŒ์œผ๋กœ๋Š” ์„œ๋น„์Šค๊ฐ€ ๋ถˆ์™„์ „ํ•˜๋‹ค.
  • DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด HTML์— ๊ฝ‚๋Š” ํ๋ฆ„์„ ์™„์„ฑํ•ด์•ผ "์„œ๋น„์Šค" ๋А๋‚Œ์ด ๋‚œ๋‹ค.
  • th:each ๋ฌธ๋ฒ•์€ ์ฒ˜์Œ์—” ๋‚ฏ์„ค์ง€๋งŒ ์‚ฌ์‹ค์ƒ for๋ฌธ๊ณผ ๋™์ผํ•˜๋‹ค.

๐Ÿ”‘ ์˜ค๋Š˜ ๋ฐฐ์šด ํ•ต์‹ฌ 3์ค„ ์š”์•ฝ

  1. th:each๋กœ HTML ๋ฐ˜๋ณต ์ถœ๋ ฅ ๊ฐ€๋Šฅ
  2. Model.addAttribute๋กœ ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ โ†’ HTML ์ „๋‹ฌ
  3. @ToString์œผ๋กœ ๊ฐ์ฒด ์ถœ๋ ฅ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌ

0๊ฐœ์˜ ๋Œ“๊ธ€