📖 프로젝트 개요
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를 확정할 예정입니다.