
로그인 쿼리 만들기 - UserRepository / why final?
@RequiredArgsConstructor
@Repository // new BoardRepository -> IoC 컨테이너에 등록 시킴
public class UserRepository {
private final EntityManager em;
//비밀번호 해쉬 때문에 username밖에 못써서 password는 x
public User findByUsername(String username) {
Query query = em.createQuery("select u from User u where u.username = :username", User.class);
query.setParameter("username", username);
return (User) query.getSingleResult();
}
}
근데 password 해쉬 안하기로 함! 이건 취소 !
[ why final? ]


로그인 쿼리 만들기 - UserRepository
@RequiredArgsConstructor
@Repository
public class UserRepository {
private final EntityManager em;
//비밀번호 해쉬 때문에 username밖에 못써서 password는 x
public User findByUsernameAndPassword(UserRequest.LoginDTO requestDTO) {
Query query = em.createQuery("select u from User u where u.username = :username and u.password = :password", User.class);
query.setParameter("username", requestDTO.getUsername());
query.setParameter("password", requestDTO.getPassword());
return (User) query.getSingleResult();
}
}
테스트 하기!

@Import(UserRepository.class) //IoC 등록 코드
@DataJpaTest //Datasource/(connection pool), EntityManager
public class UserRepositoryTest {
@Autowired //애를 걸면 userRepository를 DI 걸 수 있다. 테스트라 new가 안 된다는 듯
private UserRepository userRepository;
@Test
public void findByUsername_test() {
//given
UserRequest.LoginDTO requestDTO = new UserRequest.LoginDTO();
requestDTO.setUsername("ssar");
requestDTO.setPassword("1234");
//when
User user = userRepository.findByUsernameAndPassword(requestDTO);
//then
Assertions.assertThat(user.getUsername()).isEqualTo("ssar");
}
}

나중에 서비스에서 할 로직 (?)
@Test
public void findByUsername_test() {
//given
String username = "ssar";
String password = "1234";
//when
User user = userRepository.findByUsername(username);
if (user == null) {
System.out.println("아이디 혹은 비밀번호가 틀렸습니다");
} else {
if (user.getPassword().equals(password)) {
System.out.println("로그인 되었습니다");
} else {
System.out.println("비밀번호가 틀렸습니다.");
}
}
//then
}

@Test
public void findByUsername_test() {
//given
String username = "ssar";
String password = "12344";
//when
User user = userRepository.findByUsername(username);
if (user == null) {
System.out.println("아이디 혹은 비밀번호가 틀렸습니다");
} else {
if (user.getPassword().equals(password)) {
System.out.println("로그인 되었습니다");
} else {
System.out.println("비밀번호가 틀렸습니다.");
}
}
//then
}

@Test
public void findByUsername_test() {
//given
String username = "ssar1";
String password = "1234";
//when
User user = userRepository.findByUsername(username);
if (user == null) {
System.out.println("아이디 혹은 비밀번호가 틀렸습니다");
} else {
if (user.getPassword().equals(password)) {
System.out.println("로그인 되었습니다");
} else {
System.out.println("비밀번호가 틀렸습니다.");
}
}
//then
}

로그인 DTO 만들기
public class UserRequest {
@Data
public static class LoginDTO {
private String username;
private String password;
}
}
UserController
@RequiredArgsConstructor
@Controller
public class UserController {
private final UserRepository userRepository;
private final HttpSession session;
@PostMapping("/login")
public String login(UserRequest.LoginDTO requestDTO) {
User sessionUser = userRepository.findByUsernameAndPassword(requestDTO);
// if (sessionUser == null) {
// return "redirect:/login-form";
// }
session.setAttribute("sessionUser", sessionUser);
return "redirect:/";
}
지금은 그냥 throw 날려서 하자…
header.mustache
<ul class="navbar-nav">
{{#sessionUser}}
<li class="nav-item">
<a class="nav-link" href="/board/save-form">글쓰기</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/user/update-form">회원정보보기</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/logout">로그아웃</a>
</li>
{{/sessionUser}}
{{^sessionUser}}
<li class="nav-item">
<a class="nav-link" href="/join-form">회원가입</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/login-form">로그인</a>
</li>
{{/sessionUser}}
</ul>
@GetMapping("/logout")
public String logout() {
session.invalidate();
return "redirect:/";
}
Share article