본문 바로가기
Project/소경관

[소경관] : 로그인 로직 오류 수정

by 오주현 2022. 6. 4.
반응형

저번에 구현한 로그인 로직에서 오류를 발견했다.

 

로그인 했을 때 세션 값을 사용하려고 했는데 여러 아이디로 로그인을 해도 세션 값이 갱신되지 않고 있었다.

 

    @GetMapping("/session-info")
    public String sessionInfo(HttpServletRequest request) {
        HttpSession session = request.getSession(false);

        if (session == null) {
            return "세션이 없습니다.";
        }

        session.getAttributeNames().asIterator()
                .forEachRemaining(name -> log.info("session name = {}, value = {}", name, session.getAttribute(name)));

        log.info("sessionId = {}", session.getId());
        log.info("getMaxInactiveInterval = {}", session.getMaxInactiveInterval());
        log.info("creationTime = {}", new Date(session.getCreationTime()));
        log.info("lastAccessedTime = {}", new Date(session.getLastAccessedTime()));
        log.info("isNew = {}", session.isNew());

        return "세션 출력";
    }

위 코드처럼 세션 체크하는 로직을 통해 세션 값을 확인해 보니까 로그아웃 할 때 세션을 날려주면 확실히 세션이 날라가는데 세션이 계속 같은 아이디만 참조하고 있었다.

 

이유는 아래와 같다.

 

List<UserEntity> userDTOList = iUserRepository.findAll();
UserEntity userEntity = userDTOList.get(0);

이게 전에 구현해 둔 로그인 할 때 세션에 값을 담기 위한 로직인데 findAll을 사용한 게 잘못이였다.

 

userId를 기준으로 나머지 정보를 불러와야해서 위 로직을 아래와 같이 바꿔주었다.

 

List<UserEntity> userDTOList = iUserRepository.findAllByUserId(userDTO.getUserId());
UserEntity userEntity = userDTOList.get(0);

userDTO의 UserId 파라미터를 기준으로 유저 정보를 불러왔다. 이때도 문제가 있었는데 JpaRepository에서 제공하는 findAllById() 메소드는 내가 사용할 수 없었다. 왜냐하면 나는 Entity의 @Id를 시퀸스에 주었고 따로 Id를 사용하고 있었기 때문이다. 

 

@Repository
public interface IUserRepository extends JpaRepository<UserEntity, Long> {

    List<UserEntity> findAllByUserId(String userId);

}

그래서 위와 같은 메소드를 인터페이스에 추가해주었고 Sevice에서는 findAllByUserId를 사용해 userId를 파라미터값으로 넘겨 읽어올 수 있었다.

 

그 결과 로그인하는 아이디를 기준으로 세션값이 잘 붙게 되었다.

반응형

댓글