본문 바로가기
Spring

[웹프로젝트] 9. 마이페이지(2) 수정 요청

by moca7 2024. 10. 29.

 

 

 

ㅁ myinfo.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="contextPath" value="${pageContext.request.contextPath}" />
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<style>
    #profileImg{
        width:250px;
        height:250px;
        border:1px solid lightgray;
        border-radius: 50%;
    }
</style>

</head>
<body>

    <div class="container p-3">

        <!-- Header, Nav start -->
        <jsp:include page="/WEB-INF/views/common/header.jsp"/>
        <!-- Header, Nav end -->
   
        <!-- Section start -->
        <section class="row m-3" style="min-height: 500px">
   
          <div class="container border p-5 m-4 rounded">
            <h2 class="m-4">마이페이지</h2>
            <br>

            <div align="center">
                <img id="profileImg" src="${contextPath}<c:out value='${loginUser.profileURL}' default='/resources/images/defaultProfile.png' />" onclick="$('#profileImgFile').click();">
                <input type="file" id="profileImgFile" style="display:none;">
            </div>

            <form action="${contextPath}/member/update.do" method="post" id="myinfo_form">
                <div class="form-group">
                    <label for="userId">* ID :</label>
                    <input type="text" class="form-control" id="userId" name="userId" value="${ loginUser.userId }" readonly><br>
                   
                    <label for="userName">* Name :</label>
                    <input type="text" class="form-control" id="userName" name="userName" value="${ loginUser.userName }"><br>
                   
                    <label for="email"> &nbsp; Email :</label>
                    <input type="email" class="form-control" id="email" name="email" value="${ loginUser.email }"><br>
                   
                    <label for="phone"> &nbsp; Phone :</label>
                    <input type="tel" class="form-control" id="phone" name="phone" value="${ loginUser.phone}"><br>
                   
                    <label for="address"> &nbsp; Address :</label>
                    <input type="text" class="form-control" id="address" name="address" value="${ loginUser.address }"><br>
                   
                    <label for=""> &nbsp; Gender : </label> &nbsp;&nbsp;
                    <input type="radio" name="gender" id="Male" value="M">
                    <label for="Male">남자</label> &nbsp;&nbsp;
                    <input type="radio" name="gender" id="Female" value="F">
                    <label for="Female">여자</label><br>
                   
                    <script>
                        $(function(){
                                $("#myinfo_form :radio").filter("[value=${loginUser.gender}]").attr("checked", true);
                        })
                    </script>
                   
                   
                </div>
                <br>
                <div class="btns" align="center">
                    <button type="submit" class="btn btn-primary">수정하기</button>
                    <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#deleteForm">회원탈퇴</button>
                </div>
            </form>
         
          </div>
   
        </section>
        <!-- Section end -->
   
        <!-- Footer start -->
        <jsp:include page="/WEB-INF/views/common/footer.jsp"/>
        <!-- Footer end -->
   
    </div>
   

    <!-- 회원탈퇴 버튼 클릭시 보여질 Modal -->
    <div class="modal" id="deleteForm">
        <div class="modal-dialog">
            <div class="modal-content">
           
                <!-- Modal Header -->
                <div class="modal-header">
                <h4 class="modal-title">회원탈퇴</h4>
                <button type="button" class="close" data-dismiss="modal">&times;</button>
                </div>
               
                <!-- Modal body -->
                <div class="modal-body" align="center">
               
                    <b>
                                    탈퇴 후 복구가 불가능합니다. <br>  
                                    정말로 탈퇴 하시겠습니까?
                    </b>

                    <form action="" method="post">
                        비밀번호 :
                        <input type="password" name="" required>

                        <button type="submit" class="btn btn-danger">탈퇴하기</button>
                    </form>

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


   
</body>
</html>
 

 

- /member/update.do

- name값들 다 줬다.

 

 

 

 

ㅁ MemberController

 

 
package com.br.spring.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.br.spring.dto.MemberDto;
import com.br.spring.service.MemberService;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RequestMapping("/member")
@RequiredArgsConstructor
@Controller
public class MemberController {

      private final MemberService memberService;
      private final BCryptPasswordEncoder bcryptPwdEncoder;
   
     
    @PostMapping("/signin.do")
    public void signin(MemberDto m, HttpServletResponse response, HttpSession session, HttpServletRequest request) throws IOException {
        MemberDto loginUser = memberService.selectMember(m);

        // 로그인 성공시 => 세션에 회원정보를 담고, alert와 함께 메인 페이지로 이동
        // 로그인 실패시 => alert와 함께 기존에 보던 페이지 유지(아이디, 비번 입력하는 로그인 폼 유지. 작성하던 입력데이터도 그대로.)

        // script문을 응답데이터로 돌려줘서 흐름제어
        response.setContentType("text/html; charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<script>");

        if(loginUser != null && bcryptPwdEncoder.matches(m.getUserPwd(), loginUser.getUserPwd())) { // 로그인 성공
            session.setAttribute("loginUser", loginUser);
            out.println("alert('" + loginUser.getUserName() + "님 환영합니다~');");
            out.println("location.href = '" + request.getHeader("referer") + "';"); // 메인페이지가 아닌 이전에 보던 페이지로 이동
        }else { // 로그인 실패
            out.println("alert('로그인에 실패하였습니다. 아이디 및 비밀번호를 다시 확인해주세요.');");
            out.println("history.back();"); // modal이 띄워진 상태였으면 modal도 유지된다.
        }

        out.println("</script>");
    }
   
   
    @GetMapping("/signout.do")
    public String signout(HttpSession session) {
        session.invalidate();
        return "redirect:/";
    }
   
   
    @GetMapping("/signup.do")
    public void signupPage() { } //WEB-INF/views/member/signup.jsp
       
    @ResponseBody
    @GetMapping("/idcheck.do")
    public String idCheck(String checkId) {
        return memberService.selectUserIdCount(checkId) == 0 ? "YYYY" : "NNNN";
    }
   
   
    @PostMapping("/insert.do")
    public String signup(MemberDto m, RedirectAttributes rdAttributes) {
       
        log.debug("암호화 전 member: {}", m);
       
        m.setUserPwd( bcryptPwdEncoder.encode(m.getUserPwd()) );
       
        log.debug("암호화 후 member: {}", m);
       
       
        int result = memberService.insertMember(m);
       
        // 성공시 alert와 함께 메인페이지 이동
        // 실패시 alert와 함께 기존에 작업중이던 페이지 유지
        if(result > 0) {
            rdAttributes.addFlashAttribute("alertMsg", "성공적으로 회원가입 되었습니다.");
        }else {
            rdAttributes.addFlashAttribute("alertMsg", "회원가입에 실패하였습니다.");
            rdAttributes.addFlashAttribute("historyBackYN", "Y");
        }
       
        return "redirect:/";
    }
   
   
   
    @GetMapping("/myinfo.do")
    public void myinfoPage() {}
   
   
    @PostMapping("/update.do")
    public String modify(MemberDto m
                       , RedirectAttributes rdAttributes
                       , HttpSession session) {
       
        int result = memberService.updateMember(m);
       
        if(result > 0) {
            session.setAttribute("loginUser", memberService.selectMember(m));// 동일한 키값으로 담으면 덮어씌워진다.
            rdAttributes.addFlashAttribute("alertMsg", "성공적으로 정보수정 되었습니다.");
        }else {
            rdAttributes.addFlashAttribute("alertMsg", "정보수정에 실패하였습니다.");          
        }
       
        return "redirect:/member/myinfo.do";
    }
   
}

 

 

- input 요소의 key값(name 속성값)을 dto 객체의 필드명으로 하면 요청시 전달값이 매개변수의 MemberDto 객체에 곧바로 담긴다.

- id는 수정 불가하게끔 readonly 되어있어서 정보 수정을 할 순 없지만 값을 넘기긴 한다.

where 조건절에 id를 사용한다.

- id를 readonly가 아니라 disabled로 하는 분이 있다.

그러면 값이 넘어가지 않아서 readonly를 주셔야 한다.

 

- 마이페이지로 포워딩이 아닌 리다이렉트한다. url 재요청한다.

- 성공, 실패시 각기 다른 메세지를 alert로 띄운다. 뭐가 됐든 마이페이지로 리다이렉트한다.

 

 

 

 

 

ㅁ member-mapper.xml

 

 

 

 

 

ㅁ 서버키고 정보변경 해보기

 

 

- 로그인부터 다시하고 정보변경해본다.

- 성별 정보가 없던 유저로 로그인해서 젠더를 고르고 수정하기를 누르면,

alert로 성공에 수정했다는 메세지가 뜨고 현재 이 페이지가 다시 보여진다.

- 성별이 checked된 채로 보여진다. db에도 반영되었다.