오늘 한 일
협업 툴 웹 사이트를 만드는 팀 프로젝트를 시작했다(NestJS + TypeORM). 내가 맡은 부분은 그 중에서도 Board부분으로, 협업 툴의 제일 큰 구분 단위를 맡게 되었다. 여느 때와 마찬가지로 팀 회의를 거친 후에 ERD 작성 및 API 명세서 작성, 와이어 프레임을 작성했다. 그 후 Board를 맡았기 때문에 Board와 관련한 CRUD 기능을 구현했다.
고민한 부분
Board 테이블에서 구현해야 하는 기능 중 하나가 "초대" 기능이었다. Board를 만들어 작업 단위를 구성한 사람이 멤버들을 초대 해야하는 구조를 만들어야 했다.
그렇다면 초대를 받은 사람에 한해서 접근이 가능하도록 데코레이터를 넣어주어야 했고, 더 중요하게 초대받은 사람들을 어떻게 구성해줄 것인가가 제일 큰 부분이었다. 고민하고 생각해봤던 바로는 4가지 정도가 있다.
1. Board 테이블에 authorizedMember라는 컬럼을 배열의 형태로 만들어 board당 여러개의 member를 가질 수 있도록 만들기
2. User 테이블에 boardId 컬럼을 만든 뒤 기본값을 null 값으로 넣은 뒤 초대를 보냈을 때 boardId값이 들어가도록 만들기
3. boardId와 userId를 가지는 새로운 테이블을 만들어 boardId와 userId가 매칭되도록 만들기
4. '초대된 사용자'라는 정보는 중요한 정보가 아니기 때문에 DB에 넣기보다는 redis를 이용해서 자원의 낭비를 줄이도록 만들기
위와 같이 4가지 정도 구상해봤는데 우선, 첫 번째는 배열의 형태로 만들기 때문에 데이터를 넣고 빼는 데 있어 조회 로직, 성능이 더 안 좋아지기 때문에 안되겠다고 생각했다. 또한 User테이블에 boardId를 넣는 것도 마찬가지로 1대1로 매칭되는 것이 아니라 한 명의 유저가 여러 board에 속해 있을 수도 있기 때문에 배열의 형태로 넣는 것이 낫겠다고 생각했다. 그리고 그렇게 되면 차라리 첫 번째 방법이 낫겠다는 결론이 나왔다. 세 번째 방법은 boardId와 userId만을 가지고 있는 테이블이기 때문에 DB를 사용하는 상황에서는 가장 효율적인 방법이라는 생각이 들었다. 네 번째 방법은 DB가 필요하지 않다고 생각이 든다면 가장 최적의 선택지가 아닐까 하는 생각이 들었다.
결국 3번 또는 4번을 해야겠다고 생각했고, 팀원들의 의견을 들어보고 결정을 해보려고 한다.
배운 부분
- console.log()에서 () 대신에 {}로 감싸면 괄호 안의 내용이
"내용" 내용
과 같은 형식으로 출력된다. - Entity의 경우 보통 @Column이 들어가는 윗줄과 변수와 타입이 들어가는 아랫 줄로 구성되는데 윗 줄에는 mySQL의 타입을 적어줘야 하고, 아랫줄에는 Typescript의 타입을 적어줘야 한다. 예를 들어 Typescript에서는 text라는 형태를 지원하기 때문에 text 타입을 적어야 할 때, 아랫 줄에는 '변수:text' 와 같이 적어줘야 하고 윗 줄에는 @Column(type:string)의 형태로 적어줘야 한다.
- typeorm 패키지에 snake naming(?)이라는 걸 통해 entity에 camelCase로 적어주게되면 db에 snake_case로 자동으로 컬럼이름이 바뀌게 된다. 따라서 각자의 형태에 맞게 지정해 줄 수 있다.
오늘의 에러
https://yoonchan1121.tistory.com/138
'TIL' 카테고리의 다른 글
2024_01_10 TIL (+01/09) (1) | 2024.01.11 |
---|---|
2024_01_08 TIL (1) | 2024.01.09 |
2024_01_03 TIL (1) | 2024.01.04 |
2024_01_02 TIL (1) | 2024.01.03 |
2023_12_29 TIL (1) | 2023.12.30 |