회원정보는 회원가입시 입력한 폼과 같은 곳에 value 속성을 이용해 값을 불러온다.
같은 페이지에서 회원수정까지 가능하게 한다.
회원정보 불러오기
1. form 페이지 작성
<title>회원가입</title>
</head>
<body>
<jsp:include page="/WEB-INF/views/module/nav.jsp" flush="false"/>
<section>
<div class="jumbotron background-lightgreen pt-5 pb-5">
<div class="container">
<h2 class="display-3 font text-center">회원가입</h2>
</div>
</div>
</section>
<section>
<div class="container" style="padding: 100px 0;">
<div class="d-flex">
<div class="form col-sm-5 offset-md-1 border-right me-5">
<form:form action="/pet_hug/member/update_info" modelAttribute="member" class="form-horizontal">
<h2 class="form-title mb-4">회원 정보</h2>
<div class="form-group row">
<label for="" class="col-sm-3 control-label">아이디</label>
<div class="col-sm-3">
<form:input class="input" readonly="true" path="mem_id" value="${member.mem_id}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">비밀번호</label>
<div class="col-sm-3">
<form:password class="input" required="required" path="mem_pw" value="${member.mem_pw}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">이름</label>
<div class="col-sm-3">
<form:input class="input" required="required" path="mem_name" maxlength="17" value="${member.mem_name}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">닉네임</label>
<div class="col-sm-3">
<form:input class="input" path="mem_nickname" minlength="2" maxlength="10" placeholder="2~10글자" value="${member.mem_nickname}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">전화번호</label>
<div class="col-sm-3">
<form:input class="input" maxlength="11" path="mem_phone" placeholder="'-' 없이 숫자만 입력해주세요" value="${member.mem_phone}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">이메일</label>
<div class="col-sm-3">
<form:input class="input" maxlength="40" path="mem_email" value="${member.mem_email}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">주소</label>
<div class="col-sm-3">
<form:input class="input" maxlength="60" path="mem_addr" required="required" value="${member.mem_addr}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">상세주소</label>
<div class="col-sm-3">
<form:input class="input" maxlength="60" path="mem_addr2" required="required" value="${member.mem_addr2}"/>
</div>
</div>
</form:form>
</div>
</div>
</div>
</section>
<jsp:include page="/WEB-INF/views/module/footer.jsp" flush="false"/>
</body>
</html>
2. Repository 작성
@Override
public Member get_member_info(String sessionId) {
String sql = "select mem_id from user_mem where mem_id = ?";
System.out.println("sessionId와 일치하는 mem_id 취득");
String mem_id = template.queryForObject(sql, new Object[] {sessionId}, String.class);
System.out.println("mem_id로 해당하는 row 취득");
String sql2 = "select * from user_mem where mem_id = ?";
Member member = template.queryForObject(sql2, new Object[] {mem_id}, new BeanPropertyRowMapper<>(Member.class));
System.out.println("member 반환");
return member;
}
sessionId로 바로 row를 검색하고 싶은데 template을 잘 다루지 못해서 일단은 구현만 해놓고 나중에 수정할 계획이다.
+2024.02.16. 수정
중괄호{}가 안에 들어갈 값을 정하는 기호였다. 아주 간단하게 수정할 수 있었다.
public Member get_member_info(String sessionId) {
String sql2 = "select * from user_mem where mem_id = ?";
Member member = template.queryForObject(sql2, new Object[] {sessionId}, new BeanPropertyRowMapper<>(Member.class));
System.out.println("member 반환");
return member;
}
sessionId를 통해 얻은 mem_id 대신에 sessionId를 바로 넣었다.
3. Service 작성
@Override
public Member get_member_info(String sessionId) {
System.out.println("memberRepository.get_member_info() 호출");
Member member = memberRepository.get_member_info(sessionId);
return member;
}
4. Controller 작성
@GetMapping("/info")
public String get_member_info(Model model) {
System.out.println("sessionId 취득");
String sessionId = (String)session.getAttribute("sessionId");
System.out.println("memberService.get_member_info() 호출");
Member member = memberService.get_member_info(sessionId);
model.addAttribute("member", member);
return "/member/member_info";
}
로그인 후 회원정보 조회
회원정보 수정
1. 뷰 페이지에 수정/취소 버튼 추가
<title>회원가입</title>
</head>
<body>
<jsp:include page="/WEB-INF/views/module/nav.jsp" flush="false"/>
<section>
<div class="jumbotron background-lightgreen pt-5 pb-5">
<div class="container">
<h2 class="display-3 font text-center">회원가입</h2>
</div>
</div>
</section>
<section>
<div class="container" style="padding: 100px 0;">
<div class="d-flex">
<div class="form col-sm-5 offset-md-1 border-right me-5">
<form:form action="/pet_hug/member/update_info" modelAttribute="member" class="form-horizontal">
<h2 class="form-title mb-4">회원 정보</h2>
<div class="form-group row">
<label for="" class="col-sm-3 control-label">아이디</label>
<div class="col-sm-3">
<form:input class="input" readonly="true" path="mem_id" value="${member.mem_id}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">비밀번호</label>
<div class="col-sm-3">
<form:password class="input" required="required" path="mem_pw" value="${member.mem_pw}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">이름</label>
<div class="col-sm-3">
<form:input class="input" required="required" path="mem_name" maxlength="17" value="${member.mem_name}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">닉네임</label>
<div class="col-sm-3">
<form:input class="input" path="mem_nickname" minlength="2" maxlength="10" placeholder="2~10글자" value="${member.mem_nickname}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">전화번호</label>
<div class="col-sm-3">
<form:input class="input" maxlength="11" path="mem_phone" placeholder="'-' 없이 숫자만 입력해주세요" value="${member.mem_phone}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">이메일</label>
<div class="col-sm-3">
<form:input class="input" maxlength="40" path="mem_email" value="${member.mem_email}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">주소</label>
<div class="col-sm-3">
<form:input class="input" maxlength="60" path="mem_addr" required="required" value="${member.mem_addr}"/>
</div>
</div>
<div class="form-group row">
<label for="" class="col-sm-3">상세주소</label>
<div class="col-sm-3">
<form:input class="input" maxlength="60" path="mem_addr2" required="required" value="${member.mem_addr2}"/>
</div>
</div>
<div class="form-group row mt-4">
<div class="col-sm-offset-2 col-sm-10">
<input type="submit" value="수정" class="offset-md-8 submit-green">
<a href="<c:url value="/home"/>" class="submit-red">취소</a><br>
</div>
</div>
</form:form>
</div>
</div>
</div>
</section>
<jsp:include page="/WEB-INF/views/module/footer.jsp" flush="false"/>
</body>
</html>
2. Repository 메서드 작성
@Override
public void update_member_info(Member member) {
System.out.println("Repository 도착");
System.out.println("Member 값: " + member.toString());
String sql = "UPDATE user_mem SET mem_pw = ?, mem_name = ?, mem_nickname = ?, mem_phone = ?, mem_email = ?, mem_addr = ?, mem_addr2 = ? where mem_id = ?;";
template.update(sql, member.getMem_pw(), member.getMem_name(), member.getMem_nickname(), member.getMem_phone(), member.getMem_email(), member.getMem_addr(), member.getMem_addr2(), member.getMem_id());
}
3. Service 메서드 작성
@Override
public void update_member_info(Member member) {
System.out.println("memberRepository.update_member_info() 호출");
memberRepository.update_member_info(member);
}
4. Controller 메서드 작성
@PostMapping("/update_info")
public String update_meber_info(@ModelAttribute("member")Member member, Model model, BindingResult result, HttpServletRequest request) {
System.out.println("update_member_info() 도착");
//업데이트
if(result.hasErrors()) {
return "/member/member_info";
}else {
System.out.println("memberService.update_member_info() 호출");
memberService.update_member_info(member);
}
//불러오기
model.addAttribute("member", member);
get_member_info(model);
return "member/member_info";
}
+2024.02.16. 수정
1. get_member_info()를 직접 호출하는 코드와 return "member/member_info";는 기능이 중복된다. 그리고 get_member_info()에서 마지막에 model.addAttribute("member", member);를 실행하기 때문에 무의미한 코드다.
2. 현재는 유효성검사를 따로 실행하는 게 아니라 html에서 input 태그의 제약조건으로만 하고 있기 때문에 굳이 BindingResult의 hasErrors()를 사용할 필요가 없다.
@PostMapping("/update_info")
public String update_meber_info(@ModelAttribute("member")Member member) {
System.out.println("update_member_info() 도착");
//업데이트
System.out.println("memberService.update_member_info() 호출");
memberService.update_member_info(member);
//불러오기
return "member/member_info";
}
코드가 간단해졌다.
'정리노트 > 팀프로젝트' 카테고리의 다른 글
[팀프로젝트] 24.02.16. 노트 (0) | 2024.02.16 |
---|---|
[스프링] 회원 탈퇴 구현 (0) | 2024.02.16 |
[팀프로젝트] 24.02.15. 노트 (0) | 2024.02.15 |
[스프링] 로그인 구현 (0) | 2024.02.15 |
[스프링] 회원가입 구현 (0) | 2024.02.14 |