![[블로그 만들기] 7. 로그인 구현 : 회원가입 때 입력한 정보 가져오기](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog%3Ftitle%3D%255B%25EB%25B8%2594%25EB%25A1%259C%25EA%25B7%25B8%2520%25EB%25A7%258C%25EB%2593%25A4%25EA%25B8%25B0%255D%25207.%2520%25EB%25A1%259C%25EA%25B7%25B8%25EC%259D%25B8%2520%25EA%25B5%25AC%25ED%2598%2584%2520%253A%2520%25ED%259A%258C%25EC%259B%2590%25EA%25B0%2580%25EC%259E%2585%2520%25EB%2595%258C%2520%25EC%259E%2585%25EB%25A0%25A5%25ED%2595%259C%2520%25EC%25A0%2595%25EB%25B3%25B4%2520%25EA%25B0%2580%25EC%25A0%25B8%25EC%2598%25A4%25EA%25B8%25B0%26logoUrl%3Dhttps%253A%252F%252Finblog.ai%252Finblog_logo.png%26blogTitle%3DCoding_study&w=2048&q=75)
- username와 password 정보 가져오기
- findByUsernameAndPassword() 구현하기
- User 테이블은 Entity 타입이라 User.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;
}
}
2. LoginDTO 만들기
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. login() 만들기
- @PostMapping을 사용하는 이유
조회문은 원래 get요청이나 민감한 정보는 쿼리 스트링에 담아보낼 수 없음
→ 예외! post 요청하기!
민감한 정보는 BODY 데이터로 보냄
- findByUsernameAndPassword() 호출해서 유효성 검사하기
조회 값이 없음 = 인증되지 않음 : error 401
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>인증에 실패하였습니다. 401</h1>
</body>
</html>
- 조회가 되면 private final HttpSession session; 이 필요함 → 생성자 필요
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);
// 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에 조회할때 필요하니까 데이터를 받음
// 인증 검사
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:/";
}
}
4. 로그인 완료

Share article