📖 프로젝트 개요
Posts
시리즈 | 너나드리 - eora21.log
GIT
https://github.com/neonadeuli/neonadeuli-back-springboot
ERD
너나드리 v0.1.3
⌨️ 사용 기술 및 라이브러리
- Spring Boot
- JPA/Hibernate, hibernate-spatial
- Spring Data JPA
- QueryDSL, QueryDSL-spatial, blaze-persistence
- H3
- Spring Event
- MySQL
- junit5, testContainers
🧐 고민과 구현
GIS 조회 시 줌 레벨을 기준으로 조회 범위 변경
- 근처 정보 획득 시 데이터가 한 곳에 몰려 있어도 신뢰성을 떨어뜨리지 않지만, 줌아웃하여 여러 장소에 대한 정보 조회를 요구할 시에는 여러 구역의 데이터들을 고르게 보여줘야 했습니다. 이에 줌 레벨을 기준으로 하여 GIS Spatial Query 혹은 H3 Indexing Query를 사용하도록 했습니다.
- QueryDSL로 Spatial 동적 쿼리를 작성하기 위해
hibernate-spatial
과 QueryDSL-spatial
을 사용했습니다.
데이터들을 고르게 보여주기 위해 Window Function을 사용하였으며, Spatial Query와 같이 QueryDSL로 운용하기 위해 blaze-persistence
를 사용했습니다.
이미지 저장 시 커밋 직전에 이미지를 저장할 수 있도록 설정
- 이미지 저장 용도로만 쓰이는 Picture Entity의 영속화와 실질적인 이미지 파일의 저장을 일치시키고자 했습니다.
@PostPersist
를 사용했으나, 오남용 가능성을 막기 위해서는 Entity 내에 nested static class를 유지해야 했습니다. 그러나 이는 이미지 저장 로직 변경 시 Entity 클래스에 변화가 생기는 문제가 있었고, 역할 분리가 제대로 이루어지지 않는 방식이라 판단하였습니다.
- 이를 개선하기 위해 토스 페이먼츠의 layer 구조를 참고하여 Implement layer 구조를 정립한 후 이미지 저장 로직을 해당 레이어에 작성했습니다.
같은 트랜잭션 내에서 저장이 요청된 이미지들을 모은 후, 트랜잭션 커밋 직전에 해당 이미지들을 저장하도록 로직을 변경하였습니다. 이미지 저장 도중 롤백이 발생할 경우, 앞서 저장되었던 모든 이미지들을 삭제하도록 구성했습니다.
해당 과정에서 침투적인 코드가 발생하지 않도록 노력하였습니다.
💡 알게 된 점
- MySQL의 GIS 지원이 미흡하다고 알고 있었으나, 직접 릴리즈 노트를 살펴 본 결과 8.0.26 버전부터는 ST_Buffer 등의 Spatial 쿼리를 지원해주고 있었습니다. 하지만 각좌표계 기준으로도 meter 연산만을 지원하는 등 부족한 점이 있습니다. PostgreSQL 및 PostGIS에 대해 학습한 후 DB를 확정할 예정입니다.