팀 프로젝트 4일차 기술 회고

·2022년 5월 12일
0

팀 프로젝트

목록 보기
6/34

4일차에는 서로 작업하는 시간이 길어서 기술 회고에 대한 이야기만 적어나가야 할 것 같다.
기획과 디자인이 어느정도 다 맞물리는 상황이라서 우리는 회의를 하기보다는 작업을 하는 시간이 비교적 많은 팀이다.
진행 자체도 원활하게 되고 있어서 마찰도 타 팀에 비하여 적은 편이고
디자이너도 새벽 늦게까지 작업을 하면서 시안이 쭉쭉 나오고 있다보니 정말 작업만 치고 나가면 되는 팀이라 행복하다.

N:M 은 정말 쓸 수 없는 것일까?

검색기능이 들어가야하다보니, 게시글에 N:M의 구조로 태그가 달려있는 상태이다.

태그가 3개가 달려있는데 그것을 그냥 입력을 해놓은 상태였는데... 그게 문제를 만들어버리고 말았다.

태그 테이블의 구조

tagId(PK)
menu(nullable true)
region(nullable true)
together(nullable true)

이런 구조로 되어있고, 여러개를 입력할 경우 한개에 대한 태그가 생기는 방식으로 되어있다.
사실 이것을 전부 나눠놓는 것도 생각을 해봤지만 태그가 3개가 필요한데
전부 다른 테이블로 구성을 해놓는게 좋은지 계속 고민을 하다보니 이런식으로 만들게 되었다.

이 덕분에 또 다른 문제가 발생을 하였는데, 값이 없을 수 있기 때문에 null 값이 들어가서
map으로 돌렸을 경우 메소드가 멈춘다는 문제를 발견했다.

해결 방안

그래서 팀원들과 이야기를 해서 무조건 1개 이상은 누르게 하거나
디폴트 값으로 선택안함 같은 것을 넣어놓고 프론트단에서 보여줄 때는 보이지 않게 하는 형식으로 하자 라는 방향성으로 진행이 되었다.

왜 저런 구조를 고집을 했냐면 태그가 많을 경우도 있다, 누군가는 마구잡이로 누를 수도 있기 때문에
저것을 일반적인 반복문을 사용할 경우에는 태그에 대한 정보를 수집해오는 시간이 너무 길 수 있다고
생각을 하여 이것은 무조건 비동기형식으로 가야한다고 생각을 하게 되었다.

태그 자체는 원래 있는 것만 고를 수 있다.
인스타식이 아니라 다나와처럼 미리 태그를 생성해놓고 생성되어있는 태그만 보여줄 예정이다.


그런데 여기서 또 다른 문제가 발생을 했다.

현재 게시판을 생성하는 로직은 아래와 같다.

  1. createBoardInput 의 정보로 게시글 생성
  2. boardTags의 정보를 바탕으로 Promise.all을 사용하여 해당하는 태그의 정보를 빈 배열에 담음
  3. 생성되어있는 게시글에 업데이트 형식으로 boardTags의 정보를 이어붙임
  4. 업데이트 된 정보를 return

이 과정에서 2번째 과정인 태그의 정보를 빈 배열에 담는 과정에서 아주 높은 확률로 빈 배열로 리턴이 되는 것이 발견됐다.

맨 처음에는 2번의 과정도 태그가 없다면 생성하고, 그 생성된 정보를 다시 불러오는 것으로 만들어놨었는데
이때는 태그의 정보가 6개가 돌아와야하는데 한 100번눌렀더니 584개가 돌아오는 기현상도 발생을 했다.
팀원 : 그거 유통마진떼간거아니냐? ㅋㅋ

그래서 일단 태그 자체는 미리 생성되어있는 것을 고르는 방식으로 결정하고
불러오기만 하는 것으로 했는데 리턴되는 정보에 데이터가 없거나
혹은 N:M의 구조가 형성이 되지 않는 기현상이 발생했다.

이어지는 고민

결국 N:M의 구조를 포기하고, Board와 Tag 사이에 중간 테이블을 줌으로써

Board 1:N 중간테이블 N:1 Tag 의 형식으로 만들어놨는데, 여기서 또 문제가 발생했다(너무 힘들다 ㅠㅠ)

보드가 생성되고 중간테이블에서 만들어진 id를 바탕으로 또 다시 정보를 가져와야하는데

1번의 쿼리로 태그의 수량만큼 조회가 되야하는 경우가 발생을 하다보니 태그 정보를 모두 조회하기 전에 쿼리문이 끝나서
리턴값이 또 랜덤적으로 바뀌는 것이 아닌가

이런 문제를 해결하기 위해 Eager Loading 과 Lazy Loading에 대한 정보도 찾아보고 있는데 명확하게 확인이 되지 않은 상황이다.

await promise.all(tags) 이런식으로 한번 멈추는 것도 생각을 해보고 있고....
이것을 넘어가는 5일차까지 계속 다양한 방법으로 해결을 해보려다가 일단 멈춰놓은 상태다.
(이거 쓰는 오늘은 5일차인 금요일이다........ 흑흑)

미래의 내가 해결했데! (6일차의 나)

profile
물류 서비스 Backend Software Developer

0개의 댓글