
로그인 쿼리 만들기 - 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