프론트 먼저 확인 ( Html확인 )
@ Form 태그와 Input태그 개념
클라이언트 정보 받기 - DTO안 쓸때
방법 1
방법 2
DTO 만들기 - 우린 DTO 사용한다.
package shop.mtcoding.blog.user;
import lombok.Data;
public class UserRequest {
@Data // Getter, Setter, toString 자동 생성
public class LoginDTO { //login정보로 사용할 DTO객
private String username;
private String password;
}
}
Java
복사
값 받기 테스트
@RequiredArgsConstructor //의존성 주입용 생성자생성
@Controller // IoC 컨테이너에 등록
public class UserController {
private final UserRepository userRepository;
private final HttpSession session; // 세션을 DI해서 로그인 사용자 세션 부여시 사용
@PostMapping ("/login") // html에서 'login'액션이 들어오면 해당 메소드 실행
public String login (UserRequest.LoginDTO requestDTO){
System.out.println(requestDTO); // 값이 잘 넘어오는지 테스
return "redirect:/"; // 여기서 리다이렉트를 하지 않으면
} // 로그인 정보를 버리고 새로 요청하게됨
} // 정보를 가지고 이동할려면 리다이렉트로 메인페이지 연결
Java
복사
컨트롤러에 책임 부여하기
login메소드 전체 코드
@PostMapping("/login")
public String login(UserRequest.LoginDTO requestDTO){
// 1번 유효성 검사 - 아이디 길이가 3자 이하일 때
if(requestDTO.getUsername().length() < 3){
return "error/400"; // ViewResolver 설정이 되어 있음. (앞 경로, 뒤 경로 자동설정)
}
User user = userRepository.findByUsernameAndPassword(requestDTO);
// 2번 유효성 검사 - 아이디 비밀번호가 틀려서 조회가 안될 때
if(user == null){
// 조회 안됨 (401)
return "error/401";
}else{
// 조회 됐음 (인증됨)
// HttpSession을 의존성 주입을 받아서 사용 - 락카에 담음 (StateFul)
// HttpSession이란 해쉬맵에 키값 'sessionUser'에 밸류값을 'user'
session.setAttribute("sessionUser", user);
}
return "redirect:/"; // 컨트롤러가 존재하면 무조건 redirect 외우기
}
Java
복사
1번 유효성 검사 - 아이디 길이가 3자 이하일 때
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>클라이언트가 요청을 잘못함 400</h1>
</body>
</html>
Java
복사
// UserController의 login메소드
// get요청이지만 보안상의 이유로 post요청
@PostMapping ("/login")
public String login (UserRequest.LoginDTO requestDTO){
// 유효성 검사 - 사용자id가 3자 이하인경우 400번 에러메시지 전달
if(requestDTO.getUsername().length() < 3){
return "error/400";
}
return "redirect:/";
}
Java
복사
401 에러페이지 만들기
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>인증에 실패하였습니다. 401</h1>
</body>
</html>
HTML
복사
모델 연결 (DB 요청)
모델 위임(UserRepository 담당) 할 메소드 만들기
// login메소드 내부에 유효성 검사 통과 후 구현
userRepository.findByUsernameAndPassword(requestDTO);
Java
복사
결과 - 자동으로 틀을 만들어 준다. 이 내부에 로직을 구현한다.
쿼리 작성
// 테스트 쿼리문
// 먼저 데이터를 넣고 조회가 되는지 테스트
// 문자열에 쌍따옴표가 아니라 홑따옴표 기억하자
select * from user_tb where username='ssar' and password='1234'
Java
복사
메소드 구현
public void findByUsernameAndPassword(UserRequest.LoginDTO requestDTO) {
//em변수로 EnityManager를 사용중이므로, 결과값을 받아서 바로 User클래스에 매핑해 주는 문법이 User.class 사용이다.
Query query = em.createNativeQuery("select * from user_tb where username=? and password=?", User.class);
// ?를 변수화 하여서 setParmeter로 값을 지정한다. '1'이 첫 번째 매개변수라면 1번째 물음표에 대입하라라는 뜻
query.setParameter(1, requestDTO.getUsername());
query.setParameter(2, requestDTO.getPassword());
// 하나의 결과값만 기대하기 때문에 getSinglerResult 사용
User user = (User) query.getSingleResult();
return user;
}
Java
복사
이렇게 User클래스에 @Enitity 선언이 되어있어야지 EntityManager를 통해 User.class를 사용 할 수 있다.
로그인 테스트 확인
개발자도구>> Application>> Cookies로 들어가보면 jsessionid를 확인할 수 있다.