Giter VIP home page Giter VIP logo

pinterestbe's Introduction

PinterestBE

항해99 8기 7주차 5조 백엔드 레포지토리입니다

!! 서비스 시연 영상 자리 !!

!! 백앤드 다이어그램 !!

팀원

성함 GitHub Contact
이민석 @unchaptered 기술 블로그 / TIL 용 블로그
황수민 @sumin-dev -
이수범 @subeom-Lee -

image image

모듈 리스트

"dependencies": {
    "joi": "^17.6.0",               // 유효성 검증 라이브러리
    "cors": "^2.8.5",               // CORS 이슈 해결을 위한 라이브러리
    "express": "^4.18.1",           // Express 라이브러리

    "jsonwebtoken": "^8.5.1",       // JWT 생성을 위한 아리브러리
    "axios": "^0.27.2",             // Kakao 사용자 정보 요청을 위한 라이브러리

    "sequelize": "^6.21.4",         // ORM 라이브러리
    "mysql2": "^2.3.3",             // ORM 사용을 위한 종속성 라이브러리

    "dotenv": "^16.0.1",            // 적용 대기 중인 라이브러리

    // 버젼 이슈가 존재하기 때문에 다음 버전을 준수해야함
    "multer": "^1.4.5-lts.1",       // multipart-form 해석을 위한 라이브러리
    "multer-s3": "^2.10.0",         // aws-sdk 와 multer 호환을 위한 종속성 라이브러리
    "aws-sdk": "^2.1195.0",         // aws 서비스를 사용하기 위한 라이즈러리
},
"devDependencies": {
    "prettier": "^2.7.1",           // 팀 컨밴션 통일을 위한 라이브러리
    "husky": "^8.0.1",              // Git Hooks 지원 라이브러리
    "lint-staged": "^13.0.3",       // Git add 에 대해서 문서 수정 (서식에 맞게) 라이브러리

    "sequelize-cli": "^6.4.1",      // Sequelize 지원 라이브러리

    "jest": "^28.1.3",              // 테스트 코드 라이브러리
    "faker": "^5.5.3",              // Mock Data 생성 라이브러리
    "node-mocks-http": "^1.11.0",   // Mock Req, Res 생성 라이브러리
    "supertest": "^6.2.4",          // 테스트 코드 라이브러리
    "superagent": "^8.0.0",         // 테스트 코드 라이브러리

    "cross-env": "^7.0.3",          // 적용 대기 중인 라이브러리
},

API 명세서

  • 작성일 : 2022-08-19

pin

pinId     : number
userId    : number
title     : string
content   : string
picKey    : string
picUrl    : string

comment

commentId  : number
userId     : number
pinId      : number
content    : string
createdAt  : Date

`localhost:3000/api/pin?page=${1}&pageCount=${10}`

Response Form

isSuccess : boolean
message   : string
result    : object
{
  isSuccess: true,
  message: '',
  result: {
  }
}

JWT Error JWT 에러 존재

//  JWT 토큰이 필요한 도메인에서는 다음의 에러가 발생할 수 있습니다.
{
  isSuccess: false,
  message: “토큰이 필요합니다. || “만료된 토큰입니다. || “유효하지 않은 토큰입니다. || err.message,
  result: {}
}

api1 api2 api3 api4 api5


ERD

erd


폴더 트리

폴더구조

pinterestbe's People

Contributors

unchaptered avatar sumin-dev avatar subeom-lee avatar

pinterestbe's Issues

Bug : git clone permission denied

한 일

@subeom-lee 님 로컬에서 git clone 하셨는데, permission denied 가 되었습니다.

에러 내용

Cloning into 'PinterestBE'...
The authenticity of host 'github.com (`IPv4`)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

조치 사항

만약 조치한 것이 있거나 구글링한 게 있다면, ...

환경 설정

OS:
Node: 16.15.1(unchpatered) 16.16.0(sumin-dev, subeom-lee)
npm : 8.1.1(all)

Docs : EC2 + RDS + S3 설정 하기!

절차

  1. EC2 용 보안그룹 (적용 대상 : EC2)
  2. EC2 인스턴스 생성
    1. *.pem 키 생성
    2. 이외의 접근 방법은 오늘 문의!!
    3. 인스턴스에 Node, Git 등 설정
  3. RDS 용 보안그룹 (적용 대상 : RDS, RDS 를 사용할 EC2)
  4. RDS 생성
  5. S3 용 IAM (계정)
    1. S3 용 일반 계정(관리자) 의 하위에 만들어져 있는 서비스에 접근할 수 있는 권한
  6. S3 버킷 생성

EC2 보안그룹 설정

  • SSH 22 Anywhere IPv4
  • HTTP 80 Anywhere IPv4
  • 사용자 지정 TCP 3000 Anywhere IPv4

EC2 인스턴스 생성

  • 사전에 생성한 보안그룹 선택
  • pem 키 새로 발급받고 저장
  • EC2 기본 설정

RDS 용 보안그룹 설정

  • MYSQL/Aurora 3306 Anywhere IPv4
  • 만든 보안그룹을 EC2 에 추가
  • 만든 보안그룹을 이용해서 RDS 에 추가

RDS 생성

  • [설정] - [자격 증명 설정] - [마스터 사용자 이름] 에 있는 admin (기본값) 을 꼭 기억해두시고 불편하시다면 Local 에 기본값인 root 로 변경해주시면 됩니다.
  • VPC 란? 검색 해보시면 됩니다.
  • [퍼블릭 엑세스] 허용
  • [마이너 버전 업그레이드] 해제 (이건 그냥 개인 취향입니다...)

S3 용 IAM 설정

  • 보안 정책 누르셔서 읽고 선택하시거나, 자세한 내용 궁금하시면 구글링.
  • 그리고 보안 정보니까 꼭 환경 변수 로 사용 해야 합니다.

S3 생성

  • AWS 리전을 EC2 나 RDS 랑 동일하게
  • [객체 소유권] 설정을 [ACL 활성화] 해야합니다.자세한 내용은 구글ㅇ
  • 퍼블릭 엑세스 허용할건지...

Bug : Sequelize 에서 onUpdate onDelete cascade 옵션이 작동 안함

한 일

Pins 테이블에 Comments 가 관계되는 방식을 일종의 목록 테이블로 PinComments 를 만들어서 사용하고있습니다.

PinComments 에 pinId 와 commentId 가 모두 FK 로 연결 되어 있고 onDelete onUpdate 가 cascade 옵션으로 걸려 있습니다.

에러 내용

그런데, Pin 을 삭제하려고 하면 해당 cascade 옵션이 작동하지 않습니다.

image

16:08:14
delete from comments where commentId = 3
Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails (pinterest_development.pincomments, CONSTRAINT pincomments_ibfk_2 FOREIGN KEY (commentId) REFERENCES comments (commentId)) 0.000 sec

조치 사항

Migrations 에는 FK 만 걸려있고 Models 에는 FK + cascade 까지 걸려있어서, 아마도 이 부분인 것 같습니다.

ERD 스크린샷

환경 설정

OS: Windows 10
Node: 16.15.1(unchpatered) 16.16.0(sumin-dev, subeom-lee)
npm : 8.1.1(all)

Docs : EC2 인스턴스 셋업 총괄 (Git, Node, Nginx 까지)

Nginx + Express 사용 설정

직전에 작성해 두었던 문서를 기반으로 제작되었습니다.

https://velog.io/@unchapterd/%EA%B5%AC%ED%98%84-Reverse-Proxy-Server
https://github.com/motd-5/motd-backend/blob/main/docs/technique/aws/Nginx%20%2B%20Express%20%EC%82%AC%EC%9A%A9%20%EC%84%A4%EC%A0%95.md

1단계 : AWS 설정

보안 그룹 생성 : 이름 가제 [project-security-group]

  • SSH 22 Anywhere IPv4
  • HTTP 80 Anywhere IPv4
  • 사용자 정의 TCP/IP 3000 Anywhere IPv4

EC2 인스턴스 생성 : 이름 가제 [project-server]

  1. 보안그룹 선택 : project-security-group
  2. SSH 발급 및 저장
  3. *.pem 키 권한 설정 참고글

Node 설치 및 기본설정

curl -s https://deb.nodesource.com/setup_16.x | sudo bash
sudo apt update
sudo apt install nodejs

sudo node -v
sudo npm -v
sudo git -v


sudo npm install pm2 -g
sudo npm ls -g


sudo git clone -b submain https://github.com/motd-5/motd-backend project
ls
cd /home/ubuntu/project
sudo npm ci

cd /home/ubuntu/project/src/sequelize
sudo mkdir seeders
sudo mkdir config

cd /home/ubuntu/project/src/sequelize/config
sudo nano config.json

-- Ctrl + O > Enter : 저장 -- Ctrl + X : 저장이 완료되었을 때는 바로 나와지고, 그렇지 않을 때는 아래 읽어보면 됨...

sequelize/config/config.json

{
    "development": {
        "username": "root",
        "password": "RDS-비밀번호",
        "database": "RDS-DB-이름",
        "host": "RDS-주소값",
        "dialect": "mysql"
    },
    "test": {
        "username": "root",
        "password": "RDS-비밀번호",
        "database": "database_test",
        "host": "RDS-주소값",
        "dialect": "mysql"
    },
    "production": {
        "username": "root",
        "password": "RDS-비밀번호",
        "database": "database_production",
        "host": "RDS-주소값",
        "dialect": "mysql"
    }
}

또한 다음의 파일을 만들어 주세요.

cd /home/ubuntu/project/src/middlewares/s3
sudo mkdir config

cd /home/ubuntu/project/src/middlewares/s3/config
sudo nano s3.config.json

middlewares/s3/config/s3.config.json

{
    "accessKeyId": "엑세스 키",
    "secretAccessKey": "시크릿 키",
    "region": "ap-northeast-2"
}

최종적으로 sequelize 를 설정해주세요.

cd /home/ubuntu/project/src/sequelize
sudo npx sequelize db:drop
sudo npx sequelize db:create
sudo npx sequelize db:migrate

준비가 종료되면 다음을 입력해주세요.

cd /home/ubuntu/project
npm run dev
pm2 start ./src/index.js

2단계 : Nginx

sudo apt install nginx
cd /etc/nginx/sites-enabled
sudo nano 도메인-주소
server {

	 listen 80;
   	 listen [::]:80;

	location / {
    		proxy_pass http://127.0.0.1:3000;
  	}

}
cd /etc/nginx
sudo nano nginx.conf
  1. # server_names_hash_bucket_size 64; 구문을 찾아서 # 주석 표시용 문구를 지워주세요
  2. include /etc/nginx/sites-enabled/*; 구문을 찾아서 include /etc/nginx/sites-enabled/도메인-주소; 로 변경해주세요.

Bug : Git commit error

한 일

git add .
git commit -m "sequelize model을 받기위한 임시저장"

에러 내용

git commit -m "sequelize model을 받기위한 임시저장"
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
'"node"'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.
husky - pre-commit hook exited with code 1 (error)

조치 사항

npm run prepare 을 통해 husky install 을 진행했음 에도 해당 에러가 해결 되지 않아서
git commit -m "sequelize model을 받기위한 임시저장"--no-verify
이렇게 뒤에 --no-verify을 붙혀서 저장해줬다.

환경 설정

OS: window10
Node: 16.15.1(unchpatered) 16.16.0(sumin-dev, subeom-lee)
npm : 8.1.1(all)

Bug : Migrate 를 했음에도 FK 가 안걸리는 이슈

한 일

커밋 히스토리 에서 5b464b7 커밋 까지 진행하여 기본 탬플릿이 완성 되어 있습니다.

에러 내용

foreign_key

조치 사항

다음 명령어를 순차 입력 했음 에도 외래키 참조가 걸리지 않는 현상이 있습니다.

  1. npx sequelize db:drop
  2. npx sequelize db:create
  3. npx sequelize db:migrate:undo
  4. npx sequelize db:migrate

환경 설정

OS: Windows 10
Node: 16.15.1(unchpatered) 16.16.0(sumin-dev, subeom-lee)
npm : 8.1.1(all)

Bug : sequelize db;create error

한 일

  1. ./src/sequelize/seeders 폴더 생성
  2. ./src/sequelize/config/config.json 파일 생성 후 비밀번호 변경
  3. ./src/modules 빈 폴더 생성
  4. npm install로 node_modules 생성

프로젝트 환경 설정 중에 위 목록들을 작업한 후,
npx sequelize db;create를 했을 때 에러가 발생합니다.
npx run dev도 안됩니다.

에러 내용

PS C:\Users\Samsung\PinterestBE\src\sequelize> npx sequelize db:create
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
npm ERR! could not determine executable to run

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\Samsung\AppData\Local\npm-cache\_logs\2022-08-19T16_09_28_079Z-debug-0.log

조치 사항

아래 사이트를 참고하여 .git/hooks 폴더를 밖으로 이동 후 npm install을 하고 npx sequelize db:create를 해도 똑같은 문제 발생.

https://stackoverflow.com/questions/67833794/npm-err-could-not-determine-executable-to-run

환경 설정

OS: Windows 10
Node: 16.15.1(unchpatered) 16.16.0(sumin-dev, subeom-lee)
npm : 8.1.1(all)

Bug : Kakao Userdata 고유키 의 타입이 int 의 범위를 초과

한 일

AuthRepository 에서 Kakao 사용자 정보 불러오기 API 로 받은 정보를 저장하는 코드가 있습니다.

class AuthRepository {

   /* ~~ */

    uploadSnsToken = async (providedId, accessToken, refreshToken) => {
        const snsToken = await SnsTokens.create({
            providedId,
            accessToken,
            refreshToken
        });

        /** @type { { snsTokenId: number, category: string, providedId: number, accessToken: string, refreshToken: string } } */
        const createdSnsToken = snsToken.dataValues;
        return createdSnsToken;
    };

   /* ~~ */

}

에러 내용

findOne 메서드를 통해서 찾으면 해당 ROW 가 나오지 않고 create 를 하려고 하면 DUPLICATED 에러가 발생했습니다.

받은 값은 2647443647 이었는데, MySQL 에 들어있는 값은 2147483647 로 자동으로 변해 있었습니다.

조치 사항

MySQL INT 타입의 최대 크기는 -2147483648 ~ 2147483647 으로 Kakao 에서는 BIGINT 를 사용하고 있는 것 같았습니다.
따라서, Sequelize Migartions 와 Models 의 기본 타입을 INTEGER 에서 BIGINT 로 변경하여 에러를 수정하였습니다.

즉,

찾으려고 했을 때는 BIGINT 기준으로 찾아서 2147483647 가 초과되는 값이었고 실제 DB 에 들어갈때는 자동으로 최댓값인 2147483647 으로 맞춰져 있었던 것입니다.

환경 설정

OS: Windows 10
Node: 16.15.1(unchpatered) 16.16.0(sumin-dev, subeom-lee)
npm : 8.1.1(all)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.