본문 바로가기
일지/FlowFroge(GTDList)

FlowForge(GTDList) 01-07 일지 모델 확정 및 sequelize 활용

by 리나그(ReenAG) 2024. 1. 9.
728x90
반응형

 오늘은 예고했던 대로 백엔드를 만지기 시작했다. 우선 아직 완벽하지 않은 user, task, global-value 테이블의 기본적인 모델을 확실히 확정하기로 했다.

- 모델 정리 

이럴 때야 말로 내 머리로 직접 일일이 생각하기보다는 GPT를 이용할 때다. user에 대한 스키마는 흔해빠졌지만 일일이 생각하기 귀찮기 때문이다.

GPT에게 물어본 질문은 이렇다 (문법적으로 틀린 문장이 있다면 ㅈㅅ) : 

Here is another question. 
What attribute of user model will usually get when making a webpage? 
I mean, there is gotta be more than just username and password, right?

 

답변은 이렇다 : 

  1. Username/Email: Unique identifier for the user. Email is often used as it is unique and useful for communication.
  2. Password: Hashed password for security purposes. Never store passwords in plain text.
  3. First and Last Name: User's given name and surname for personalization and identification.
  4. Profile Picture: A URL or binary data for the user's profile image.
  5. Role/Permissions: Determines what the user is allowed to do on the site (e.g., admin, regular user, moderator).
  6. Date of Birth: Useful for age verification and personalized greetings or offers.
  7. Gender: Can be used for personalized content or demographic analysis.
  8. Contact Information: Phone number, alternate email, etc., for communication or account recovery.
  9. Address: Physical or mailing address, useful for sites that require shipping or location-based services.
  10. Registration Date/Time: The date and time the account was created, useful for tracking user tenure or for administrative purposes.
  11. Last Login Date/Time: Helps in identifying active users and for security audits.
  12. Account Status: Indicates whether the account is active, suspended, or closed.
  13. Email Verified: Indicates whether the user's email has been verified, crucial for account security.
  14. Password Reset Token/Expiration: Used for secure password recovery processes.
  15. User Preferences: Customizable settings like language, layout preferences, or communication preferences.
  16. Biography/About Me: A brief user-written description, often seen in social platforms.
  17. Social Media Links: Links to social media profiles, if relevant.
  18. Terms of Service/Privacy Policy Agreement: Indicates agreement to legal terms, often required for compliance.
  19. API Tokens/Keys: If users can interact with an API, they might have associated keys or tokens.
  20. Subscription Details: Information about user subscriptions or memberships, if applicable.

뭐 실제로 생각할 만한건 죄다 있는 듯 하니, 그냥 대충 뽑아서 보면

물론, 이런 건 엄연히 개인 정보에 해당하기 때문에... 개인정보처리방침을 직접 유저들에게 고지해야 할 필요성이 생긴다.

 

1. email - 실제로 user id로 쓰면 될 듯하다.

2. password - 없으면 안됨

3. 프사

4. 계정 생성 일시

5. 최근 로그인 일시

6. 계정 상태(활성화, 삭제, 이메일 활성화 대기 등)

7. 이메일 활성화 토큰

8. pw 만료일

9. 유저 개인 설정

10. 유저 개인 프로필 소개

11. 유저 개인 sns 링크

12. 서비스제공방침 / 개인정보 처리 방침 동의 여부

13. 유료 플랜 구매 여부 / 구매 시 기간(경우에 따라서 영구적일 수도...)

 

등등... 이런 것들을 고려해서 아래의 테이블을 짰다.

import { DataTypes } from 'sequelize';

export default (sequelize) => {
    return sequelize.define(
        'User',
        {
            id: {
                autoIncrement: true,
                type: DataTypes.INTEGER.UNSIGNED,
                allowNull: false,
                primaryKey: true,
            },
            email: {
                type: DataTypes.STRING,
                allowNull: false,
            },
            profile_image_url: {
                type: DataTypes.STRING,
            },
            recent_login: {
                type: DataTypes.DATE,
            },
            account_login_method: {
                type: DataTypes.ENUM,
                values: ['normal', 'google', 'kakao'],
                allowNull: false
            },
            account_state: {
                type: DataTypes.ENUM,
                values: ['active', 'closed', 'email_verfiy_needed', 'suspended'],
                defaultValue: 'email_verfiy_needed',
                allowNull: false
            },
            password_invalidate: {
                type: DataTypes.DATE,
                allowNull: false
            },
            perferences: {
                type: DataTypes.JSON,
            },
            biography: {
                type: DataTypes.STRING,
            },
            terms_of_service_agreement: {
                type: DataTypes.JSON,
            },
            subscription_level: {
                type: DataTypes.STRING,
            },
            subscription_period: {
                type: DataTypes.DATE,
            },
            social_links: {
                type: DataTypes.JSON,
            },
            google_id: {
                type: DataTypes.STRING,
            },
            google_access_token: {
                type: DataTypes.STRING,
            },
            kakao_id: {
                type: DataTypes.STRING,
            },
            kakao_access_token: {
                type: DataTypes.STRING,
            },
        },
        {
            sequelize,
            tableName: 'User',
            indexes: [
                {
                    name: 'PRIMARY',
                    unique: true,
                    fields: [{ name: 'id' }]
                },
                {
                    name: 'email',
                    unique: true,
                    fields: [{ name: 'email' }]
                },
            ],
            timestamps: true
        }
    );
};

 

sequelize는 SQL과 js 객체 사이를 이어주는 플랫폼으로써, 이번에 백엔드에 채용하고자 하는 핵심 라이브러리 중에 하나다. 요즘엔 벌써 올드 해졌을지는 모르겠지만... 그런 건 일단 신경 안 쓰기로 했다. 하여간에 이것을 제외하고도 task의 모델, global-value의 모델등을 미리 확정해 두었다.

 

 아... 그렇다고는 해도 딱히 개발 속도가 나지는 않는 것 같다는 생각이다. 내가 얼마 코딩해보지 못한 영역이기도 하고... 빠르게 피드백을 하기 어려운 복잡한 역할을 수행해야 하는 코드이다 보니, console.log으로 보는 것도 한계가 있는 느낌이다.

 

 그래서 테스트 환경을 적당히 만들어야 할 것 같다는 느낌인데... 깡으로 한번 만들어 보는 것도 경험일 테니 일단 추후에 만들어 봐야겠다.

 

 


 아마 이 글을 읽고 있는 사람은 이상하게 생각할 것이다. 어째서 이 글을 1월 9일에 올리는지...(혹은 전혀 신경쓰지 않았을지도 ㅜ) 글의 대부분은 실제로 7일에 작성했고, 그때 마무리가 될 거라고 생각했다. 그러나, 의외로 이 작업이 어려운 것도 있었고(내 개발 실력이 부족한 탓이기 때문에 그저 우는 수 밖에는...), 즉각적인 반영과 피드백이 빠른 프런트엔드에 비해서, 백엔드가 정확한 지향점이랄 게 잘 보이지 않기 때문이다. 물론 기획은 어느 정도 되어있고, Readme를 보면서 조금씩은 고쳐나가고 있다만, 부족한 느낌이다. 또 하나의 요인은 내 나쁜 습관이 재발한 것도 있다. 내가 지금 모든 model의 기능을 이용할게 아닌데도 불구하고 너무 많은 것을 고려하고 있다. 내 성격이 큰 숲을 먼저 보는 성격이라서 처음에 모든 걸 죄다 때려 박는 습관이 있다. 개발에서 이 성격이 안 좋게 변질되면 이렇게 된다. 조금은 참을성을 더 가지는 수 밖에는...

 

 그래도 일단 오늘까지 추가로 작업한 물량에 대해서는 바로 일지를 업로드할 예정이다.

728x90
반응형