30. 회원정보수정하기v5

송민경's avatar
Mar 18, 2024
30. 회원정보수정하기v5

1. UserService 에 UpdateForm 만들기

  • 레파지토리가 아니라 서비스에 의존하기
package shop.mtcoding.blog.user; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import shop.mtcoding.blog._core.errors.exception.Exception400; import shop.mtcoding.blog._core.errors.exception.Exception401; import shop.mtcoding.blog._core.errors.exception.Exception404; import java.util.Optional; @RequiredArgsConstructor @Service // IoC에 등록 public class UserService { // 컨트롤러는 서비스가, 서비스는 레파지토리가 필요함 - 의존 관계 private final UserJPARepository userJPARepository; public User updateForm (int id) { User user = userJPARepository.findById(id) .orElseThrow(() -> new Exception404("회원정보를 찾을 수 없습니다")); return user; } @Transactional // JPA 레파지토리가 아니라 호출하는 서비스가 가지고 있어야 함 public User login(UserRequest.LoginDTO reqDTO) { // 1. 유효성 검사(컨트롤러 책임) // 2. 유저네임 중복검사(서비스 체크) - DB 연결이 필요함 // 3. hash 값 비교 // 조회 -> null이면 throw를 날리고 아니면 값을 받음 User sessionUser = userJPARepository.findByUsernameAndPassword(reqDTO.getUsername(), reqDTO.getPassword()) .orElseThrow(() -> new Exception401("인증이 되지 않았습니다")); return sessionUser; } @Transactional // JPA 레파지토리가 아니라 호출하는 서비스가 가지고 있어야 함 public void join(UserRequest.JoinDTO reqDTO) { // 1. 유효성 검사(컨트롤러 책임) // 2. 유저네임 중복검사(서비스 체크) - DB 연결이 필요함 // 기존의 유저네임을 조회 Optional<User> userOp = userJPARepository.findByUsername(reqDTO.getUsername()); if (userOp.isPresent()) { throw new Exception400("중복된 유저네임입니다"); } userJPARepository.save(reqDTO.toEntity()); } }
 

2. UserController 에 updateForm 수정하기

package shop.mtcoding.blog.user; import com.sun.source.tree.TryTree; import jakarta.persistence.NoResultException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import shop.mtcoding.blog._core.errors.exception.Exception400; import shop.mtcoding.blog._core.errors.exception.Exception401; @RequiredArgsConstructor @Controller public class UserController { private final UserRepository userRepository; private final UserService userService; private final HttpSession session; @PostMapping("/user/update") public String update(UserRequest.UpdateDTO reqDTO){ User sessionUser = (User) session.getAttribute("sessionUser"); User newSessionUser = userRepository.updateById(sessionUser.getId(), reqDTO.getPassword(), reqDTO.getEmail()); session.setAttribute("sessionUser", newSessionUser); return "redirect:/"; } @PostMapping("/join") public String join(UserRequest.JoinDTO reqDTO) { userService.Join(reqDTO); return "redirect:/"; } @PostMapping("/login") public String login(UserRequest.LoginDTO reqDTO) { User sessionUser = userService.Login(reqDTO); session.setAttribute("sessionUser", sessionUser); return "redirect:/"; } @GetMapping("/join-form") public String joinForm() { return "user/join-form"; } @GetMapping("/login-form") public String loginForm() { return "user/login-form"; } @GetMapping("/user/update-form") // session(mypage)에 있으니 id가 필요 없음 public String updateForm(HttpServletRequest request) { User sessionUser = (User) session.getAttribute("sessionUser"); // 절대 nu User user = userService.UpdateForm(sessionUser.getId()); // 없어도 상관은 없음 request.setAttribute("user", user); return "user/update-form"; } @GetMapping("/logout") public String logout() { session.invalidate(); return "redirect:/"; } }
 

3. UserService 에 update 추가하기

  • 더티 체킹은 JPA의 기능 중 하나로, 영속 상태의 엔티티에서 발생하는 변경 사항을 자동으로 감지하고 데이터베이스에 반영하는 기능
package shop.mtcoding.blog.user; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import shop.mtcoding.blog._core.errors.exception.Exception400; import shop.mtcoding.blog._core.errors.exception.Exception401; import shop.mtcoding.blog._core.errors.exception.Exception404; import java.util.Optional; @RequiredArgsConstructor @Service // IoC에 등록 public class UserService { // 컨트롤러는 서비스가, 서비스는 레파지토리가 필요함 - 의존 관계 private final UserJPARepository userJPARepository; public User update (int id, UserRequest.UpdateDTO reqDTO) { User user = userJPARepository.findById(id) .orElseThrow(() -> new Exception404("회원정보를 찾을 수 없습니다")); user.setPassword(reqDTO.getPassword()); user.setEmail(reqDTO.getEmail()); // userJPARepository.save(user); return user; } // 더티체킹 public User updateForm (int id) { User user = userJPARepository.findById(id) .orElseThrow(() -> new Exception404("회원정보를 찾을 수 없습니다")); return user; } @Transactional // JPA 레파지토리가 아니라 호출하는 서비스가 가지고 있어야 함 public User login(UserRequest.LoginDTO reqDTO) { // 1. 유효성 검사(컨트롤러 책임) // 2. 유저네임 중복검사(서비스 체크) - DB 연결이 필요함 // 3. hash 값 비교 // 조회 -> null이면 throw를 날리고 아니면 값을 받음 User sessionUser = userJPARepository.findByUsernameAndPassword(reqDTO.getUsername(), reqDTO.getPassword()) .orElseThrow(() -> new Exception401("인증이 되지 않았습니다")); return sessionUser; } @Transactional // JPA 레파지토리가 아니라 호출하는 서비스가 가지고 있어야 함 public void join(UserRequest.JoinDTO reqDTO) { // 1. 유효성 검사(컨트롤러 책임) // 2. 유저네임 중복검사(서비스 체크) - DB 연결이 필요함 // 기존의 유저네임을 조회 Optional<User> userOp = userJPARepository.findByUsername(reqDTO.getUsername()); if (userOp.isPresent()) { throw new Exception400("중복된 유저네임입니다"); } userJPARepository.save(reqDTO.toEntity()); } }
 

4. UserController 에 update 수정하기

  • userRepository가 필요 없어짐
  • controller가 service를 의존하게 됨
package shop.mtcoding.blog.user; import com.sun.source.tree.TryTree; import jakarta.persistence.NoResultException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import shop.mtcoding.blog._core.errors.exception.Exception400; import shop.mtcoding.blog._core.errors.exception.Exception401; @RequiredArgsConstructor @Controller public class UserController { private final UserRepository userRepository; private final UserService userService; private final HttpSession session; @PostMapping("/user/update") public String update(UserRequest.UpdateDTO reqDTO){ User sessionUser = (User) session.getAttribute("sessionUser"); User newSessionUser = userService.update(sessionUser.getId(), reqDTO); session.setAttribute("sessionUser", newSessionUser); return "redirect:/"; } @PostMapping("/join") public String join(UserRequest.JoinDTO reqDTO) { userService.join(reqDTO); return "redirect:/"; } @PostMapping("/login") public String login(UserRequest.LoginDTO reqDTO) { User sessionUser = userService.login(reqDTO); session.setAttribute("sessionUser", sessionUser); return "redirect:/"; } @GetMapping("/join-form") public String joinForm() { return "user/join-form"; } @GetMapping("/login-form") public String loginForm() { return "user/login-form"; } @GetMapping("/user/update-form") // session(mypage)에 있으니 id가 필요 없음 public String updateForm(HttpServletRequest request) { User sessionUser = (User) session.getAttribute("sessionUser"); // 절대 nu User user = userService.updateForm(sessionUser.getId()); // 없어도 상관은 없음 request.setAttribute("user", user); return "user/update-form"; } @GetMapping("/logout") public String logout() { session.invalidate(); return "redirect:/"; } }
Share article

vosw1