
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