Spring

[Spring] 회원 정보 수정하기

코북 2021. 11. 2. 16:32

 안녕하세요 코북입니다. 오늘은 회원 정보 수정 기능을 구현했습니다. 앞에서 회원가입과 로그인을 구현했다면 회원 정보 수정은 쉽게 구현할 수 있습니다. 작업순서는 다음과 같습니다. 

 

  1. MyBatis XML Mapper
  2. Mapper Interface
  3. Controller
  4. JSP

1. MyBatis XML Mapper

 먼저 회원정보를 수정할 수 있는 sql 쿼리를 만들어줍니다. update set 명령어를 사용했고 id값을 조건으로 합니다.

<mapper namespace="city.turtle.mapper.MembersMapper">
    <!-- 회원정보 수정 -->
    <update id = "updateMembers" parameterType="city.turtle.mapper.MembersVO">
        update MEMBERS
        set mb_nick=#{mb_nick}, mb_pwd =#{mb_pwd}, mb_name=#{mb_name}, 
        mb_birth=concat(#{mb_yy}, #{mb_mm}, #{mb_dd}), mb_gender=#{mb_gender}, mb_email=#{mb_email} 
        where mb_id = #{mb_id}
    </update>
</mapper>

2. Mapper Interface

  쿼리 수정 후 받아올 결괏값이 따로 없기 때문에 interface의 리턴 값은 void로 설정합니다.

package city.turtle.mapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface MembersMapper {
	
	public void updateMembers(MembersVO vo);
}

3. Controller

 회원 정보 수정 페이지를 불러오는 메소드와 실제 회원 정보 수정을 처리해주는 메소드 두 개를 만들어 줍니다. 정보 수정이기 때문에 forward보다는 redirect로 처리해주는 것이 좋습니다.

@Controller
public class CityTurtleController {
	
	@Autowired 
	private MembersMapper mapper;	
    
    // 회원 정보 수정 페이지
	@RequestMapping("/userUpdate.do")
	public String userUpdate() {
		return "userUpdate";
	}
    
	// 회원 정보 수정
	@RequestMapping("/updateMembers.do")
	public String updateMembers(MembersVO vo) {
		mapper.updateMembers(vo);
		return "redirect:/index.do";
	}
}

4. JSP

 사용자가 로그인 했을 때만 해당 페이지를 보여줄 것입니다. c:if태그를 사용해 Session값이 있는 경우에만 회원 정보 수정 폼을 보여주고, Session값이 null인 경우에는 로그인 페이지로 이동시킬 수 있는 페이지를 보여줍니다. 사용자에게 우리가 받아야 할 정보 중 가장 중요한 값은 ID값입니다. ID값으로 정보 수정할 회원을 구별할 수 있기 때문입니다. ID값은 회원가입 때 사용했던 jsp와 거의 동일합니다. 차이점은 input 태그의 value 속성을 사용해 회원의 아이디를 기본 값으로 설정해줬습니다. 사용자는 로그인을 한 후에 정보 수정 서비스를 사용할 수 있기 때문에 회원 정보 수정에 ID 입력 칸을 보여줄 필요가 없습니다. div태그에 style="display:none" 속성을 설정해 사용자가 입력창을 볼 수 없게 만들어 줍니다.  사용자가 기존에 사용하던 값을 볼 수 있도록 남은 input 태그에 value값을 설정해 초기 값을 설정해줍니다.

    <section class="bg-light">
        <div class="container py-4">
            <div class="row align-items-center justify-content-between">
                <a class="navbar-brand h1 text-center" href="index.do">
                    <span class="text-dark h4">도시</span> <span class="text-primary h4">거북</span>                 
                </a>
            </div>
            <c:if test="${signIn!=null}">
            <form action="updateMembers.do" method="post">
                <div class="form-group" style="display:none;">
               		<label for="mb_id" class="form-label mt-4">아이디</label>
                    <input type="text" class="form-control" name="mb_id" id="mb_id" value="${signIn.mb_id}">
					<div><font id="id_feedback" size="2"></font></div>
                </div>            	
                <div class="form-group">
               		<label for="mb_nick" class="form-label mt-4">닉네임</label>
                    <input type="text" class="form-control" name="mb_nick" value="${signIn.mb_nick}">
                </div>
				<div class="form-group has-success">
					<label class="form-label mt-4" for="inputValid">비밀번호</label>
					<input type="password" class="form-control" id="mb_pwd1" name="mb_pwd">
					<div class="valid-feedback"></div>
				</div>

				<div class="form-group has-danger">
					<label class="form-label mt-4" for="inputInvalid">비밀번호 재확인</label> 
					<input type="password" class="form-control" id="mb_pwd2">
					<div><font id="pwd_feedback" size="2"></font></div>
				</div>
                <div class="form-group">
               		<label for="exampleInputEmail1" class="form-label mt-4">이름</label>
                    <input type="text" class="form-control" name="mb_name" value="${signIn.mb_name}">
                </div>
                <div class ="bir_wrap">
                	<label class="form-label mt-4">생년월일</label>
                	<div class="bir_yy">
                		<span class="ps_box">
                			<input type="text" class="form-control" id="yy" placeholder="년(4자)" maxlength="4" name="mb_yy">
                		</span>
                	</div>
                	<div class="bir_mm">
                		<span class="ps_box focus">
			                <select class="form-select" id="mm" name ="mb_mm">
						        <option>월</option>
						        <option value="01">1</option>
						        <option value="02">2</option>
						        <option value="03">3</option>
						        <option value="04">4</option>
						        <option value="05">5</option>
						        <option value="06">6</option>
						        <option value="07">7</option>
						        <option value="08">8</option>
						        <option value="09">9</option>
						        <option value="10">10</option>
						        <option value="11">11</option>
						        <option value="12">12</option>
						     </select>
                		</span>
                	</div>
                	<div class="bir_dd">
                		<span class="ps_box">
                			<input type ="text" class="form-control" id ="dd" placeholder="일" maxlength="2" name="mb_dd">
                		</span>
                	</div>
                </div>
			    <div class="form-group">
			      <label for="mb_sex" class="form-label mt-4">성별</label>
			      <select class="form-select" name="mb_gender">
			        <option value="" selected disabled hidden>성별</option>
			        <option value="남자">남자</option>
			        <option value="여자">여자</option>
			        <option value="거북">거북</option>
			      </select>
			    </div>                
                <div class="form-group">
               		<label for="mb_email" class="form-label mt-4">본인 확인 이메일</label>
                    <input type="email" class="form-control" placeholder="선택입력" name="mb_email" value="${signIn.mb_email}">
                </div>
				<div class="d-grid gap-2">
                    <button class="btn btn-primary btn-lg" type="submit">적용 하기</button>
                </div>
            </form>
            </c:if>
            <c:if test="${signIn==null}">
	            <div>
	            	<h1 class ="text-dark text-center">회원 정보 수정 <br>페이지입니다.</h1>
	            	<p class="text-center"> 
	            		<span>로그인 후 사용하여 주시면 감사하겠습니다.</span>
	            	</p>
	            </div>
	            <div class="d-grid gap-2">
	           		<button type="button" class="btn btn-primary btn-lg" onclick="location.href='login.do'">로그인 하기</button>
	            </div>
            </c:if>
            
        </div>
    </section>

구현 화면

글씨가 너무 크네요 ^^;

사용 기술

SpringMVC, EL

배운 점

  초기에 회원 정보 수정한 값을 넘겨줄 때 id를 입력하는 칸을 지워버려서 id값이 넘어가지 않았습니다. 쿼리의 조건문에 id 값을 넘겨줘야 했기 때문에 다시 form태그 안에 input태그를 넣어 id를 입력하는 칸을 만들었습니다. 하지만 사용자가 id 입력하는 칸을 다시 볼 필요는 없었기 때문에 style="display:none" 속성을 넣어 사용자가 볼 수 없도록 만들어 줬습니다. input태그에 value속성을 사용해 초기값을 설정해 줄 수 있었습니다.