[Spring] 회원 정보 수정하기
안녕하세요 코북입니다. 오늘은 회원 정보 수정 기능을 구현했습니다. 앞에서 회원가입과 로그인을 구현했다면 회원 정보 수정은 쉽게 구현할 수 있습니다. 작업순서는 다음과 같습니다.
- MyBatis XML Mapper
- Mapper Interface
- Controller
- 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속성을 사용해 초기값을 설정해 줄 수 있었습니다.