MapleStory Cookie With Halo

๐Ÿƒ Spring/๐Ÿƒ Spring Boot

[SpringBoot][Thymeleaf]ํšŒ์›๊ด€๋ฆฌ-์›น MVC๊ฐœ๋ฐœ

๋‰ด์ด NUEY 2025. 1. 7. 16:32
๋ฐ˜์‘ํ˜•

 

MemberController ์ฝ”๋“œ

๋”๋ณด๊ธฐ
package hello.hellospring.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import hello.hellospring.domain.Member;
import hello.hellospring.service.MemberService;

@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

    @GetMapping("/members/new")
    public String createForm() {
        return "members/createMemberForm";
    }

    @PostMapping("/members/new")
    public String create(MemberForm form) {
        Member member = new Member();
        member.setName(form.getName());

        memberService.join(member);

        return "redirect:/";
    }

    @GetMapping("/members")
    public String list(Model model) {
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members);
        return "members/memberList";
    }

}

createMemberForm.html ์ฝ”๋“œ

๋”๋ณด๊ธฐ
<!DOCTYPE html>
<html lang="ko">
<body>
    <div class="container">
        <form action="/members/new" method="post">
            <div class="form-group">
                <label for="name">์ด๋ฆ„</label>
                <input type="text" id="name" name="name" placeholder="์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”" />
            </div>
            <button type="submit">๋“ฑ๋ก</button>
        </form>
    </div>
</body>    
</html>

meberList.html ์ฝ”๋“œ

๋”๋ณด๊ธฐ
<!DOCTYPE html>
<html lang="ko" xmlns="http://www.thymeleaf.org">
<body>
    <div class="container">
        <table>
            <thead>
                <tr>
                    <th>#</th>
                    <th>์ด๋ฆ„</th>
                </tr>
            </thead>
            <tbody>
                <tr th:each="member : ${members}">
                    <td th:text="${member.id}"></td>
                    <td th:text="${member.name}"></td>
                </tr>
            </tbody>
        </table>
    </div>
</body>
</html>

 


 

ํ™ˆ ํ™”๋ฉด

 

localhost:ํฌํŠธ๋ฒˆํ˜ธ๋งŒ ์ ์–ด๋„ ๋‚˜์˜ค๋Š” ํ™ˆํ™”๋ฉด์„ ๋งŒ๋“ค์–ด๋ณด์ž.

 

  1. controllerํŒจํ‚ค์ง€์— HomeControllerํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.
  2. ์ปจํŠธ๋กค๋Ÿฌ ์•ˆ์—  @GetMapping("/")  ์–ด๋…ธํ…Œ์ด์…˜์„ "home"ํ™”๋ฉด์œผ๋กœ ๊ฐ€๋Š” ๋ฉ”์„œ๋“œ์— ๋ถ™์—ฌ์ค€๋‹ค.
  3. resources-templates ํด๋” ์•ˆ์— home.html์„ ๋งŒ๋“ ๋‹ค.
  4. html ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.

๐Ÿ’ก index.html์ด ์žˆ์–ด๋„ ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์ด์œ ๋Š” ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋จผ์ € ํ™•์ธํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 


 

ํšŒ์› ๊ฐ€์ž…

 

  1. <a href="/members/new">ํšŒ์› ๊ฐ€์ž…</a>
    →  controller์— ' /members/new'๋ฅผ ๋ฐ›์„ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค.

  2. controller์— MemberController ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ ๋‹ค.
  3. ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
    return "members/createMemberForm"; → membersํด๋”์˜ createMemberForm๋กœ ์—ฐ๊ฒฐ.
  4. resources-templates-members ํด๋” ์•ˆ์— createMemberForm.html์„ ๋งŒ๋“ ๋‹ค.
  5. createMemberForm.html

    • <form action="/members/new" method="post">
      → post๋ฐฉ์‹์œผ๋กœ '/members/new' ๋กœ ์ „์†กํ•œ๋‹ค. 

      • ๐Ÿ’ก ์ „์†ก ๊ธฐ๋ณธ ๋ฐฉ์‹์€ get์ด๋‹ค. get์€ ์ฃผ๋กœ ์กฐํšŒ์— ์‚ฌ์šฉ๋œ๋‹ค. 
        ์ „๋‹ฌํ•˜๋Š” ๊ณณ์€ ๊ฐ™์•„๋„ get์ด๋ƒ post๋ƒ์— ๋”ฐ๋ผ์„œ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
        (post๋ฅผ ๋ฐ›๋Š” ๋ฐฉ์‹์€ ์•„๋ž˜์—)
    • <input type="text" id="name" name="name" placeholder="์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”" />
      → form์ด ์ „๋‹ฌ๋  ๋•Œ ์ด๋ฆ„์€ name="name" ์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค.

    • <button type="submit">๋“ฑ๋ก</button>
      → submit์„ ๋ˆ„๋ฅด๋ฉด formํƒœ๊ทธ๊ฐ€ ์ž‘๋™ํ•ด์„œ action์— ์ ํžŒ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•œ๋‹ค.

    • formํƒœ๊ทธ๊ฐ€ ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด
      2024.12.22 - [โœจ UI/๐Ÿ’— HTML] - [HTML]๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ณผ ๊ทธ ์•ˆ์˜ ์š”์†Œ๋“ค(input, select...)


  6. MemberController์— formํƒœ๊ทธ๋ฅผ ๋ฐ›์„ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

    1. @PostMapping("/members/new")
      → ํฌ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ ์ „๋‹ฌ๋œ "/members/new" ์ฃผ์†Œ๋ฅผ ๋ฐ›๋Š”๋‹ค.

    2. public String create(MemberForm form) {
      → MemberForm ํด๋ž˜์Šคํƒ€์ž…์œผ๋กœ ์ „๋‹ฌ๋œ name์„ ๋ฐ›๋Š”๋‹ค.

    3. MemberForm ํด๋ž˜์Šค
      String name์˜ getter/setter๋งŒ ์žˆ๋‹ค.
    4. MemberํšŒ์›๊ฐ€์ž…ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

    5. return "redirect:/";
      ๋ฆฌ๋””๋ ‰์…˜(๋‹ค๋ฅธ url๋กœ ์ด๋™)์„ ํ•ด์„œ / ํ™ˆ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

 


 

ํšŒ์› ๋ชฉ๋ก

 

  1. MemberController์— /member๋กœ ๊ฐ€๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ํšŒ์›์„ ๋ชจ๋‘ ์ฐพ์•„ membersํด๋”์˜ memberList๋กœ ๋ณด๋‚ธ๋‹ค.
  2. membersํด๋”์— memberList.html์„ ๋งŒ๋“ ๋‹ค.
  3. memberList.heml

    • <html lang="ko" xmlns="http://www.thymeleaf.org">
      → ํƒ€์ž„๋ฆฌํ”„๋ฅผ html์— ์—ฐ๊ฒฐํ•œ๋‹ค.

    • <tr  th:each="member : ${members}">
      → ํƒ€์ž„๋ฆฌํ”„์˜ each๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (java์˜ forEach๋ฌธ๊ณผ ๋™์ผํ•˜๋‹ค.)
      Listํ˜•ํƒœ๋กœ ์ „๋‹ฌ๋ฐ›์€ members์—์„œ member๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ์‚ฌ์šฉํ•œ๋‹ค.

    • <td th:text="${member.id}"></td>
      <td th:text= "${member.name}" ></td>
      → member์˜ id์™€ name์„ ๊บผ๋‚ด ํ…Œ์ด๋ธ”์— ์ถœ๋ ฅํ•œ๋‹ค.

    • ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ html์ฝ”๋“œ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด
      2024.12.22 - [โœจ UI/๐Ÿ’— HTML] - [HTML]ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ & ์…€ ๋ณ‘ํ•ฉ

  4. ํšŒ์› ๋ชฉ๋ก ํ™”๋ฉด์— ํƒ€์ž„๋ฆฌํ”„๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€์ž…ํ•œ ์—ฌ๋Ÿฌ๋ช…์˜ ํšŒ์›์ด ๋ณด์ด๋Š” ๊ฒƒ์ด ํ™•์ธ๋œ๋‹ค.

 


โ€ป ์ฐธ์กฐ : https://www.inflearn.com/roadmaps/373

๋ฐ˜์‘ํ˜•