반응형
저번에 구현한 로그인 로직에서 오류를 발견했다.
로그인 했을 때 세션 값을 사용하려고 했는데 여러 아이디로 로그인을 해도 세션 값이 갱신되지 않고 있었다.
@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를 파라미터값으로 넘겨 읽어올 수 있었다.
그 결과 로그인하는 아이디를 기준으로 세션값이 잘 붙게 되었다.
반응형
'Project > 소경관' 카테고리의 다른 글
[소경관] : 상세보기 구현하기 (0) | 2022.06.06 |
---|---|
[소경관] : 완료 항목 보기 리팩토링하기 (0) | 2022.06.05 |
[소경관] : JPA 회원 탈퇴 구현하기 및 회원 탈퇴 Session 처리하기 (0) | 2022.06.04 |
[소경관] : thymeleaf input에 Session값 가져오기와 input에 Session값을 입력 받아 Controller에 넘기기 (0) | 2022.06.03 |
[소경관] : 회원가입과 로그인 로직 수정하기 (0) | 2022.06.02 |
댓글