728x90

RedirectAttributes / addFlashAttribute

 

RedirectAttributes 

리다이렉트 시 데이터를 전달하는 방법 중 하나로, 스프링 프레임워크에서는 RedirectAttributes를 제공한다.

리다이렉트 동작 원리

  1. HTTP 요청 흐름:
    • 리다이렉트가 발생하면 기존 요청이 끊기고 새로운 HTTP GET 요청이 시작된다.
  2. 모델 데이터의 소멸:
    • 리다이렉트 이전에 수행된 모델 데이터는 새로운 요청이 시작되면서 사라지기 때문에, 리다이렉트를 통해 모델을 전달하는 것은 불가능하다.

쿼리스트링 사용의 문제점

  • 데이터를 전달하기 위해 쿼리스트링을 사용할 경우, URL에 데이터가 노출되는 단점이 있다.

RedirectAttributes 사용의 장점

  • 플래시 속성 사용:
    • RedirectAttributes는 리다이렉트 전 플래시 속성을 세션에 저장하고, 리다이렉트 후 해당 속성을 세션에서 모델로 이동시킨다.
    • 이 방식은 헤더에 파라미터를 붙이지 않기 때문에 URL에 노출되지 않는다.
  • 일회성 속성:
    • addFlashAttribute를 사용하여 일회성 성공 알림 등을 구현할 수 있다.
    • 플래시 속성은 일회성으로, 새로고침하면 사라진다.

cf)

@PostMapping("/submit")
public String handleFormSubmission(RedirectAttributes redirectAttributes) {
    // 비즈니스 로직 수행 후
    redirectAttributes.addFlashAttribute("message", "성공적으로 처리되었습니다.");
    return "redirect:/success";
}

@GetMapping("/success")
public String showSuccessPage(Model model) {
    // 플래시 속성으로부터 데이터 가져오기
    String message = (String) model.getAttribute("message");
    model.addAttribute("message", message);
    return "successPage";
}

 

실제 구현 코드

package kr.bit.controller;


import kr.bit.entity.Member;
import kr.bit.mapper.MemberMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpSession;

@Controller
public class MemberController {

    @Autowired
    MemberMapper memberMapper;

    @RequestMapping(value = "/memberJoin")
    public String memberJoin() {
        return "member/join";
    }

    @RequestMapping("/memberRegisterCheck") //ajax에서 넘긴 id값을 주입받음
    public @ResponseBody int memberRegisterCheck(@RequestParam("memberID") String memberID) {

        Member m = memberMapper.registerCheck(memberID);
        if (m != null || memberID.equals("")) {
            return 0; // 이미 존재하는 아이디
        }
        return 1; //새로 생성되는 아이디
    }

    @RequestMapping("/memberRegister")
    public String memberRegister(Member member, String memberPw1, String memberPw2, RedirectAttributes rttr, HttpSession session) {
        if (member.getMemberID().equals("") ||
                memberPw1.equals("") ||
                memberPw2.equals("") ||
                member.getMemberName().equals("") ||
                member.getMemberGender().equals("") ||
                member.getMemberEmail().equals("")) {
            rttr.addFlashAttribute("msg1", "실패!");
            rttr.addFlashAttribute("msg2", "필수 입력사항을 모두 입력해주세요!");
            return "redirect:/memberJoin";
        }
        if (!memberPw1.equals(memberPw2)) {
            rttr.addFlashAttribute("msg1", "실패!");
            rttr.addFlashAttribute("msg2", "비밀번호가 일치하지 않습니다!");
            return "redirect:/memberJoin";
        }
        int result = memberMapper.register(member); // db에 회원정보 저장
        member.setMemberProfile("");

        if (result == 1) { //1행 추가됨 -> insert 성공되면
            rttr.addFlashAttribute("msg1", "a");
            rttr.addFlashAttribute("msg2", "회원가입에 성공했습니다");

            session.setAttribute("memberVo",member);

            return "redirect:/";

        } else {
            rttr.addFlashAttribute("msg1", "실패");
            rttr.addFlashAttribute("msg2", "회원가입에 실패했습니다");

            return "redirect:memberJoin/";

        }

    }
}

 

join.jsp

추가 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="root" value="${pageContext.request.contextPath}"/>

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>

    <script type="text/javascript">
        $(document).ready(function () {

            if (${!empty msg1}) {
                $("#msgType").attr("class", "modal-content panel-warning");
                $("#failModal").modal("show");
            }
        });

        function doubleCheck() {
            let memberID = $("#memberID").val(); // 폼에서 적은 id값 가져오기

            $.ajax({
                url: "${root}/memberRegisterCheck",
                type: "get",
                data: {"memberID": memberID},
                success: function (result) {
                    if (result == 1) {
                        $("#checkMessage").html("사용할 수 있는 아이디입니다.");
                    } else {
                        $("#checkMessage").html("사용할 수 없는 아이디입니다.");
                    }
                    $("#exampleModal").modal("show");
                },
                error: function () {
                    alert("error");
                }
            });
        }

        function goInsert(){

            let memberAge=$("#memberAge").val();
            if(memberAge==0 || memberAge==""){ // 입력한 값과 비교하기 위해서 공백처리(입력한값)
                alert("나이를 입력하세요!");
                return false;
            }
            document.frm.submit(); //서버에 전송
        }

        function passwordCheck() {
            let memberPw1 = $("#memberPw1").val();
            let memberPw2 = $("#memberPw2").val();

            if (memberPw1 != memberPw2) {
                $("#passMessage").html("비밀번호가 일치하지 않습니다");
            } else {
                $("#passMessage").html("비밀번호가 일치합니다!").css("color", "green");
                $("#memberPw").val(memberPw1); // 서버에 히든값으로 전송
            }
        }

    </script>
    <style>
        body {
            background-color: #f8f9fa;
            font-family: 'Helvetica Neue', Arial, sans-serif;
            padding-top: 50px;
        }

        .form-container {
            background: white;
            padding: 40px;
            border-radius: 12px;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
        }

        .form-control {
            border-radius: 30px;
            padding: 15px;
        }

        .btn-custom {
            border-radius: 30px;
            background-color: #007bff;
            border: none;
            color: white;
            transition: background-color 0.3s ease;
        }

        .btn-custom:hover {
            background-color: #0056b3;
        }

        .modal-header {
            background-color: #343a40;
            color: white;
        }

        .modal-footer .btn-secondary {
            border-radius: 30px;
        }
    </style>
</head>
<body>
<div class="container d-flex justify-content-center">
    <div class="col-md-8 form-container">
        <h2 class="text-center mb-4">회원가입</h2>
        <!-- 회원가입 폼 시작 -->
        <form name="frm" action="${root}/memberRegister" method="post">
            <input type="hidden" id="memberPw" name="memberPw" value=""/>
            <div class="mb-3">
                <label for="memberID" class="form-label">아이디</label>
                <div class="input-group">
                    <input type="text" class="form-control" id="memberID" name="memberID" placeholder="아이디를 입력해">
                    <button type="button" class="btn btn-custom ms-2" onclick="doubleCheck()">중복확인</button>
                </div>
            </div>
            <div class="mb-3">
                <label for="memberPw1" class="form-label">비밀번호</label>
                <input type="password" class="form-control" id="memberPw1" name="memberPw1" onkeyup="passwordCheck()"
                       placeholder="비밀번호 입력">
            </div>
            <div class="mb-3">
                <label for="memberPw2" class="form-label">비밀번호 확인</label>
                <input type="password" class="form-control" id="memberPw2" name="memberPw2" onkeyup="passwordCheck()"
                       placeholder="비밀번호 확인">
            </div>
            <div class="mb-3">
                <label for="memberName" class="form-label">이름</label>
                <input type="text" class="form-control" id="memberName" name="memberName" placeholder="이름을 입력하세요">
            </div>
            <div class="mb-3">
                <label for="memberAge" class="form-label">나이</label>
                <input type="number" class="form-control" id="memberAge" name="memberAge" maxlength="10"
                       placeholder="나이를 입력하세요">
            </div>
            <div class="mb-3">
                <label for="memberGender" class="form-label">성별</label>
                <div class="d-flex">
                    <div class="form-check me-3">
                        <input class="form-check-input" type="radio" name="memberGender" id="male" value="남자" checked>
                        <label class="form-check-label" for="male">남자</label>
                    </div>
                    <div class="form-check">
                        <input class="form-check-input" type="radio" name="memberGender" id="female" value="여자">
                        <label class="form-check-label" for="female">여자</label>
                    </div>
                </div>
            </div>
            <div class="mb-3">
                <label for="memberEmail" class="form-label">이메일</label>
                <input type="email" class="form-control" id="memberEmail" name="memberEmail" maxlength="50"
                       placeholder="이메일을 입력하세요" onkeyup="emailCheck()">
            </div>
            <div class="d-flex justify-content-between align-items-center">
                <span id="passMessage" class="text-danger"></span>
                <button type="button" class="btn btn-custom" onclick="goInsert()">등록</button>
            </div>
        </form>
        <!-- 회원가입 폼 끝 -->
    </div>
</div>

<!-- 모달 -->
<div class="modal fade" id="exampleModal" role="dialog">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h3>메시지 확인</h3>
            </div>
            <div class="modal-body">
                <p id="checkMessage"></p>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary"
                        data-dismiss="modal">Close
                </button>
            </div>
        </div>
    </div>
</div>

<!-- 실패 -->
<div class="modal fade" id="failModal" role="dialog">
    <div class="modal-dialog">
        <div class="modal-content" id="msgType">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h3>${msg1 }</h3>
            </div>
            <div class="modal-body">
                <p>${msg2 }</p>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary"
                        data-dismiss="modal">Close
                </button>
            </div>
        </div>
    </div>
</div>

</body>
</html>

로그인기능

모달 추가!

home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <!-- jQuery 라이브러리 -->
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script> <!-- Bootstrap 라이브러리 -->
    <script type="text/javascript">
        $(document).ready(function () {
            if(${!empty msg1}){
                $("#msgType").attr("class","modal-content panel-warning");
                $("#failModal").modal("show");

            }
        });
    </script>
</head>
<body>
<div class="container">
    <jsp:include page="include/top.jsp"/>
        <div class="panel panel-default">
            <div class="panel-body">
                <ul class="nav nav-tabs">
                    <li class="active"><a data-toggle="tab" href="#home">Home</a></li>
                    <li><a href="MainBoard">게시판</a></li>
                    <li><a href="#" data-toggle="tab" >공지</a></li>
                </ul>

                <div class="tab-content">
                    <div class="tab-pane fade show active" id="home">
                        <h4>Home</h4>
                        <p>content</p>
                    </div>

                    <div class="tab-pane fade show " id="home1">
                        <h4>게시판</h4>
                        <p>content</p>
                    </div>

                    <div class="tab-pane fade show " id="home2">
                        <h4>공지</h4>
                        <p>content</p>
                    </div>
                </div>
            </div>
    </div>
</div>

<div class="modal fade" id="failModal" role="dialog">
    <div class="modal-dialog">
        <div class="modal-content" id="msgType">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                <h3>${msg1 }</h3>
            </div>
            <div class="modal-body">
                <p>${msg2 }</p>
            </div>
            <div class="modal-footer">
                <button type="button"  class="btn btn-secondary"
                        data-dismiss="modal">Close
                </button>

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

top.jsp

<%--
  Created by IntelliJ IDEA.
  User: thddm
  Date: 2024-05-21
  Time: 오후 12:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="root" value="${pageContext.request.contextPath }"/>
<nav class="navbar navbar-expand-Lg navbar-dark bg-dark">
    <div class="container-fluid">
        <div class="navbar-header">
            <button class="navbar-toggle" type="button" data-toggle="collapse" data-target="#Navbar">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="${root }/">Spring Legacy</a>
        </div>

        <div class="collapse navbar-collapse" id="Navbar">
            <ul class="nav navbar-nav">

                <li><a href="MainBoard">게시판</a></li>
            </ul>
            <c:if test="${empty memberVo }">
                <!-- 회원정보 비어있을 경우 -->
                <ul class="nav navbar-nav">
                    <li class="dropdown"><a class="dropdown-toggle" href="#"
                                            data-toggle="dropdown"> 클릭! </a>
                        <ul class="dropdown-menu dropdown-menu-dark">
                            <li><a class="dropdown-item" href="${root }/memberLoginForm">로그인 </a></li>
                            <li><a class="dropdown-item" href="${root }/memberJoin">회원가입</a></li>
                        </ul></li>
                </ul>
            </c:if>

            <c:if test="${!empty memberVo }">
                <ul class="nav navbar-nav">
                    <li class="dropdown"><a class="dropdown-toggle" href="#"
                                            data-toggle="dropdown"> 클릭! </a>
                        <ul class="dropdown-menu dropdown-menu-dark">
                            <li><a class="dropdown-item" href="#">회원수정</a></li>
                            <li><a class="dropdown-item" href="#">사진</a></li>
                            <li><a class="dropdown-item" href="${root }/memberLogout">로그아웃</a></li>
                        </ul></li>
                </ul>
            </c:if>
        </div>
    </div>
</nav>
<html>
<head>
    <title>Title</title>
</head>
<body>

</body>
</html>
<li class="nav-item dropdown">
    <a href="${root }/">
        Home
    </a>
</li>

 

memberController

package kr.bit.controller;

import kr.bit.entity.Member;
import kr.bit.mapper.MemberMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.servlet.http.HttpSession;

@Controller
public class MemberController {
    @Autowired
    MemberMapper memberMapper;

    @RequestMapping("/memberJoin")
    public String join() {
        return "member/join";
    }

    @RequestMapping("/member/checkDuplicate")
    public @ResponseBody int checkDuplicate(@RequestParam("memberID") String memberID) {

        Member m = memberMapper.registerCheck(memberID);

        if (m == null || memberID.isEmpty()) {
            return 0;
        }
        return 1;
    }

    @RequestMapping("/memberRegister")
    public String memberRegister(Member member, String memberPw1, String memberPwCheck,
                                 RedirectAttributes rttr, HttpSession session) { //@ModelAttribute 생략  Model model 앞
        if (member.getMemberID().equals("") ||
                memberPw1.equals("") ||
                memberPwCheck.equals("") || member.getMemberName().equals("") ||
                member.getMemberGender().equals("") ||
                member.getMemberEmail().equals("")) {
            rttr.addFlashAttribute("msg1", "실패");
            rttr.addFlashAttribute("msg2", "입력해주세요");

            return "redirect:/memberJoin";
        }

        if (!memberPw1.equals(memberPwCheck)) {
            rttr.addFlashAttribute("msg1", "실패");
            rttr.addFlashAttribute("msg2", "비밀번호가 다릅니다");

            return "redirect:/memberJoin";
        }

        int result = memberMapper.memberRegister(member); // db에 회원정보 삽입
        member.setMemberProfile("");
        if (result == 1) { //1행 추가됨 <- insert 가 성공했다는 전제하
            rttr.addFlashAttribute("msg1", "성공 메세지");
            rttr.addFlashAttribute("msg2", "회원가입에 성공했습니다.");

            session.setAttribute("memberVo", member);

            return "redirect:/";
        } else {
            rttr.addFlashAttribute("msg1", "실패");
            rttr.addFlashAttribute("msg2", "회원가입에 실패했습니다");
            return "redirect:memberJoin/";
        }
    }

    @RequestMapping("/memberLoginForm")
    public String memberLoginForm() {
        return "member/memberLoginForm";
    }

    @RequestMapping("/memberLogout")
    public String memberLogout(HttpSession session) {
        session.invalidate();
        return "redirect:/";
    }

    @RequestMapping("/memberLogin")
    public String memberLogin(Member member, RedirectAttributes rttr,
                              HttpSession session) {

        if(member.getMemberID().equals("") ||
                member.getMemberPw().equals("")) {

            rttr.addFlashAttribute("msg1","실패");
            rttr.addFlashAttribute("msg2","아이디나 비밀번호를 입력하세요");

            return "redirect:memberLoginForm/";
        }

        Member memberVo=memberMapper.memberLogin(member);
        //id와 pw가 일치할경우 회원정보들을 memberVo에 저장

        if(memberVo!=null) {
            rttr.addFlashAttribute("msg1","성공");
            rttr.addFlashAttribute("msg2","로그인 되었습니다");

            session.setAttribute("memberVo", memberVo);

            return "redirect:/";
        }
        else {

            rttr.addFlashAttribute("msg1","실패");
            rttr.addFlashAttribute("msg2","로그인 다시 하세요");
            return "redirect:memberLoginForm/";
        }
    }
}


로그인 사용자 출력

바디 부분에 추가

<body>
<div class="container">
    <jsp:include page="include/top.jsp"/>
    <c:if test="${empty memberVo }">
        <h3>Spring Legacy</h3>
    </c:if>

    <c:if test="${!empty memberVo}">
        <h3>${memberVo.memberName}님 환영합니다!</h3>
    </c:if>


회원정보수정

memberUpdateForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="root" value="${pageContext.request.contextPath }"/>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>

    <script type="text/javascript">
        $(document).ready(function(){

            if(${!empty msg1}){
                $("#msgType").attr("class","modal-content panel-warning");
                $("#failModal").modal("show");
            }
        });

        function passwordCheck(){

            let memberPw1=$("#memberPw1").val();
            let memberPw2=$("#memberPw2").val();

            if(memberPw1 != memberPw2){
                $("#passMessage").html("비밀번호가 일치하지 않습니다");
            }
            else{   //(비번, 비번확인이 일치한다면)
                $("#passMessage").html("비밀번호가 일치합니다").css("color", "yellowgreen");
                $("#memberPw").val(memberPw1); //히든 value값에 비번 넣음

            }
        }

        function goUpdate(){

            let memberAge=$("#memberAge").val();
            if(memberAge==0 || memberAge==""){
                alert("나이를 입력하세요!");
                return false;
            }
            document.frm.submit();  //서버에 전송

        }
    </script>
</head>
<style>
    body {
        background-color: #f8f9fa; /* 배경색 변경 */
    }

    .panel-heading {
        background-color: #007bff; /* 헤더 색 변경 */
        color: white;
    }

    .form-control {
        border-radius: 25px; /* 입력 필드 둥글게 */
        box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* 입력 필드 그림자 */
    }

    .btn-primary {
        background-color: #ff4081; /* 버튼 색 변경 */
        border-color: #ff4081;
        border-radius: 25px;
    }

    .btn-primary:hover {
        background-color: #f06292; /* 버튼 호버 효과 */
        border-color: #f06292;
    }
</style>
<body>
<div class="container">
    <jsp:include page="../include/top.jsp"/>
    <div class="panel panel-default">
        <div class="panel-heading">회원 정보 수정
        </div>
        <div class="panel-body">
            <form name="frm" action="${root }/memberUpdate" method="post">
                <input type="hidden" id="memberID" name="memberID" value="${memberVo.memberID }" />
                <input type="hidden" id="memberPw" name="memberPw" value="" />
                <table class='table table-bordered' style="text-align: center;">
                    <tr>
                        <td style="width: 100px; vertical-align: middle;">아이디</td>
                        <td>${memberVo.memberID }</td>
                    </tr>

                    <tr>
                        <td style="width: 100px; vertical-align: middle;" />비밀번호
                        </td>
                        <td colspan="2"><input class="form-control" type="password"
                                               id="memberPw1" name="memberPw1" onkeyup="passwordCheck()"
                                               placeholder="비밀번호를 입력" /></td>
                    </tr>

                    <tr>
                        <td style="width: 100px; vertical-align: middle;" />비밀번호확인
                        </td>
                        <td colspan="2"><input class="form-control" type="password"
                                               id="memberPw2" name="memberPw2" onkeyup="passwordCheck()"
                                               placeholder="비밀번호 확인" /></td>
                    </tr>

                    <tr>
                        <td style="width: 100px; vertical-align: middle;" />이름
                        </td>
                        <td colspan="2"><input class="form-control" type="text"
                                               id="memberName" name="memberName" placeholder="이름을 확인"
                                               value=${memberVo.memberName } /></td>
                    </tr>

                    <tr>
                        <td style="width: 100px; vertical-align: middle;">나이</td>
                        <td colspan="2"><input id="memberAge" name="memberAge"
                                               class="form-control" type="number" maxlength="10"
                                               placeholder="나이를 입력하세요."
                                               value=${memberVo.memberAge } /></td>
                    </tr>

                    <tr>
                        <td style="width: 100px; vertical-align: middle;">성별</td>
                        <td colspan="2">
                            <div class="form-group"
                                 style="text-align: center; margin: 0 auto;">

                                <input type="radio" name="memberGender" autocomplete="off"
                                       value="남자"
                                       <c:if test="${memberVo.memberGender eq '남자'}">checked</c:if> />남자


                                <input type="radio"
                                       name="memberGender" autocomplete="off" value="여자"
                                       <c:if test="${memberVo.memberGender eq '여자'}">checked</c:if> />여자
                            </div>
        </div>
        </td>
        </tr>

        <tr>
            <td style="width: 100px; vertical-align: middle;">이메일</td>
            <td colspan="2"><input id="memberEmail" name="memberEmail"
                                   class="form-control" type="text" maxlength="20"
                                   placeholder="이메일을 입력하세요." value="${memberVo.memberEmail }"/></td>
        </tr>

        <tr>
            <td colspan="3" style="text-align: left;"><span
                    id="passMessage" style="color: red"></span><input type="button"
                                                                      class="btn btn-primary btn-sm pull-right" value="수정"
                                                                      onclick="goUpdate()" /></td>

        </tr>

        </table>
        </form>
    </div>

    <!-- 모달 -->
    <div class="modal fade" id="exampleModal" role="dialog">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                    <h3>메시지 확인</h3>
                </div>
                <div class="modal-body">
                    <p id="checkMessage"></p>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary"
                            data-dismiss="modal">Close</button>
                </div>
            </div>
        </div>
    </div>

    <!-- 실패 -->
    <div class="modal fade" id="failModal" role="dialog">
        <div class="modal-dialog">
            <div class="modal-content" id="msgType">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal">&times;</button>
                    <h3>${msg1 }</h3>
                </div>
                <div class="modal-body">
                    <p>${msg2 }</p>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary"
                            data-dismiss="modal">Close</button>
                </div>
            </div>
        </div>
    </div>
</div>
</div>
</body>

 

memberController

@RequestMapping("/memberUpdateForm")
public String memberUpdateForm() {
    return "member/memberUpdateForm";
}

@RequestMapping("/memberUpdate")
public String memberUpdate(Member member, String memberPw1, String memberPw2,
                           RedirectAttributes rttr, HttpSession session) { //@ModelAttribute 생략  Model model 앞
    if (member.getMemberID().equals("") ||
            memberPw1.equals("") ||
            memberPw2.equals("") || member.getMemberName().equals("") ||
            member.getMemberGender().equals("") ||
            member.getMemberEmail().equals("")) {
        rttr.addFlashAttribute("msg1", "실패");
        rttr.addFlashAttribute("msg2", "입력해주세요");

    }
    if (!memberPw1.equals(memberPw2)) {
        rttr.addFlashAttribute("msg1", "실패");
        rttr.addFlashAttribute("msg2", "비밀번호가 다릅니다");

        return "redirect:/memberUpdateForm";
    }

    int result = memberMapper.memberUpdate(member);

    if (result == 1) {
        rttr.addFlashAttribute("msg1", "성공");
        rttr.addFlashAttribute("msg2", "회원정보 수정에 성공했습니다.");

        session.setAttribute("memberVo", member);
        //수정된 데이터들을 세션영역 memberVo에 담아서 redirect로 화면이동

        return "redirect:/";
    } else { // 수정 실패했을 때
        rttr.addFlashAttribute("msg1", "실패");
        rttr.addFlashAttribute("msg2", "회원정보 수정에 실패했습니다.");

        return "redirect:/memberUpdateForm";
    }
}

 

MemberMapper.xml

<update id="memberUpdate" parameterType="kr.bit.entity.Member">
    update member_table
    set memberPw=#{memberPw},
        memberName=#{memberName},
        memberAge=#{memberAge},
        memberGender=#{memberGender},
        memberEmail=#{memberEmail}
    where memberID = #{memberID}
    </update>

 

MemberMapper.interface

package kr.bit.mapper;

import kr.bit.entity.Member;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface MemberMapper {
    public Member registerCheck(String memberID);

    public int memberRegister(Member member);

    public  Member memberLogin(Member memberVo);

    public int memberUpdate(Member memberVo);
}

728x90

+ Recent posts