Spring boot

블로그 - 회원 정보 수정

ryeonng 2024. 10. 25. 16:23
  1. 회원 수정 DTO (Data Transfer Object) 생성
  2. 회원수정 컨트롤러 생성, 세션 동기화
  3. 회원 수정 쿼리 (JPA API) 작성
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

Repository 계층에서는 DTO(Data Transfer Object)를 사용하지 않는 것이 권장된다. DTO는 외부와의 데이터 교환을 위한 객체이며, 대신 엔티티(Entity)를 직접 다루는 것이 더 적합하다. 즉, 계층 간의 책임을 명확히 구분하기 위함이고 리포지토리는 비즈니스 로직을 수행하지 않고 데이터 저장 및 조회에 집중한다.

// 사용자 정보 수정 기능 (더티 체킹 사용)
    @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);
    }

 

'Spring boot' 카테고리의 다른 글

API 설계 및 모범 사례  (2) 2024.11.04
블로그 - 에러 페이지 만들기  (3) 2024.10.25
블로그 - 회원 가입 기능  (1) 2024.10.24
블로그 - 게시글 수정  (1) 2024.10.24
블로그 - 게시글 삭제  (4) 2024.10.23