๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [Spring] 'ํšŒ์›๊ฐ€์ž… ๋งŒ๋“ค๊ธฐ' ํŽธ

ybkยท2024๋…„ 5์›” 2์ผ

spring

๋ชฉ๋ก ๋ณด๊ธฐ
24/55
post-thumbnail

๐Ÿ”” 'ํšŒ์›๊ฐ€์ž… ๋งŒ๋“ค๊ธฐ'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!

ํšŒ์›๊ฐ€์ž… :
1. ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ(C)
2. ๊ฐ€์ž…๋œ ํšŒ์› ๋ชฉ๋ก ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ(R)
3. ํšŒ์› ์ •๋ณด ์ˆ˜์ •ํ•˜๋Š” ๊ธฐ๋Šฅ(U)
4. ํšŒ์› ์ •๋ณด ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ(D)


Member ์ž๋ฐ” ๋นˆ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

@Data
public class Member {
    private Integer id;
    private String email;
    private String password;
    private String nickName;
    private LocalDateTime inserted;
}

๐Ÿ’Ÿ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ(CREATE)

MemberController

@GetMapping("signup")
public void signup() {
}

@PostMapping("signup")
public String signup(Member member) {
    service.signup(member);
    return "redirect:/member/list";
}
  • @GetMapping("signup") : /signup ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • @PostMapping("signup") : member๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ํšŒ์›๊ฐ€์ž…์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๊ฐ€์ž…์ด ์™„๋ฃŒ๋˜๋ฉด member/list ๊ฒฝ๋กœ๋กœ ๊ฐ€์„œ ํšŒ์› ๋ชฉ๋ก ํŽ˜์ด์ง€(list.jsp)๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ฉ๋‹ˆ๋‹ค.

MemberService

public void signup(Member member) {
    mapper.insert(member);
}
  • mapper๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ member ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

MemberMapper

@Insert("""
        INSERT INTO member (email, password, nick_name) VALUES (#{email}, #{password}, #{nickName})
        """)
void insert(Member member);
  • ํšŒ์›์˜ email, password, nick_name์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด @Insert๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’Ÿ ํšŒ์› ๋ชฉ๋ก ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ(READ)

โ˜‘๏ธ ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ

MemberController

@GetMapping("list")
public String list(Member member, Model model) {
    model.addAttribute("memberList", service.list());
    return "member/list";
}
  • service์—์„œ ๋ชจ๋“  member์˜ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๋Š” ํšŒ์› ๋ชฉ๋ก์„ ๊ฐ€์ ธ์™€ memberList์— ๋„ฃ์–ด ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•˜์—ฌ member/list ๊ฒฝ๋กœ์ธ ํšŒ์› ๋ชฉ๋ก ํŽ˜์ด์ง€(list.jsp)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

MemberService

public List<Member> list() {
    return mapper.selectAll();
}
  • mapper๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ member์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

MemberMapper

@Select("SELECT * FROM member ORDER BY id DESC ")
List<Member> selectAll();
  • ๋ชจ๋“  ํšŒ์›์„ ๊ฐ€์žฅ ์ตœ๊ทผ์— ๋“ค์–ด์˜จ ์ˆœ์œผ๋กœ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด @Select ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โ˜‘๏ธ ํŠน์ • id๋ฅผ ๋ฐ›์•„ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ

MemberController

@GetMapping("")
public String view(Integer id, Model model) {
    model.addAttribute("member", service.get(id));
    return "member/info";
}
  • service์—์„œ ํšŒ์›์˜ id๋ฅผ ๋ฐ›์•„์™€ ํšŒ์› ์ •๋ณด๋ฅผ ์กฐํšŒ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์™€ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•˜์—ฌ member/info ๊ฒฝ๋กœ์ธ ํšŒ์› ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€(info.jsp)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

MemberService

public Member get(Integer id) {
    return mapper.selectById(id);
}
  • mapper๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ id์— ํ•ด๋‹นํ•˜๋Š” ํšŒ์› ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

MemberMapper

@Select("SELECT * FROM member WHERE id = #{id}")
Member selectById(Integer id);
  • ํšŒ์›์˜ id๋ฅผ ์กฐํšŒํ•˜์—ฌ ํ•ด๋‹น ํšŒ์›๋งŒ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ @Select ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’Ÿ ํšŒ์› ์ •๋ณด ์ˆ˜์ •ํ•˜๋Š” ๊ธฐ๋Šฅ(UPDATE)

MemberController

// ์ฒ˜์Œ์— ์ˆ˜์ • ํด๋ฆญ ์‹œ member/modify?id=?๋กœ
@GetMapping("modify")
public String modify(Integer id, Model model) {
    model.addAttribute("member", service.get(id));
    return "member/modify";
}

// member/modify?id=?์—์„œ ์ˆ˜์ • ํด๋ฆญ ์‹œ member/list๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
@PostMapping("modify")
public String modifyPost(Member member, RedirectAttributes rttr) {
    service.modify(member);
    rttr.addAttribute("id", member.getId());
    return "redirect:/member";
}
  • @GetMapping("modify") : /modify ๊ฒฝ๋กœ๋กœ Get ์š”์ฒญ์ด ๋“ค์–ด์™€ service์—์„œ id๋ฅผ ๋ฐ›์•„์™€ ํ•ด๋‹น ํšŒ์›์˜ ์ •๋ณด๋ฅผ ๋ชจ๋ธ์— ์ถ”๊ฐ€ํ•˜์—ฌ member/modify ๊ฒฝ๋กœ๋กœ ๊ฐ€์„œ ํšŒ์› ์ •๋ณด ์ˆ˜์ •ํŽ˜์ด์ง€(modify.jsp)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  • @PostMapping("modify") : Post ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ service์—์„œ member๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ํšŒ์› ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ˆ˜์ •๋œ ํšŒ์›์˜ id๋ฅผ getId()๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ /member ๊ฒฝ๋กœ๋กœ ํ•ด๋‹น ํšŒ์›์˜ ์ˆ˜์ •๋œ ์ •๋ณด ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ฉ๋‹ˆ๋‹ค.


MemberService

public Member get(Integer id) {
    return mapper.selectById(id);
}
public void modify(Member member) {
    mapper.update(member);
}
  • get(Integer id) : mapper๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ id์— ํ•ด๋‹นํ•˜๋Š” ํšŒ์› ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
  • modify(Member member) : mapper๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋œ member ๊ฐ์ฒด์˜ ํšŒ์› ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

MemberMapper

@Select("SELECT * FROM member WHERE id = #{id}")
Member selectById(Integer id);

@Update("""
        UPDATE member SET password = #{password}, nick_name = #{nickName} WHERE id = #{id}
        """)
int update(Member member);
  • selectById(Integer id) : ํšŒ์›์˜ id๋ฅผ ์กฐํšŒํ•˜์—ฌ ํ•ด๋‹น ํšŒ์›๋งŒ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด์„œ @Select ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • update(Member member) : ํšŒ์›์˜ password, nick_name๋งŒ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ @Update ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’Ÿ ํšŒ์› ์ •๋ณด ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ(Delete)

MemberController

@PostMapping("remove")
public String remove(Integer id) {
    service.delete(id);
    return "redirect:/member/list";
}
  • id๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ํ•ด๋‹น id์˜ ํšŒ์›์„ ์‚ญ์ œํ•˜๊ณ  member/list ๊ฒฝ๋กœ๋กœ ๊ฐ€์„œ ํšŒ์› ๋ชฉ๋ก ํŽ˜์ด์ง€(list.jsp)๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•ฉ๋‹ˆ๋‹ค.

MemberService

public void delete(Integer id) {
    mapper.delete(id);
}
  • mapper๋ฅผ ํ†ตํ•ด ํ•ด๋‹น id์˜ ํšŒ์›์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

MemberMapper

@Delete("DELETE FROM member WHERE id = #{id}")
int delete(Integer id);
  • ํ•ด๋‹น id์˜ ํšŒ์›์„ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ @Delete ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’Ÿ ์ „์ฒด ์ฝ”๋“œ

MemberController

@Controller
@RequiredArgsConstructor
@RequestMapping("member") // /member + (/view or /signup/delete)
public class MemberController {

    private final MemberService service;

    @GetMapping("signup")
    public void signup() {
    }

    @PostMapping("signup")
    public String signup(Member member) {
        service.signup(member);
        return "redirect:/member/list";
    }

    @GetMapping("list")
    public String list(Member member, Model model) {
        model.addAttribute("memberList", service.list());
        return "member/list";
    }

    @GetMapping("")
    public String view(Integer id, Model model) {
        model.addAttribute("member", service.get(id));
        return "member/info";
    }

    @PostMapping("remove")
    public String remove(Integer id) {
        service.delete(id);
        return "redirect:/member/list";
    }

    // ์ฒ˜์Œ์— ์ˆ˜์ • ํด๋ฆญ ์‹œ member/modify?id=?๋กœ
    @GetMapping("modify")
    public String modify(Integer id, Model model) {
        model.addAttribute("member", service.get(id));
        return "member/modify";
    }

    // member/modify?id=?์—์„œ ์ˆ˜์ • ํด๋ฆญ ์‹œ member/list๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
    @PostMapping("modify")
    public String modifyPost(Member member, RedirectAttributes rttr) {
        service.modify(member);
        rttr.addAttribute("id", member.getId());
        return "redirect:/member";
    }

    //์ด๋ฉ”์ผ check
    @GetMapping("email")
    @ResponseBody
    public String emailCheck(String email) {
        String message = service.emailCheck(email);
        return message;
    }
}

MemberService

@Service
@RequiredArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class MemberService {

    private final MemberMapper mapper;

    public void signup(Member member) {
        mapper.insert(member);
    }

    public List<Member> list() {
        return mapper.selectAll();
    }

    public Member get(Integer id) {
        return mapper.selectById(id);
    }

    public void delete(Integer id) {
        mapper.delete(id);
    }

    public void modify(Member member) {
        mapper.update(member);
    }

    public String emailCheck(String email) {
        Member member = mapper.selectByEmail(email);
        if (member == null) {
            //์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด๋ฉ”์ผ
            return "์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ด๋ฉ”์ผ์ž…๋‹ˆ๋‹ค.";
        } else {
            // ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ด๋ฉ”์ผ
            return "์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ด๋ฉ”์ผ์ž…๋‹ˆ๋‹ค.";
        }
    }
}

MemberMapper

@Mapper
public interface MemberMapper {

    @Insert("""
            INSERT INTO member (email, password, nick_name) VALUES (#{email}, #{password}, #{nickName})
            """)
    void insert(Member member);

    @Select("SELECT * FROM member WHERE id = #{id}")
    Member selectById(Integer id);

    @Select("SELECT * FROM member ORDER BY id DESC ")
    List<Member> selectAll();

    @Delete("DELETE FROM member WHERE id = #{id}")
    int delete(Integer id);

    @Update("""
            UPDATE member SET password = #{password}, nick_name = #{nickName} WHERE id = #{id}
            """)
    int update(Member member);

    @Select("SELECT * FROM member WHERE email = #{email}")
    Member selectByEmail(String email);
}

JSP


ํšŒ์›๊ฐ€์ž… ํ™”๋ฉด(signup.jsp)

<c:import url="/WEB-INF/fragment/navbar.jsp"/>

<%--div.container>div.row.justify-content-center>div.col-6--%>
<div class="container" style="font-family: 'TTHakgyoansimUndongjangL'">
    <div class="row justify-content-center">
        <div class="col-8">
            <h3 class="mb-4">ํšŒ์› ๊ฐ€์ž…</h3>
            <form action="/member/signup" method="post" onsubmit="return checkValues()">
                <%--                div*3>label.form-label+input.form-control--%>
                <div class="mb-3">
                    <label for="emailInput" class="form-label">์ด๋ฉ”์ผ</label>
                    <div class="input-group">
                        <input name="email" id="emailInput" required type="email" class="form-control"
                               placeholder="E-mail">
                        <button onclick="emailCheck();" type="button" id="btnEmailCheck"
                                class="btn btn-outline-secondary">์ค‘๋ณต ํ™•์ธ
                        </button>
                    </div>
                    <small class="form-text text-muted">์ด๋ฉ”์ผ ์–‘์‹์— ๋งž์ถฐ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”</small>
                </div>
                <div class="mb-3">
                    <label for="pwdInput" class="form-label">ํŒจ์Šค์›Œ๋“œ</label>
                    <input oninput="passwordCheck()" name="password" id="pwdInput" required type="password"
                           class="form-control"
                           placeholder="password">
                </div>
                <div class="mb-3">
                    <label for="pwdCheckInput" class="form-label">ํŒจ์Šค์›Œ๋“œ ํ™•์ธ</label>
                    <input oninput="passwordCheck()" id="pwdCheckInput" required type="password" class="form-control"
                           placeholder="password">
                    <div class="form-text" id="passwordMessage"></div>
                </div>
                <div class="mb-3">
                    <label for="nickInput" class="form-label">๋ณ„๋ช…</label>
                    <input name="nickName" id="nickInput" required type="text" class="form-control"
                           placeholder="nick name">
                </div>
                <div>
                    <button class="btn btn-primary">๊ฐ€์ž…</button>
                </div>
            </form>
        </div>
    </div>
</div>

<script>
    async function emailCheck() {
        const emailValue = document.querySelector("#emailInput").value;
        const url = "/member/email?email=" + emailValue;

        //ajax ์š”์ฒญ
        const response = await fetch(encodeURI(url));

        // ์‘๋‹ต์ฒ˜๋ฆฌ
        // console.log(response.text());
        alert(await response.text())
    }

    function passwordCheck() {
        const password = document.querySelector("#pwdInput").value;
        const passwordCheck = document.querySelector("#pwdCheckInput").value;

        if (password != passwordCheck) {
            //๋ฉ”์‹œ์ง€ ๋ณด์—ฌ์ฃผ๊ธฐ
            document.querySelector("#passwordMessage").textContent = "ํŒจ์Šค์›Œ๋“œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.";
        } else {
            document.querySelector("#passwordMessage").textContent = "";
        }
    }

    function checkValues() {
        const password = document.getElementById("pwdInput").value;
        const passwordCheck = document.getElementById("pwdCheckInput").value;

        if (password != "" && password == passwordCheck) {
            return true;
        } else {
            alert("ํŒจ์Šค์›Œ๋“œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
            return false;
        }
    }
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.min.js"
        integrity="sha512-ykZ1QQr0Jy/4ZkvKuqWn4iF3lqPZyij9iRv6sGqLRdTPkY69YX6+7wvVGmsdBbiIfN/8OdsI7HABjvEok6ZopQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer"></script>

</body>
</html>

ํšŒ์› ์ •๋ณด ๋ชฉ๋ก ํ™”๋ฉด(list.jsp)

<body>

<c:import url="/WEB-INF/fragment/navbar.jsp"/>

<%--div.container>div.row.justify-content-center>div.col-6--%>
<div class="container" style="font-family: 'TTHakgyoansimUndongjangL'">
    <div class="row justify-content-center">
        <div class="col-12 col-xl-6">
            <h3 class="mb-4">ํšŒ์› ๋ชฉ๋ก</h3>
            <%--            table.table.table-striped>thead>tr>th*5--%>
            <table class="table">
                <thead>
                <tr>
                    <th>NO</th>
                    <th>์ด๋ฉ”์ผ</th>
                    <th>๋น„๋ฐ€๋ฒˆํ˜ธ</th>
                    <th>๋‹‰๋„ค์ž„</th>
                    <th>๊ฐ€์ž…์ผ์ž</th>
                </tr>
                </thead>
                <tbody class="table-group-divider">
                <c:forEach items="${memberList}" var="member" varStatus="status">
                    <c:url value="/member" var="viewMember">
                        <c:param name="id" value="${member.id}"/>
                    </c:url>
                    <tr onclick="location.href='${viewMember}'">
                        <td style="color: blue">
                                ${fn:length(memberList)-status.index}
                        </td>
                        <td>
                                ${member.email}
                        </td>
                            <%--<a href="/member?id=${member.id}}">${member.id}</a>--%>
                        <td>${member.password}</td>
                        <td>${member.nickName}</td>
                        <td>${member.inserted}</td>
                    </tr>
                </c:forEach>
                </tbody>
            </table>

        </div>
    </div>
</div>


<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.min.js"
        integrity="sha512-ykZ1QQr0Jy/4ZkvKuqWn4iF3lqPZyij9iRv6sGqLRdTPkY69YX6+7wvVGmsdBbiIfN/8OdsI7HABjvEok6ZopQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</body>
</html>

ํšŒ์› ์ •๋ณด ํ™”๋ฉด (info.jsp)

<body>

<c:import url="/WEB-INF/fragment/navbar.jsp"/>

<%--div.container>div.row.justify-content-center>div.col-6--%>
<div class="container" style="font-family: 'TTHakgyoansimUndongjangL'">
    <div class="row justify-content-center">
        <div class="col-8">
            <h3 class="mb-4">ํšŒ์› ์ •๋ณด ์กฐํšŒ</h3>
            <%--                div*3>label.form-label+input.form-control--%>
            <div class="mb-3">
                <label for="emailInput" class="form-label">์ด๋ฉ”์ผ</label>
                <input readonly name="email" id="emailInput" type="email" class="form-control"
                       placeholder="E-mail" value="${member.email}">
            </div>
            <div class="mb-3">
                <label for="pwdInput" class="form-label">ํŒจ์Šค์›Œ๋“œ</label>
                <input readonly name="password" id="pwdInput" required type="text"
                       class="form-control" value="${member.password}">
            </div>
            <div class="mb-3">
                <label for="nickInput" class="form-label">๋ณ„๋ช…</label>
                <input readonly name="nickName" id="nickInput" required type="text"
                       class="form-control" value="${member.nickName}">
            </div>
            <div class="mb-3">
                <label for="insertedInput" class="form-label">๊ฐ€์ž…์ผ์ž</label>
                <input readonly name="inserted" id="insertedInput" required type="text"
                       class="form-control" value="${member.inserted}">
            </div>
            <div>
                <button class="btn btn-danger" form="formDelete">์‚ญ์ œ</button>
                <a href="/member/modify?id=${member.id}" class="btn btn-primary">์ˆ˜์ •</a>
            </div>

        </div>
    </div>
</div>


<%--div.d-none>form>input:h[name=id]--%>
<div class="d-none">
    <form action="/member/remove" id="formDelete" method="post" onsubmit="return confirm('ํƒˆํ‡ด ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?')">
        <input type="hidden" name="id" value="${member.id}">
    </form>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.min.js"
        integrity="sha512-ykZ1QQr0Jy/4ZkvKuqWn4iF3lqPZyij9iRv6sGqLRdTPkY69YX6+7wvVGmsdBbiIfN/8OdsI7HABjvEok6ZopQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</body>


ํšŒ์› ์ •๋ณด ์ˆ˜์ • ํ™”๋ฉด(modify.jsp)

<body>
<c:import url="/WEB-INF/fragment/navbar.jsp"/>

<div class="container" style="font-family: 'TTHakgyoansimUndongjangL'">
    <div class="row justify-content-center">
        <div class="col-8">
            <h3 class="mb-4">${member.id}๋ฒˆ ํšŒ์› ์ •๋ณด</h3>
            <form action="/member/modify" method="post"
            ">
            <input type="hidden" name="id" value="${member.id}">
            <div class="mb-4">
                <small style="background-color: beige; color: gray">โŒ ์ด๋ฉ”์ผ๊ณผ ๊ฐ€์ž…์ผ์ž๋Š” ์ˆ˜์ •ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.</small>
            </div>

            <div class="mb-3">
                <label for="emailInput" class="form-label">์ด๋ฉ”์ผ</label>
                <input id="emailInput" class="form-control" value="${member.email}" type="text"
                       aria-label="Disabled input example"
                       disabled>
            </div>
            <div class="mb-3">
                <label for="pwdInput" class="form-label">ํŒจ์Šค์›Œ๋“œ</label>
                <input name="password" id="pwdInput" required type="text"
                       class="form-control" value="${member.password}">
            </div>
            <div class="mb-3">
                <label for="pwdCheckInput" class="form-label">ํŒจ์Šค์›Œ๋“œ ํ™•์ธ</label>
                <input oninput="pwdCheck()" id="pwdCheckInput" required type="text"
                       class="form-control" value="${member.password}">
                <div class="form-text" id="checkMessage"></div>
            </div>
            <div class="mb-3">
                <label for="nickInput" class="form-label">๋ณ„๋ช…</label>
                <input oninput="pwdCheck()" name="nickName" id="nickInput" required type="text"
                       class="form-control" value="${member.nickName}">
            </div>
            <div class="mb-3">
                <label for="insertedInput" class="form-label">๊ฐ€์ž…์ผ์ž</label>
                <input readonly name="inserted" id="insertedInput" required type="text"
                       class="form-control" value="${member.inserted}" aria-label="Disabled input example"
                       disabled>
            </div>
            <div class="mb-3">
                <button class="btn btn-secondary">์ˆ˜์ •</button>
            </div>
            </form>
        </div>
    </div>
</div>

<script>
    function pwdCheck() {
        const pw = document.querySelector("#pwdInput").value;
        const pwCheck = document.querySelector("#pwdCheckInput").value;

        if (pw != pwCheck) {
            document.querySelector("#checkMessage").textContent = "ํŒจ์Šค์›Œ๋“œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."
        } else {
            document.querySelector("#checkMessage").textContent = ""
        }
    }
</script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.min.js"
        integrity="sha512-ykZ1QQr0Jy/4ZkvKuqWn4iF3lqPZyij9iRv6sGqLRdTPkY69YX6+7wvVGmsdBbiIfN/8OdsI7HABjvEok6ZopQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</body>

ํ™”๋ฉด(view)

ํšŒ์› ๊ฐ€์ž… ํ™”๋ฉด

ํšŒ์› ์ •๋ณด ๋ชฉ๋ก ํ™”๋ฉด

ํšŒ์› ์ •๋ณด ํ™”๋ฉด


ํšŒ์› ์ •๋ณด ์ˆ˜์ • ํ™”๋ฉด

profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

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