UserController
@PostMapping("/user/update")
public String update(@ModelAttribute(name = "updateDTO") UserDTO.UpdateDTO reqDTO) {
User sessionUser = (User) session.getAttribute("sessionUser");
if (sessionUser == null) {
return "redirect:/login-form";
}
// 유효성 검사는 생략
// 사용자 정보 수정
User updatedUser = userRepository.updateById(sessionUser.getId(), reqDTO.getPassword(), reqDTO.getEmail());
// 세션 정보 동기화 처리
session.setAttribute("sessionUser", updatedUser);
return "redirect:/";
}
/**
* 회원 정보 수정 페이지 요청
* 주소설계 : http://localhost:8080/user/update-form
*
*
* @return 문자열
* 반환되는 문자열을 뷰 리졸버가 처리하며
* 머스태치 템플릿 엔진을 통해서 뷰 파일을 렌더링 합니다.
*/
@GetMapping("/user/update-form")
public String updateForm(HttpServletRequest request) {
log.info("회원 수정 페이지");
User sessionUser = (User) session.getAttribute("sessionUser");
if(sessionUser == null) {
return "redirect:/login-form";
}
User user = userRepository.findById(sessionUser.getId());
request.setAttribute("user", user);
return "user/update-form"; // 템플릿 경로 : user/join-form.mustache
}
update-form.mustache 코드 수정
{{> layout/header}}
<main class="container p-5 content">
<div class="card">
<div class="card-header"><b>회원정보수정페이지</b></div>
<div class="card-body">
<form action="/user/update" method="post" enctype="application/x-www-form-urlencoded">
<div class="mb-3">
<input type="text" class="form-control" placeholder="enter username" name="username" value="{{user.username}}" disabled>
</div>
<div class="mb-3">
<input type="password" class="form-control" placeholder="enter password" name="password">
</div>
<div class="mb-3">
<input type="email" class="form-control" placeholder="enter email" name="email" value="{{user.email}}">
</div>
<button type="submit" class="btn btn-primary form-control">회원정보수정</button>
</form>
</div>
</div>
</main>
{{> layout/footer}}
UserRepository
// 사용자 정보 수정 기능 만들기 (더티 체킹 사용)
@Transactional // 더티 체킹 반영
public User updateById(int id, String password, String email) {
// id 값으로 영속성 컨텍스테 정보가 있는가? 확인
User userEntity = findById(id);
userEntity.setPassword(password);
userEntity.setEmail(email);
return userEntity; // 수정
}
/**
* 사용자 정보 조회 (pk)
* @param id
* @return
*/
public User findById(int id) {
return em.find(User.class, id);
}
Repository 계층에서는 DTO(Data Transfer Object)를 사용하지 않는 것이 권장된다. DTO는 외부와의 데이터 교환을 위한 객체이며, 대신, 엔티티(Entity) 를 직접 다루는 것이 더 적합하다. 즉, 계층 간의 책임을 명확히 구분 하기 위함 이고 리포지토리는 비즈니스 로직을 수행하지 않고 데이터 저장 및 조회에 집중한다.
728x90
'Spring boot > Blog 프로젝트 만들기(JPA)' 카테고리의 다른 글
완성 코드 STEP 03 - 에러 컨트롤러 및 커스텀 익셉션 만들기 ( 인증과 권한 처리 ) (0) | 2024.10.11 |
---|---|
완성 코드 STEP 03 - 에러 페이지 만들기 ( 인증과 권한 처리 ) (0) | 2024.10.11 |
완성 코드 STEP 02 - 회원 가입 ( JPA API , JPQL 쿼리 사용, 인증(세션 로직 추가 ) (0) | 2024.10.10 |
완성 코드 STEP 02 - 게시글 수정 ( JPA API , JPQL 쿼리 사용, 인증(세션 로직 추가 ) (0) | 2024.10.10 |
완성 코드 STEP 02 - 게시글 삭제 ( JPA API , JPQL 쿼리 사용, 인증(세션 로직 추가 ) (0) | 2024.10.08 |