본문 바로가기
개인 공부용 프로젝트/calendar.jpa.api

트러블슈팅 : 필수과제

by pon9 2024. 12. 11.

1. user table이 자동 생성되지않는 오류

user create 테스트 도중, user table이 자동으로 생성되지 않는 오류를 발견했다.

 

'user' 이라는 테이블 이름은 예약어라서 users로 변경해주니 정상적으로 반영됐다.

@Table(name = "users")

 

 

 

2. session 사용 시 dto와 entity 간 오류

ClassCastException이 발생했다. dto 객체를 entity 객체로 캐스팅하려 시도하면서 발생하였다.

HttpSession에 dto를 저장한 후, 이를 다시 사용할 때 entity와 dto를 무차별 혼용하면서 생긴 에러다.

 

따라서 session관련 데이터들은 모두 entity로 처리하도록 했다. dto는 클라이언트와의 request - response를 위한 것으로, dto를 사용해 인증인가를 거치게 되면 데이터의 무결성이 유지되지 않을 수 있다.

@Service
@RequiredArgsConstructor
@Transactional
public class UserSignupService {

    private final UserRepository userRepository;
    private final UserValidationService userValidationService;

    public User registerUser(SignupRequestDto dto){
        userValidationService.isEmailTaken(dto.getEmail());

        User user = UserMapper.toEntity(dto);
        userRepository.save(user);
        return user;
    }
}

추가로 엔티티를 세션에 저장하기 전에 데이터가 모두 로드되지 않으면 문제가 될 것 같아서 로그인, 회원가입 관련 service들에 transaction을 적용해주었다. 

현재 password가 인코딩되어있지 않아서 session에 이게 쌩 값으로 추가되어 있다는 사실이 불편하지만.. 나중에 도전과제 할 떄 bcrypt를 적용하고 방법을 모색해야겠다.

 

->수정 : 도전과제에선 session에 Long 형의 userid를 넣어주었다.

 

 

 

3. requestHeader 키-값 쌍으로 인한 오류

public UserResponseDto updateUser(
            UpdateRequestDto dto,
            CurrentPasswordRequestDto currentPasswordRequestDto,
            HttpServletRequest req){

        User user = userValidationService.validateUser(req);
        userValidationService.validatePassword(user.getPassword(), currentPasswordRequestDto.getCurrentPassword());

        User updatedUser = user.updateUser(dto.getName(), dto.getUpdatePassword());
        userRepository.save(updatedUser);
        return UserMapper.toDto(updatedUser);
    }
    
public void validatePassword(String sessionPassword, String inputPassword){
        if(!sessionPassword.equals(inputPassword)){
            throw new BadInputException("비밀번호가 일치하지 않습니다.");
        }
    }

유저 update시에 currentPassword를 검증하는 과정에서 오류가 생겼다. 

String2#을 입력했는데, 서버에는 currentPassword,String2# 으로 키 - 값 쌍의 형태로 보내진다.

값을 requestHeader로 보내고 있었는데 이것이 문제였다. 스프링에서 헤더를 통해 데이터를 전달할 경우 키-값 쌍 형태로 표현된다.

updateRequestDto에 currentPassword 항목을 추가하고 requestBody로 동시 처리하는 것으로 해결했다.