[TIL][codecamp] 프로젝트 12일차 회고

조혜인·2022년 9월 20일
0

팀 프로젝트

목록 보기
12/15

🫠 오늘 나의 상태

오전에 백엔드 인원 중 혼자만 나왔는데 갑자기 많은 이슈와 프론트 측에서 기능 추가 요청이 들어와서 순간적으로 오잇?????? 한 오늘. 외로운 싸움이었지만 모든 중요 이슈처리 완료👍

📚 오늘 한 일

프로젝트 기한이 얼마 남지 않은 관계로 담당자 부재시 프론트쪽에서 나온 이슈사항을 반영하고 해당 코드에서 보완이 필요한 점들을 파악하여 추가해주는 작업을 해주고 있다.

Logstash 설정파일 수정 및 보완

  • 기존 담당자가 작업한 logstash 설정파일을 보았는데 총 2가지의 문제점이 있었다.

    첫 번째 문제점 : 삭제된 데이터인지 구분없이 그냥 데이터를 다 가져온다.
    현재 우리는 ELK스택을 활용하여 게시물 검색 기능을 만들었다. 그런데 logstash설정파일의 query문을 보니 삭제된 데이터 마져 가지고 오는 쿼리문이 작성되어있다. 현재 게시물 삭제시 softDelete를 적용하고 있어 삭제가 되면 deletedAt이라는 컬럼에 현재시간이 남는다. 따라서 deletedAt컬럼을 활용하여 데이터가 없다면(null) 삭제가 되지 않은 데이터이므로 가져오고 데이터가 있다면(not null) 데이터를 가져오지 않게 query문을 변경하였다. 사실 특별한 건 없고 where절 마지막에 'deletedAt is null'만 추가해주면 된다.

    두 번째 문제점 : 데이터 수정이 발생할 경우 ElasticSearch에 새로운 데이터로 추가된다(중복 데이터 발생)
    ElasticSearch는 문서형 데이터베이스로 각 doc마다 id를 가지고 있는데, 현재 구현된 코드로는 변경된 데이터 또한 새로운 id를 가지게 되어 ElasticSearch에 수정이 아닌 새로 데이터가 추가되는 현상이 일어나고 있다. 따라서 query문을 이용하여 가져온 데이터의 id를 logstash의 filter를 통하여 doc의 id로 지정해주어 MySQL의 데이터와 ElasticSearch의 데이터가 같은 id를 가질 수 있도록 변경하여 원활하게 수정이 이루어질 수 있도록 하였다.

게시물 삭제 기능 수정 및 보완

  • 프론트에서 테스트를 할 때 자꾸만 게시물 삭제 기능에서 오류가 발생한다고 하여 아예 내가 코드를 수정하고 필요한 부분들을 고려하여 코드를 보완하였다. 담당자가 따로 있지만 중요한 서비스임에도 불구하고 지속적으로 오류가 발생할 뿐더러 앞으로 프로젝트 기한이 얼마 남지 않았기에 대체 어느 구간에서 문제가 나는지 너무 궁금했다.

    첫 번째로 게시물을 등록할 때 유저의 포인트가 차감되어 PaymentHistory에 정보가 남는데, 여기에서 삭제하려는 게시물과 연결이 되어있어 Foreign Key(이하 FK) 충돌이 발생하였다. 기존 Transaction을 활용하여 연결을 끊어주려고 하니 삭제 결과를 Transaction이 잡고 있어 충돌 오류가 해결되지 못하였다. Board를 삭제하기 위해서는 연결을 끊어줄 수 밖에 없는 상황이 되어버려 고민 끝에 꾀(?)를 내었다.

    일단 Board를 삭제하기 전에 PaymentHistory에 해당 Board와 연결된 FK들을 모두 끊어주고 그 아래에 Transaction을 사용하여 Board 및 관련된 테이블들(Location, Image 등)의 데이터를 삭제해주었다. 이렇게 되면 Transaction이 사용된 테이블들은 중간에 오류가 발생하여도 원상복구가 되지만 PaymentHistory의 경우에는 끊어진 연결이 돌아올 수 없어진다. 따라서 이전에 BoardId를 가지고 있다가 만약 Transaction에서 오류가 난다면 try catch문을 사용하여 catch문에서 다시 Board와 PaymentHistory를 연결시켜주었다. 이렇게 되면 Board의 삭제를 올바르게 수행할 수 있고, 만약 중간에 오류가 났어도 원상복구가 이뤄진다! 🤗

    이제 남은 작업은 프론트에서 만약 PaymentHistory를 띄워줄 때 Board의 정보를 노출시키고 있느냐 인데, 알아보니 따로 해당 Board로 연결시켜주지는 않고 Board의 제목(Title)만 보여준다고 한다. Board 삭제 시 '삭제된 게시물입니다.'를 띄워줄지 아니면 title만은 살려서 그대로 보여줄 지 프론트분과 얘기를 나눴는데, UI상 빈 부분이 생기는 것을 원하지 않으셔서 PaymentHistory DB에 title영역을 추가하여 제목 필드를 따로 가지게 만들었다. 현업에서는 이렇게 사용하지 않을 것 같은데 얼른 빨리 다른 회사들에서는 어떻게 데이터를 활용하고 있는지 알고싶다.

    두 번째로 현재 ELK스택을 사용하여 검색 로직을 구현하였는데, Board가 삭제된다면 ElasticSearch에도 데이터가 남아있으면 안됀다 라는 생각이 들었다. 따라서 Board가 삭제되었다면 ElasticSearch에도 deleteByQuery를 활용하여 해당 doc을 삭제 시켜주었다. 이렇게 되면 리스트 페이지에서 일반적으로 데이터를 가져왔을 때도, 검색을 하였을 때도 현재 작성된 데이터들만 활용할 수 있게 된다.

profile
코딩은 역시 재밌군

0개의 댓글