인스타그램식의 게시판을 만들던 도중 희한한 에러가 발생했다.
사진, 내용, 태그가 포함된 게시글을 올리고 작성된 게시글을 확인하려고 하면 해당하는 ID의 게시글을 찾을 수 없다느 오류가 발생했다.
DB 테이블을 확인하면 분명 모두 제대로 저장되었고, 내가 프론트에 준 ID도 DB에 저장된 아이디도 그대로였다.
그런데 테스트를 다시 해보니 1개의 사진이 올라간 게시글만 위와 같은 에러가 발생했고, 2개 이상의 사진이 포함된 게시글은 그대로 잘 작동했다.
이와 같은 문제는 아래와 같은 나의 querydsl코드에 있었다.
join문을 보면 postImage 엔티티와 join을 하는 것을 볼 수 있다.
현재 포스트 테이블과 포스트 이미지 테이블이 있다. 포스트 테이블에는 thumbnailImage만을 저장하고, 나머지 이미지들은 포스트 이미지 테이블에 저장된다. 포스트 테이블에 thumbnailImage가 저장되도록한 것은 페이징을 할 때, 포스트 이미지와의 join하는 것을 막기 위해서이다. 포스트를 올리려면 어차피 이미지 1개는 무조건! 필요하니까!
근데 문제는 여기서 발생한다. 만약 이미지가 하나만 올라가서 포스트 이미지에는 join할 것이 없다면?(즉 이미지 한개가 포스트 테이블의 thumbnailImage만 저장됨)
즉 join할 것이 없는데 위에서 join을 시키면 빈 테이블이 되니까 비어있는 테이블에서 찾고 있는 것이었다.
다시 보면 아래와 같은 쿼리가 나간다.
select --> join --> where 순인데 Join에서 Join되는 것이 없으므로 빈테이블이 되고, 빈 테이블에서 where문을 해봐야 소용이 없다. 이미 데이터는 없는 것이다. 그래서 해당하는 Id의 게시글을 찾을 수 없던 것이었다.
그래서 생각한 것이 그냥 포스트 테이블에 이미지 URL을 전부 저장하는 것이다. 이렇게 되면 테이블이 하나 사라지므로 굳이 join을 할 필요도 없어지고, 어차피 페이징을 하므로 한번에 12개의 글을 불러와서 그렇게 무겁지도 않을 것 같다. (물론 성능 테스트를 해봐야 알겠지만)
'memo > 기록' 카테고리의 다른 글
jpa 성능 최적화하기2 (update VS delete) (0) | 2023.03.04 |
---|---|
jpa 성능 최적화하기1 (하나의 엔티티에 두개의 toMany 연관관계) (0) | 2023.03.03 |
AWS LAMBDA with Node.js (0) | 2023.02.22 |
User 회원가입 로직 수정하기 (0) | 2022.02.07 |