
1. loginForm.mustache 확인하기
- 필요한 정보 : username, password


2. UserRequest에 LoginDTO 만들기
- 로그인 정보를 담을 가방 만들기
- id는 자동 생성 - 클라이언트로부터 받을 정보가 아님
- 로그인 시 email은 필요 없음
package shop.mtcoding.blog.user;
import lombok.Data;
/**
* DTO = Data Transfer Object
* DTO 클래스는 주로 데이터를 전송하거나 저장하기 위한 용도로 사용
* 주로 필드들의 Getter와 Setter가 필요
*
* @Data Getter, Setter, EqualsAndHashCode, ToString 등의 메서드를 간편하게 생성
*/
public class UserRequest { // 요청 DTO(정보를 담을 가방)
// 회원가입 정보를 담을 가방
@Data
public static class JoinDTO {
// id는 자동생성 - 클라이언트로부터 받을 정보가 아님
private String username;
private String password;
private String email;
}
// 로그인 정보를 담을 가방
@Data
public static class LoginDTO {
// id는 자동생성 - 클라이언트로부터 받을 정보가 아님
// 로그인시 email은 필요 없음
private String username;
private String password;
}
}
3. UserRepository에 findByUsernameAndPassword() 구현하기
- DB에 있는 username과 password를 입력받은 값과 비교하기
Query query = em.createNativeQuery("쿼리", 클래스명.class); // 알아서 매핑해줌
package shop.mtcoding.blog.user;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository // 내가 new 하지 않아도 메모리에 띄울 수 있음
public class UserRepository {
private EntityManager em; // 컴포지션
public UserRepository(EntityManager em) { // 생성자
this.em = em;
}
@Transactional // DB에 변경을 초래할 떄 사용
public void save(UserRequest.JoinDTO requestDTO) { // 컨트롤러는 정보를 전달하면서 때리고 위임함
System.out.println("UserRepository에 save메서드 호출됨");
Query query = em.createNativeQuery("insert into user_tb(username, password, email) values (?, ?, ?)");
query.setParameter(1, requestDTO.getUsername());
query.setParameter(2, requestDTO.getPassword());
query.setParameter(3, requestDTO.getEmail());
query.executeUpdate();
}
// select문은 @Transactional 안해도 됨
public User findByUsernameAndPassword(UserRequest.LoginDTO requestDTO) {
System.out.println("UserRepository에 findByUsernameAndPassword메서드 호출됨");
Query query = em.createNativeQuery("select * from user_tb where username=? and password=?", User.class); // 알아서 매핑해줌
query.setParameter(1, requestDTO.getUsername());
query.setParameter(2, requestDTO.getPassword());
User user = (User) query.getSingleResult();
return user;
}
}



5.인증안됨 오류 401 만들기
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>인증에 실패하였습니다. 401</h1>
</body>
</html>
6. UserController에서 유효성검사, 인증검사 하기
package shop.mtcoding.blog.user;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class UserController {
private UserRepository userRepository; // null 이기에 생성자 만들기
private final HttpSession session;
public UserController(UserRepository userRepository, HttpSession session) { //IOC 컨테이너에서 써치해서 찾아서 넣어줌
this.userRepository = userRepository;
this.session = session;
} // 생성자를 만들어서 디폴트 생성자를 없애버림
@GetMapping("/joinForm")
public String joinForm() {
return "user/joinForm";
}
@PostMapping("/join")
public String join(UserRequest.JoinDTO requestDTO) {
System.out.println("requestDTO: " + requestDTO);
// 1. 유효성 검사
if (requestDTO.getUsername().length() < 3) {
return "error/400";
}
// 모델에 위임하기
// insert into user_tb(username, password, email) values (?, ?, ?)
userRepository.save(requestDTO);
return "redirect:/loginForm"; //리다이렉션불러놓은게 있어서 다시부른거
}
@GetMapping("/loginForm")
public String loginForm() {
return "user/loginForm";
}
// 원래는 get요청이나 예외 post요청하면 됨
// 민감한 정보는 쿼리 스트링에 담아보낼 수 없음
@PostMapping("/login")
public String login(UserRequest.LoginDTO requestDTO) {
System.out.println(requestDTO);
// 유효성 검사
if (requestDTO.getUsername().length() < 3) {
return "error/400";
}
// select * from user_tb where username=? and password=?
User user = userRepository.findByUsernameAndPassword(requestDTO); // DB에 조회할때 필요하니까 데이터를 받음
System.out.println(requestDTO);
// 인증 검사
if (user == null) { // 인증 안됨
return "error/401";
} else { // 인증됨
session.setAttribute("sessionUser", user);
return "redirect:/";
}
}
@GetMapping("/user/updateForm")
public String updateForm() {
return "user/updateForm";
}
@GetMapping("/logout")
public String logout() {
return "redirect:/";
}
}
7. DB에 없는 ID, PASSWORD로 접속시 오류가 터짐


Share article