
오늘 한 일
과정을 나누자면
컨트롤러
- 입력받은 장르가 빈칸이면 모두 삭제인 것으로 간주, '관심 장르를 모두 삭제하는 service의 함수'로 보냄
- 입력받은 장르가 1개 이상이면 수정으로 간주, '겹치지 않은 기존의 관심 장르를 삭제하는 함수'로 보내고 새로 추가해야할 장르의 배열을 service로부터 받음
- 2의 함수의 결과물을 '새로운 관심 장르를 생성하는 함수'로 보냄
겹치지 않은 기존의 관심 장르를 삭제하는 함수
- 유저 정보로 있는 관심 장르들 모두 soft delete된 것들을 모두 복구 (이때 가입 시 아무것도 설정하지 않았다면 바로 컨트롤러 3의 함수로 내보냄)
- 회원의 관심 장르 데이터들의 장르 아이디와 입력한 새 장르 아이디를 비교, 같으면 유지, 새 장르 아이디와 다르면 soft delete 진행
- 위에서 유지한 장르 아이디를 새 장르 아이디에서 제외시키고 최종 새 장르 아이디들 배열을 return 시킴

새로운 관심 장르 생성 함수
위의 함수에서 유저의 아이디와 장르 아이디를 배열로 받은 후 map으로 하나씩 interestGenre를 생성함

interestGenre의 구조를 보면
- id (interestGenre의 아이디)
- deleteAt
- user_id (외래키)
- genre_id (외래키)
인지라 외래키인 유저 정보로 interestGenre를 조회하기 위해서는 orm이 아니라 createQueryBuilder()의 도움을 받아야했다.
위에서 보면 .restore()은 softdelete된 정보들을 복구하는 메서드이고, leftJoinAndSelect()는 외래키 정보까지 가져오는 메서드이며, where절을 쓸 때는 'ig.user_id = :user_id', { user_id: id } (ig는 alias이므로 신경쓰지 말것) 처럼 두 인자를 주어야한다. 또한 수정을 할 때는 제일 마지막에 .execute()을 붙여야 수정이 완료된다. (그것을 까먹어서 꽤 오랜시간을 낭비했다...)
거의 이틀을 쏟아부은 기능이었다... 코드의 흐름을 만드는 것부터 막막했는데 설마했던 이 기능이 발목을 잡을 줄은 몰랐다.