완료 기능
✅ 1 - 회원가입, 로그인, 아이디 중복체크, 글 목록보기, 상세보기, 수정, 삭제, 썸네일 추가
✅ 2 - 댓글목록보기, 댓글쓰기, 댓글삭제, 프로필사진 수정 // 관리자페이지
회원정보 페이지로 이동하면 사용자 정보가 입력이 된 상태로 로딩되도록 한다.
로그인 성공시 세션에 유저 오브젝트를 넣는다
session.setAttribute("principal", principal);
익셉션 핸들러를 사용하기 위해 폼 태그로 데이터를 넘겼다
<form action="/user/update" method="post">
<input type="text" name="username" placeholder="Enter username" id="username"
value="${principal.username}" readonly>
<input type="password" name="password" placeholder="Enter password" id="password"
value="${principal.password}">
<input type="email" name="email" placeholder="Enter email" id="email"
value="${principal.email}">
<input type="hidden" name="id" value="${principal.id}">
<button type="submit" id="update-btn" class="btn btn-primary">회원수정</button>
</form>
폼태그의 데이터를 받을 dto 생성 - UserUpdateReqDto
public class UserUpdateReqDto {
@Getter
@Setter
public static class UpdateReqDto{
private Integer id;
private String password;
private String email;
}
}
폼태그의 요청을 받는 컨트롤러
@PostMapping("/user/update")
@ResponseBody
public String update(UserUpdateReqDto updateReqDto){
User principal = (User)session.getAttribute("principal");
if( principal == null ){
throw new CustomException("로그인이 필요합니다.");
}
service.회원수정(updateReqDto, principal.getId());
User principalPs = userRepository.findById(principal.getId());
session.setAttribute("principal", principalPs);
return Script.href("수정완료","/");
}
자바오브젝트를 파라미터로 넣으면 폼 태그에서 보내는 데이터타입인 x-www-form-urlencoded
을 스프링의 기본 파싱 전략에 의해 자바오브젝트로 자동 파싱해준다.
수정 완료시 리턴하는 Script.href()
메소드
@ResponseBody
어노테이션에 의해 브라우저의 스크립트엔진이 해석한다.
public static String href(String msg, String url) {
StringBuilder sb = new StringBuilder();
sb.append("<script>");
sb.append("alert('"+msg+"');");
sb.append("location.href='"+url+"';");
sb.append("</script>");
return sb.toString();
}
회원수정 서비스 로직
@Transactional
public void 회원수정(UserUpdateReqDto updateReqDto, int principalId){
if( updateReqDto.getId() != principalId){
throw new CustomException("본인 정보만 수정 가능합니다.");
}
if (updateReqDto.getPassword() == null || updateReqDto.getPassword().isEmpty()) {
throw new CustomException("password를 작성해주세요");
}
if (updateReqDto.getEmail() == null || updateReqDto.getEmail().isEmpty()) {
throw new CustomException("email을 작성해주세요");
}
try {
userRepository.updateUser(updateReqDto);
} catch (Exception e) {
throw new CustomException("서버의 일시적인 오류로 수정에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
회원 수정시 입력 안하면
제대로 입력하면 수정이 되고 메인화면으로 이동한다