-
1월 10일 - 웹 사이트 만들기(8) - 회원가입 관련 테이블 만들기, sequelize, GraphQL 코드 모듈화공부/웹 사이트 개발(끝) 2021. 1. 10. 18:23
User 테이블
id: CHAR(36)
email: VARCHAR(255)
nickname: VARCHAR(255)
password: VARCHAR(255)
createdAt: DATETIME
updatedAt: DATETIME
deletedAt: DATETIME
CHAR vs VARCHAR
char는 필드길이가 고정인 컬럼이다. 사이즈를 50으로 설정한다면, 5바이트짜리 데이터가 들어와도 50의 크기를 차지한다.
varchar는 필드길이가 가변적인 컬럼이다. 사이즈를 50으로 설정한다고 해도 최대 길이가 50인 것이고 5바이트짜리 데이터가 들어오면 5바이트를 차지한다.(어떠한 이유 때문에 1바이트 추가된다는 글도 보긴 함)
그럼 무조건 varchar가 좋은 게 아닌가?라고 생각을 해서 검색을 해봤는데
What is the performance impact of using CHAR vs VARCHAR on a fixed-size field?
I have an indexed column that stores an MD5 hash. Thus, the column will always store a 32-character value. For whatever reason, this was created as a varchar rather than a char. Is it worth the
dba.stackexchange.com
쉽게 설명하면 CHAR는 고정이기 때문에 string manipulation이 VARCHAR에 비해 덜 필요하다. 그래서 인덱싱과 관련해서 20% 정도 더 빠르다고 한다.(index lookups against CHAR field are on average 20% faster than that of VARCHAR fields)
CHAR와 VARCHAR를 선택함에 있어서 모든 ROW의 데이터 길이가 일정하다면 CHAR를 선택하는 게 무조건적으로 맞을 것 같고,
데이터 길이의 편차가 있다고 해도 그 편차가 가져오는 크기에 대한 압박 vs 성능의 압박을 비교해서 선택해야 할 거 같다.
컬럼 타입 선택 이유
id
id의 경우 위에서 말한 VARCHAR vs CHAR를 생각해 보면 CHAR를 선택하는 것이 더 효과적으로 보인다.
id의 경우 모든 row에서 길이가 똑같기 때문이다.
그리고 sequelize에서는 UUID라는 데이터 타입을 제공하는데
Sequelize.UUID // UUID datatype for PostgreSQL and SQLite, CHAR(36) BINARY for MySQL (use defaultValue: Sequelize.UUIDV1 or Sequelize.UUIDV4 to make sequelize generate the ids automatically)
UUID 데이터 타입은 CHAR(36)이며, sequelize 모델을 정의할 때 defaultValue로 Sequelize.UUIDV4를 넣어주면 자동으로 id를 설정해 준다는 장점이 있기에 이 타입을 사용하고자 했다. 때문에 자연스럽게 타입은 CHAR(36)이 된다.
email, nickname, password
인덱싱 관련 작업을 하게될 일이 없어 보이는 컬럼이기에 VARCHAR를 선택했다.
createdAt, updatedAt, deletedAt
뭐... 날짜니까 DATETIME이지...
Sequelize 코드 모듈화
/src/sequelize/type/user.ts - User 테이블의 모델을 정의하는 코드
UserAttributes에는 createdAt과 updatedAt, deletedAt은 빼고 타입 정의를 했는데,
값을 넣고 나서 UserCreationAttributes를 정의할 때 optional하게 설정을 해도 괜찮을 듯하다.
UserCreationAttributes 타입이 따로 있는 이유
User 데이터를 생성할 때 UserCreationAttributes 타입을 참고하는데, 위에서 id의 경우 sequelize가 자동으로 생성되도록 했기 때문에 따로 id를 넣어줄 필요가 없기 때문에 id타입의 경우 optional한 타입이 되어 UserCreationAttributes가 된다.
User 데이터 생성 시 interface User 데이터 생성 시 UserCreationAttributes 타입을 참고한다. /src/sequelize/index.ts - 시퀄라이즈를 init하는 코드
이렇게 하고나면 저번에 복잡하게 app.ts 코드에 다 떄려박았던 코드를 initSequelize 함수 하나로 대체할 수 있다. 구조도 깔끔해진다.(타입은 타입폴더 따로따로 정의하니까)
GrpahQL 코드 모듈화
/src/graphql/types/user.ts - GQL 타입을 정의해 주는 코드
이 코드에서는 input이라는게 새로 등장하는데 아래 페이지를 보면 더 자세히 알 수 있다. input이 용이한 이유는 Naming input types with Input on the end is a useful convention, because you will often want both an input type and an output type that are slightly different for a single conceptual object.라고 한다. 대충 같은 컨셉의 Object에 대해 살짝 다른 타입을 input으로 넣어주고, output으로 반환하기 때문이라는 듯하다.
graphql.org/graphql-js/mutations-and-input-types/
Mutations and Input Types | GraphQL
Mutations and Input Types If you have an API endpoint that alters data, like inserting data into a database or altering data already in a database, you should make this endpoint a Mutation rather than a Query. This is as simple as making the API endpoint p
graphql.org
/src/graphql/apis/user.ts - createUser api를 정의하는 코드
특별한 설명은 없다.
위와 같이 두 코드를 만들고 app.ts에서 아래와 같이 코드를 짜면 모듈화 완성...! (사실 만족스러운 수준은 아니다. 회사 코드의 모듈화는 이거보다 훨씬 잘 되어 있어서... 그런데 아직은 이 이상의 모듈화는 필요 없어보이고, 프로젝트가 커지면 다시한번 제대로 모듈화를 진행해야 겠다.)
위 코드에서 쓰지도 않는 dummy 라는 쿼리가 있는데, 이 코드는 top-level의 query가 없으면 GQL이 에러를 발생시키기 때문에 더미로 넣어준 코드이다. 아래 사이트 참고
Error: Query root type must be provided.
Error: Query root type must be provided. 에러는 graphql 에서 root query가 없기 때문이다. 에러가 떴을시에 grapqhl 문구에는 아마도 사용자 정의 type과 type Mutation 만이 정의되어 있을 것이다. 이..
zereight.tistory.com
이제 DB 테이블을 생성하고
create table User ( id char(36), email VARCHAR(255), nickName VARCHAR(255), password VARCHAR(255), createdAt DATETIME, updatedAt DATETIME, deletedAt DATETIME );
인썸니아를 사용해 api를 요청하면
데이터가 생성됨을 확인할 수 있다.
후에 추가할 기능
- 비밀번호 암호화
- 모듈화 더 고도화
내일 할일
- 완전 간단한 회원가입 폼 만들고 API 요청해보기(토큰으로 요청하는 것까지)
'공부 > 웹 사이트 개발(끝)' 카테고리의 다른 글
1월 14~16일 - 웹 사이트 만들기(10) - elastic beanstalk에 배포하기 (0) 2021.01.14 1월 11~12일 - 웹 사이트 만들기(9) - reactstrap, graphql 요청, jwt 토큰 (1) 2021.01.11 1월 9일 - 웹 사이트 만들기(7) - 1월 첫째 주 결산 (0) 2021.01.10 1월 7일 - 웹 사이트 만들기(6) - graphQL 쿼리 날려보기, 결과물 sequelize로 반환하기 (0) 2021.01.07 1월 5일~6일 - 웹 사이트 만들기(5) - sequelize 코드 실행시키기 (0) 2021.01.05