장소 좋아요 클릭시 map id 불러오기 + 캐싱작업 가능할까

장소 좋아요 클릭시 map id 불러오기 + 캐싱작업 가능할까

·

2 min read

유저가 지도 검색 후 해당 지도에 좋아요 버튼을 누르면 유저의 프로필과 지도 내에서 나타나게 하려고 했다.

그러기 위해서는 지도의 id가 필요하였고, 장소 검색에서 나오는 id를 사용하면 될거라 생각했지만

해당 이미지에서 나오는 id 필드는 카카오 API에서 반환된 장소의 id 이다.

내가 필요한건 django model의 map 테이블 id 이므로, 카카오 api에서 받은 장소 데이터를 사용하여 django의 map model에 해당 장소를 저장하여 주고, 이때 새로운 map id를 생성하면 된다.

그래서 검색할 때마다 나오는 데이터를 db에 저장하는가?

모든 데이터들을 db에 저장하는 것은 비효율적이다.

→ 선택한 장소만 db에 저장한 후, 해당 장소에 대해 좋아요 기능을 구현한다.

이렇게 하면 선택한 장소가 이미 db에 저장되어 있는지 확인한 후, 저장되어 있지 않으면 저장해준다.

그리고 해당 map id를 사용하여 좋아요 기능을 구현한다.

구현

  1. 사용자가 장소를 선택할 때 장소 정보를 저장 사용자가 원하는 장소를 선택했을 때, 해당 장소의 정보를 django의 Map model에 저장

  2. 좋아요 기능 구현 해당 Map 객체의 id를 사용하여 좋아요 기능 구현

1. 원하는 장소 저장

2. map_id를 사용하여 사용자가 장소에 좋아요 누르기

장소를 저장한 후, 사용자가 해당 장소에 좋아요를 누를 수 있다.

map_id를 기반으로 좋아요 추가나 삭제 기능을 구현해야 한다.


1. 좋아요 추가, 삭제 로직 충돌

처음 좋아요를 구현할 때, 사용자가 좋아요를 누르면 MapLikeUser 모델에 객체를 생성하고,

다시 한번 누르면 객체를 삭제하는 로직을 작성함

그러나 serializer에서 create()메서드가 항상 객체를 반환해야 한다는 규칙 때문에,

좋아요 삭제 시 None을 반환하는 로직에서 AssertionError 발생

해결

좋아요 추가와 삭제 로직을 분리

  • 좋아요 추가

    • 사용자가 좋아요를 누르면 MapLikeUser 모델에 새로운 객체 생성

    • 해당 과정은 create() 메서드를 통해 수행되며, 항상 객체를 반환하도록 함

  • 좋아요 삭제

    • 사용자가 이미 좋아요를 누른 상태에서 다시 버튼을 누르면 MapLikeUser 객체 삭제