• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

이런 경우엔 어떤 예외와 응답 코드가 적절할까요?

23.12.12 09:25 작성 23.12.12 12:24 수정 조회수 157

0

친구랑 커뮤니티 계정을 같이 쓴다고 가정할 때,
각자의 pc로 웹 브라우저에서 로그인하여 서로 세션이 있는 상태에서
제가 게시글을 작성하고 있는데 다른 친구가 회원 탈퇴를 합니다(db에서 회원 데이터 삭제됨).

글을 마저 작성하고 글쓰기를 누르면,
세션이 유지 중이므로 로그인 체크 인터셉터도 통과하고 해당 세션에는 회원 데이터가 있습니다(세션은 레디스에 저장되어 있음). 게시글 엔티티를 db에 저장하기 위해 필요한 회원 데이터를 db에서 조회했지만 회원이 없습니다.

포털 사이트 한군데에서 크롬이랑 엣지로 시험해봤는데 한곳에서 회원 탈퇴 성공한 뒤
다른 곳에서 비밀번호 변경을 시도하면 "비밀번호 변경에 실패했습니다. 잠시 후 다시 시도해주세요"라고 400 응답코드를 반환했고,
회원 탈퇴를 시도하면 500 응답과 함께 "회원 탈퇴에 실패했습니다. 잠시 후 다시 시도해주세요."라고 나옵니다. 기사에 댓글을 달아봤는데 댓글은 달렸고, 로그인 재시도는 실패했습니다.

이런 경우 어떤 예외를 발생시켜야 하나요? 스프링 추상화 예외 EmptyResultDataAccessException를 발생시키고 session.invalidate(); 처리하는 것은 어떤가요?

답변 1

답변을 작성해보세요.

1

y2gcoder님의 프로필

y2gcoder

2023.12.12

안녕하세요. CS님, 공식 서포터즈 y2gcoder입니다.

저 또한 글쓰기 비즈니스 로직에서 회원 데이터 조회를 다시 조회했을 때, 해당 회원이 존재하지 않는다면 예외를 발생시키면서 세션을 삭제할 것 같습니다 :)

감사합니다.

CS님의 프로필

CS

질문자

2023.12.12

답변 감사드립니다!
이런 경우에 일반적으로 사용할수 있는 자바 예외가 있을까요?
필요한 회원 데이터를 세션에 있는 걸 그대로 활용하는 게 아니라 db에서 조회하는 것이 맞겠죠?

y2gcoder님의 프로필

y2gcoder

2023.12.12

사전에 DB에서 조회하지 않고 게시글 데이터를 DB에 저장하려고 시도할 때 오는 추상화 예외에 대해 잡아서 처리하셔도 되고,

만약 사전에 회원 데이터를 DB에서 조회한다면 (JPA를 사용한다는 가정 하에) Optional로 엔티티를 받을 수 있습니다. 그러면 해당 옵셔널 객체 내의 값이 비어있으면 직접 비즈니스 예외를 만들어서 처리해주셔도 될 것 같습니다 :)

CS님의 프로필

CS

질문자

2023.12.12

첫번째 방법도 좋은데 구현상 안될 것 같고,
두번째 말씀처럼 예외를 만들어서 처리해야 할 것 같습니다ㅎㅎ
근데 회원탈퇴를 했는데도 댓글이 달리는 이유는
실무에선 데이터를 아예 삭제하지 않는다는 점과 연관이 있는 걸까요?

y2gcoder님의 프로필

y2gcoder

2023.12.12

해당 사이트의 비즈니스 정책을 잘모르겠지만,
말씀하신 비즈니스 정책과 관련되어 그렇게 처리했을 수도 있을 것 같습니다!
다른 브라우저에서 회원 탈퇴 후 본 브라우저에서 댓글을 단 후 해당 댓글에서 유저의 정보가 그대로 보였다면 회원탈퇴 시 회원 데이터를 Soft Delete 했을 수도 있다는 생각이 듭니다!

CS님의 프로필

CS

질문자

2023.12.12

아 soft delete 라는 개념이 있군요..
zum 포털 사이트에서 테스트해본건데 똑같은 아이디로 회원가입 재시도하니까
아이디 중복 뜨길래 관련이 있나 싶었네요. 답변 감사드립니다ㅎㅎ