본문 바로가기
T.I.L. :: Today I Learned/항해99 14기 본과정

Day 29. 오류가 너무 웃겨서 배꼽 빠지게 웃으면서 개발함ㅋㅋㅋㅋ

by DaSsom 2023. 5. 1.

이제 진짜 순환참조

아 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 오늘은 정말 너무 웃겨서 배꼽 잡으면서 개발을 했다. 이런게 진짜 개발의 묘미인걸까? 😀

게시물을 페이징 처리해서 조회를 하려는데 이런식으로 참조가 끝나지 않고 계속해서 데이터를 받아왔고 일단 8000줄이 넘도록 돌아갔다 ㅋㅋㅋㅋㅋㅋ 그냥 순환참조 오류가 나서 아예 500 서버 에러를 만난 적은 있어도 이렇게 직접 본 것은 처음이라 같이 코드를 고민하고 있던 동료들과 한참을 웃으면서 봤다. 

 

이런 오류가 생긴 것은, 회원 탈퇴 기능을 구현하기 위함에서 시작되었다. 

    @OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
    private List<Post> postList;

    
    @OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
    private List<Comment> commentList;

    
    @OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
    private List<PostLike> postLikeList;

    
    @OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE)
    private List<CommentLike> commentLikeList;

    @OneToOne(cascade = CascadeType.REMOVE)
    private RefreshToken refreshToken;

 

회원이 탈퇴를 할 때 그 회원의 모든 글, 댓글, 좋아요 누른 것들, 그리고 발급해준 리프레시 토큰까지 다 삭제를 하려고 했다. 이렇게 설정을 해놓고 보니 문제가 두 가지 발생했다. 

 

1. 위의 사진처럼 순환 참조가 일어나 무한 반복되어 조회가 되는 것

2. 회원 가입 시 리프레시 토큰이 발급되지 않으니 값으로 null이 들어간것

 

1번 문제는 `@JsonBackReference` 어노테이션을 해당 컬럼마다 추가해주어 정상적으로 동작하도록 해결했다.

2번 문제는 회원이 로그인을 하면 리프레시 토큰 값도 업데이트 되도록 로직을 추가했다. 

 

이렇게 해결해주니 로그인을 하면서 리프레시 토큰 값이 null이었던 것이 해당 토큰 값으로 update 되었고 이후 회원이 탈퇴를 할 때 정상적으로 Cascade 옵션이 돌아간 것을 확인하였다 ~

 

 

++ 아주 작은 오류 하나 더 !

탈퇴 기능을 위해 엔티티에 추가했던 refreshToken 컬럼 때문에 회원이 로그인을 하면 null 값이 들어간 토큰의 컬럼이 같이 반환되었다. 그래서 이를 방지하기 위해 지난 번에 적용했었던 `@JsonIgnore` 어노테이션을 추가해 해결했다. 확실히 오류를 만나면서 해결하기 위해 이것저것 찾아보다보니 배우는 점이 훨씬 많다. 계속해서 과제 디벨롭을 해봐야겠다. 

 

그리고 내 코드에서 가장 궁금했던 것이 스프링 시큐리티가 잘 적용이 되어있는가? 였다. 

https://gregor77.github.io/2021/04/21/spring-security-02/

 

Spring Security - 2. Role과 권한(Privilege)

Role과 권한을 조회하는 UserDetailsService이번 시간에는 SecurityContext에 보관되는 Authentication, Role과 권한(Authority 또는 Privilege)에 대해 알아보겠다.경험을 바탕으로 Role과 권한의 차이는 무엇이고, 실

gregor77.github.io

그래서 추천받은 레퍼런스.. 조금 더 공부해보기로 한다. 

 

다음으로 궁금했던 점은 예외처리. 예외처리도 파면 팔수록 모르는게 자꾸 나와서 어려웠다.

https://blog.jiniworld.me/53

 

[Spring Boot Tutorial] 8. AccessDeniedHandler 구현클래스로 인증&인가 Exception 핸들링

※ [Spring Boot Tutorial] 7. JavaConfig 설정으로 Spring Security 커스터마이징에 이어서 진행됩니다. 이번 포스팅에서는 접근 권한 없는 페이지 접속에 관한 처리에 대해서 알아봅니다. (다른 표현으로는 ex

blog.jiniworld.me

 

어.. 그리고 오늘 swagger api를 적용해보려고 했는데 이걸 적용하면 예상치 못한 오류가 나온다. 버전 업이 안되어서 인지 기능은 잘 작동하는데 생성일시, 수정일시가 이렇게 뜨고 있었다. ... 

그래서 그냥 Spring REST Docs를 사용했다. 그렇게 하니 저 오류도 사라졌고 스웨거 기능도 잘 쓸 수 있게 됨 ! 그리고 설정도 더 편했다. 

 

 

재밌는 하루 끝 !