본문 바로가기
프로젝트 회고/Pill my rhythm 💊

[인공지능 웹 서비스 프로젝트] 8~10일 차 회고 ✔️

by HelloJudy 2022. 6. 11.

📖 2022년 06월 09일 ~ 6월 11일


✔️ 오늘 내가 한 일

  • (9일) User Validation 코드 추가
  • (9일) User 회원 탈퇴 기능 구현
  • (9일) ERD 바탕으로 모든 모델 (테이블) 생성.
  • (9일) 테이블 간 관계 설정
  • (10일) 전체 스케줄 조회 (스케줄 테이블 정보 + 체크리스트 테이블 + 하루 영양제 테이블)
  • (10일) 폴더 구조 리팩토링 (router, controller 파일 분리)
  • (11일) 영양제 데이터 + 네이버 쇼핑 API
  • swagger 명세


💡 TIL ( Today I Learned )

[ 타입스크립트 타입 에러 ]


JWT 토큰에서 유저 정보를 얻는 과정에서 다음과 같은 오류를 해결했다! 휴!
따로 포스팅으로 정리해두었다.

👉 [Error: TS(2339)] Express Request 확장하기



[ 폴더 구조 변경 ]


1. 기존 프로젝트에서는 Routes / Services / Middlewares 로 구성했다.


이때 프로젝트를 하면서 라우터에 여러가지 로직이 붙는 것을 보며 1) 코드의 가독성, 2) 재사용성이 좋지 않다는 것을 느꼈다.


2. 현재 프로젝트에서는 Routes / Controllers / Services 로 구성했다.


이렇게 분리하면서 로직을 이해하기 좀 더 편리해졌다.


[ 싱글톤 패턴 ]


하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이라고 한다.
이번 프로젝트에서는 해당 패턴을 사용한다.
따로 포스팅으로 정리했다!

👉 [디자인 패턴] #1. 싱글톤 패턴 (singleton pattern)


[ DB 시간 설정 ]

(처음) MySQL 데이터베이스를 사용하고 있는데 mysql 서버시간을 한국시간으로 바꾸려고 했다.

(변경 후) DB 자체에는 utc로 넣고, 시간 데이터를 반환해줄 때 ut+9(한국시간)으로 변경했다.


(구현 방법1) : 저장할 때 +9시간
-> 이 방법보다는 DB에는 utc로 넣고 따로 함수를 만들어서 반환해주는 것이 더 좋은 방법이다!

const sequelize = new Sequelize(config.development.database, config.development.username, config.development.password, {
  host: config.development.host,
  dialect: "mysql",
  timezone: "+09:00",
  dialectOptions: { charset: "utf8mb4", dateStrings: true, typeCast: true },
  define: {
    timestamps: true,
  },
});



(구현 방법2)

util 함수로 따로 만들어 로직을 넣어서 사용한다.


[ Sequelize 조회 ]



1. 문제 상황

  • 우리 프로젝트에서는 회원 테이블과 일정 테이블이 1:N 관계를 가지고 있다.
  • 즉, 1명의 회원이 n가지 일정을 가질 수 있다.
  • 현재 회원 일련번호를 외래키로 가지고 있는데 일정 테이블에서 회원 일련번호가 일치하는 데이터를 가지고 오고 싶다.
  • 하지만 타입스크립에서 알려지지 않은 속성은 지정되지 않았다.
  • (외래키는 관계를 설정하면 자동으로 생기기 때문에)

테이블 모델 코드에 있는 인터페이스


2. 해결방법


< 시도 1 >

이 방식은 User 테이블에서 left join 으로 데이터를 가지고 오는 것이다.
하지만 나는 유저의 전체 정보도 가져오기 때문에 다른 방식을 찾았다.

const Schedule = {
  findById: async (pk_user_id: string) => {
    const schedule = await Users.findAll({ where: { pk_user_id: pk_user_id }, include: { model: Schedules } });
}


< 시도 2 : 이 방식으로 코드 작성 >

const Schedule = {
  findById: async (pk_user_id: string) => {
    const schedule = await Schedules.findAll({ include: { model: Users, where: { pk_user_id: pk_user_id } } });
    return schedule;
  },
  }



💡 결론적으로

  1. 외래키를 기준으로 데이터가 필요할 때) include 안에 모델과 where 조건절로 데이터 불러온다.
  2. 모델 속성에 있는 칼럼이면 시도1처럼 where 조건절로 데이터를 불러온다.


💁‍♀️ 오늘 느낀 점


[ 신입은 기획과 시간 배분을 못한다! ] , 프로젝트에서 시간 관리

프로젝트에서 각자 생각하고 있던 목표가 달랐다는 것을 알게 되었다.
누군가의 문제가 아닌, 같은 프로젝트 완성이라는 목표에서 기한을 잘 나누지 못했다!!
깃랩의 마일스톤, 이슈를 꼼꼼하게 작성해보자!


+ 코치님이 추천해주신 아키텍쳐 확인할 수 있는 사이트

https://www.codenary.co.kr/architecture/list

스타트업들의 기술 스택과 기술 블로그를 한눈에 살펴보세요 | 코드너리

네이버, 카카오, 토스, 당근마켓과 같이 요즘 핫한 스타트업은 어떤 기술 스택을 사용하고 있을까요? 코드너리에서 국내 100개가 넘는 스타트업의 기술 정보를 확인하세요.

www.codenary.co.kr


📌 내일 할 일(계획)

  • OAuth (카카오톡)
  • 영양제 DB + 네이버 쇼핑 API (이미지 링크, 구매 링크) 완료하기
  • 영양제 DB 모델 (테이블) 구축하기
반응형

댓글