한 -> 영 filter 구현 이후 전체 검색 안되는 이슈

태량·2023년 7월 27일
0

아침에 일어나서 오키를 확인 해보니, 전체 제목 검색이 안된다는 댓글이 있었다. 잠이 덜깨서 (알고리즘 좀 더 개선 해야겠구만...) 만 생각하고, 씻고 나와서 모바일로 해보니 진짜 아무 것도 안뜬다.. 불현듯 어제 새벽 4시에 구현 해놓은 영어 제목을 한글로 잘못 오타친 경우의 Filter 문제임을 감지 했다.

로그를 확인 해보니, 역시나 keywordService를 이용하는 filter 단에서 막혀서 아무것도 검색이 안된다. (로그도 조금 더 추가 해야겠다. 너무 불성실한 로그다)

이 기능과 관련 된 filter이다.

로컬 환경에서 filter 관련 내부 메소드인 converAddKorCheckList를 주석처리 하고, 영어 단어외의 단어를 그냥 다음으로 넘기면... 역시나 해결 된다

원인은 뭐고, 어떤 상황인가?

만약 검색어로 "왜 나는 너를 사랑하는가"가 들어오면, 새로 추가된 filter의 내부 메소드 converAddKorCheckList에 의해서

[왜 나는 너를 사랑하는가, dho sksms sjfmf tkfkdgksms] 으로 담겨져 keywordService를 통해 " " 기준으로 쪼개진 키워드들이 DB에 있는지를 확인해서 유효한 단어를 찾는다.

하지만 맹점 중 하나가 우리의 keyword table은 명사만을 취급 한다. '사랑하는가'는 '사랑'으로 명사 분리되서 저장돼 있기 때문에 '사랑'은 있어도 '사랑하는가'는 검색이 안된다.

따라서 "왜 나는 너를 사랑하는가"를 keyword table에서 백날 찾아도 없기 때문에 공백의 문자로 치환되고, 결과 없음이 사용자에게 보여지는 것이다.

어떻게 할 것인가?

일단은 해당 기능을 off하고 다시 빨리 배포 하자! 좀 더 테스트 한 뒤 다시 정식으로 배포에 끼어 넣자!

그래도 로컬에서 이 상태에서 좀 더 테스트 해보고 배포하자.

왜 테스트 코드도 있고, 배포 때 테스트 자동화도 하고 있는데 발견하지 못 했을까?

테스트 환경에서 치명적인 문제가 하나 있다. 그것은 eunjeon 라이브러리를 사용하는 모든 클래스는 gradle test에서 오류가 난다.

  1. gradle test
  1. 신기하게도 junit을 통한 테스트는 성공 한다.

해결 했는가?

일단 해결 방법은 build.gradle에서 maxHeapSize를 1024m으로 늘려줌으로써 해결 됐다.

gradle 7.5.1 버전을 사용 중인데, gradle doc을 살펴보니 디폴트 heap max size가 512MiB이다.

다른 테스트에선 이 heap size가 문제가 없지만, eunjeon 라이브러리 즉 자연어 분석 라이브러리는 초기화 될 때, 사전 데이터를 메모리에 로딩 하는 것으로 보인다.

이런 식으로 말이다. 근데 이 과정은 대체 메모리를 얼마나 잡아 먹을까?? 도와줘요 VisualVM~~ 확인 해보자!

  1. 서버를 시작한 직후의 visual VM 모습이다.

서버를 시작한 직후 heap dump를 떠보니 heap size는 34,624,312B (32.97MiB)

  1. 이제 로컬 주소로 접속해서, 사전 데이터가 로딩이 되도록 해보자.

바로 치솟는 heap size

621,322,352B(592.51MiB)이다. 처음 보다 약 16.97배 증가 했다..역시나 gradle test default max heap size를 초과 한다.

(이대로 괜찮을까...?? 라이브러리를 바꿔야 하나??)

일단은 검색을 계속 진행해도 크게 변동은 일단 없다.

그래서 결론은?

  1. 일단 gradle test에서의 default max heap size 값을 알았고, 자연어 분석기가 사용하는 메모리가 500MB가 넘는다는 것을 알았다. 그래서 일단은 default 값을 증가 시켜 test에서 heap space 부족 문제는 해결 했다.
  1. APM이 필요하다...!!
  • 로컬 환경에서의 heap size를 봤을 땐 사전 데이터 로딩에 의한 급격한 증가 이후 검색이 증가되도, 크게 변동은 없어서 괜찮다고 판단은 되지만 아직 내가 모르는 것이 많기에 데이터를 쌓고 확인 할 수 있는 수단이 필요하다.
  1. 로그 시스템이 필요하다...!
  • 만약에 아침에 오키 댓글을 확인하지 못 했다면...?? 만약 실제 서비스 운영 중인데 이러한 상태로 나는 어떤 상태인지 인지 못하고, 사용자에게 불편함을 제공하고 있었다면...?? (끔찍..)
  1. 테스트 코드 보완이 필요하다...!
  • 서비스 구현 때문에 미뤄뒀던 부분의 테스트 코드를 다시 보충하자. 겉으로 흉내만 내는 테스트 코드 대신 진짜 이런 문제들을 찾아 낼 수 있는 테스트 코드를 짜자.
profile
좋은 영향력과 교류를 위하여

0개의 댓글