[TIL] APIs 1차 완료

김시원·2023년 5월 15일
0

TIL

목록 보기
22/50
post-custom-banner

📌 Issues encountered

Issue #1

배열을 type으로 가지는 (사실상 string화 되어서 저장됌) column에 여러개의 객체를 push해서 update하기

Issue #2

CORS 에러

📌 What I tried

Issue #1

// 최근 채팅 내용을 보여주기 위한 로직
for (const content of contents) {
    await this.chatRepository.saveChatContents(chat_id, content); 
 }
  1. 반복문을 돌면서 repository의 saveChatContents 메서드를 실행시킨다.
saveChatContents = async (chat_id, chatRecord) => {
    try {
      await this.chatsModel.update(
        {
          content: Sequelize.literal(
            `JSON_ARRAY_APPEND(content, "$", '${JSON.stringify(chatRecord)}')`
          ),
        },
        { where: { chat_id } }
      );
    } catch (error) {
      throw error;
    }
  };
  1. JSON_ARRAY_APPEND라는 sequelize의 내장함수를 사용해서 배열 안에 string을 계속 append할 수 있다.
  2. 첫번째 인자로는 array를 담는 column명을 넣는다.
  3. 두번쨰 인자로는 array 어디에 넣을지 명시해준다. $는 맨 뒤를 의미한다.
    1. 맨 앞에 넣으려면 JSON_ARRAY_INSERT를 사용한다.
      • JSON_ARRAY_INSERT(content, "$[0]", '${JSON.stringify(chatRecord)}')
  • 세번째 인자로는 array에 넣어줄 stringified된 객체를 전달한다.

Issue #2

FE에서 BE에 토큰을 쿠키에 담아 전송해주기 위해 withCredential을 true로 설정해주어야 한다.

const instance = axios.create({
  baseURL: "http://localhost:3002/api",
  withCredentials: true, // Add this line to enable sending cookies
});

이를 BE에서 받기 위해서는 origin 설정을 *이 아닌, 특정 url로 지정해주어야 한다. 다음과 같이 설정해주었다.

app.use(
  cors({
    origin: "http://localhost:3000",
    credentials: true,
  })
);

📌 What I newly learned

기술매니저님 피드백 정리

  • 채팅 record를 database에 저장하고있는데, 다른 곳에서는 어떤 저장공간에 저장하는지도 찾아보시면 인사이트를 늘리는데 도움이 될것같아요(다른 저장소에 저장하는 방식으로 구현하라는 이야기는 아닙니다!)
    • noSQL로 채팅 record를 JSON으로 저장해주면 빠르게 접근, 추가할 수 있다.
    • s3에 파일 형태로 저장하는 방법도 있다.
    • 대규모 트래픽, 짧은 단위로 메세지가 자주 발송되는, 채팅이 메인이 되는 서비스의 경우 채팅만을 담당하는 서버를 따로 운영할 수도 있다
      => Keyword: Micro Service Architecture - domain 주도 개발, 즉, 도메인 (기능/카테고리)별로 서버나 cluster를 쪼개서 운영한다.
  • erd를 확인해보면, 회원 테이블, 회원정보 테이블 두가지 테이블이 모두 중고물품 테이블과 1대다 관계롤 이어져있는데, 두테이블 모두가 중고물품테이블과 관계성을 맺을 필요가 있는지 궁금합니다. 요부분에 대해 판단을 다시해보시고, 그래도 필수적이라고 생각되면 그대로 사용하시고 월요일에 이야기나눠보면 좋을것같네요.
    • 중고물품 테이블 - 회원 테이블 & 중고물품 테이블 - 회원정보 테이블이 JOIN 되어서 쿼리를 실행할 일이 많을거라고 판단하여 테이블을 3번 JOIN하는 것 (성능에 문제가 있지 않을까? 이런 생각함)대신 두 테이블을 모두 중고물품에 foreign key relation을 주려고 이렇게 테이블을 구성하였다.
      => Keyword: 성급한 최적화 - 성능에 문제가 있을지는 테스트를 통해서 직접 확인하고 진짜 문제가 있을때 변경하는 것이 권장된다.
post-custom-banner

0개의 댓글