Skip to content

Web Trouble Shooting

Kyung Deok Si edited this page Nov 6, 2020 · 10 revisions
일자 작성자 요약
2020/11/04 02:16 시경덕 sequelize.findByPk() 사용 간 오류 해결
  • Model.findByPk(pk, {
      where: {
        isDeleted: false,
      },
    });
    위와 같이 사용하는 경우 실제로 호출되는 쿼리에서 isDeleted 조건을 무시
  • pk 조건 외 다른 조건이 필요한 경우 다음과 같이 findOne() 메소드를 사용해야 의도한 조건을 충족하는 데이터를 가져올 수 있음
    Model.findOne({ 
      where: {
        pk, 
        isDeleted: false 
      },
    });
일자 작성자 요약
2020/11/04 02:46 시경덕 include 옵션을 통한 LEFT OUTER JOIN
  • include를 통해 조인할 모델을 감싸는 객체에 require 옵션을 false로 설정할 경우, LEFT OUTER JOIN 으로 작동
  • include를 통해 조인할 모델을 감싸는 객체에 require 옵션을 true로 설정할 경우, INNER JOIN 으로 작동
  • require 옵션의 default 값은 where 조건이 있을 경우 true, 그렇지 않을 경우 false
  • 참고링크에서 Params 항목 내 options.include[].required 참고
일자 작성자 요약
2020/11/04 21:17 시경덕 include를 사용한 관계 데이터 호출 시 as 옵션 설정
  1. 관계를 설정할 두 model 클래스의 associate() 메소드를 통해 관계 설정
    • 관계 설정 시 옵션으로 외래키와 관계 정보를 위한 테이블 명(through) 등을 동일하게 설정
    // model/issue.js
    class Issue extends Model {
       ...
       static associate({ Issue, User }) {
         Issue.belongsToMany(User, {
           foreignKey: 'issue_num',
           through: 'assignments', // 두 관계를 표현할 테이블 명을 동일하게 설정
           timestamps: false,
         });
       }
    }
    
    // model/user.js
    class User extends Model {
       ...
       static associate({ User, Issue }) {
         User.belongsToMany(Issue, {
           foreignKey: 'user_num',
           through: 'assignments', // 두 관계를 표현할 테이블 명을 동일하게 설정
           timestamps: false,
         });
       }
    }
  2. model을 통해 데이터 호출 시, 관계 데이터를 참조할 property 명을 as 옵션으로 설정
    Issue.findAll({
      include: [
        {
          model: User,
          as: 'assignees', // issue['assignees'] 로 User 데이터 참조
        },
      ]
    });
  3. 데이터를 호출한 model 클래스의 관계 설정 옵션에서, 데이터를 호출할 때 사용한 as 옵션을 동일한 값으로 추가
    // model/issue.js
    class Issue extends Model {
       ...
       static associate({ Issue, User }) {
         Issue.belongsToMany(User, {
           ...
           as: 'assignees', // include 시 설정한 as 옵션 값과 동일하게 설정
         });
       }
    }
일자 작성자 요약
2020/11/05 20:00 시경덕 NGINX를 사용한 배포 간 이슈 해결
  1. NGINX 란?

    Nginx(엔진 x라 읽는다)는 웹 서버 소프트웨어로, 가벼움과 높은 성능을 목표로 한다. 웹 서버, 리버스 프록시 및 메일 프록시 기능을 가진다.

    • Nginx는 요청에 응답하기 위해 비동기 이벤트 기반 구조로 가진다. 스레드/프로세스 기반 구조를 가지는 아파치 HTTP 서버와 다르게 요청 수만큼 자식 프로세스를 생성하지 않기 때문에 CPU 부하와 메모리 사용량이 적다.
    • 다른 웹 서버와 비교하여 구성 파일을 읽고 조작하기 쉽다.
    • 위키백과 Nginx 문서 참고
  1. 왜 때문에 NGINX를 사용했는가

    1. 웹 서버로써의 NGINX

      • React 로 개발한 웹 어플리케이션의 build 산출물인 html, css, js 와 같은 정적 파일들을 배포하기 위한 웹 서버로 사용
    2. 리버스 프록시로써의 NGINX

      • 프론트 엔드 개발 환경으로 webpack-dev-server를 다음과 같은 옵션으로 사용

         devServer: {
         	port: 4000,
         	compress: true,
         	hot: true,
         	proxy: {
         	'/api': {
         		target: 'http://localhost:3000',
         	},
         	historyApiFallback: {
         	  rewrites: [{ from: /^\/*$/, to: '/index.html' }],
         	},
         }
      • 로컬에서는 webpack-dev-server로 접근하는 URIpath/api로 시작하면 API 서버를 호출하도록 proxy 옵션을 설정

         fetch('/api/issues');
         // -> http://localhost:4000/api/issues
         // -> [webpack-dev-server]
         // -> http://localhost:3000/api/issues
         // -> [API server]
      • 배포 환경에서도 webpack-dev-server와 같은 역할을 수행하는 프록시 서버가 필요

  2. NGINX 설치 및 구성 파일 설정

    1. 설치 과정

      • 처음에 sudo apt-get install nginx 명령으로 설치를 하려 했으나, 다음과 같은 오류가 발생

         dpkg: dependency problems prevent configuration of nginx:
          nginx depends on nginx-core (>= 1.10.3-0ubuntu0.16.04.2) | nginx-full (>= 1.10.3-0ubuntu0.16.04.2) | nginx-light (>= 1.10.3-0ubuntu0.16.04.2) | nginx-extras (>= 1.10.3-0ubuntu0.16.04.2); however:
           Package nginx-core is not configured yet.
           Package nginx-full is not installed.
           Package nginx-light is not installed.
           Package nginx-extras is not installed.
          nginx depends on nginx-core (<< 1.10.3-0ubuntu0.16.04.2.1~) | nginx-full (<< 1.10.3-0ubuntu0.16.04.2.1~) | nginx-light (<< 1.10.3-0ubuntu0.16.04.2.1~) | nginx-extras (<< 1.10.3-0ubuntu0.16.04.2.1~); however:
           Package nginx-core is not configured yet.
           Package nginx-full is not installed.
           Package nginx-light is not installed.
           Package nginx-extras is not installed.
        

        오류 메세지 출처

      • nginx 저장소와 공개 키를 추가하여 재설치

        # nginx 저장소 추가
        $ sudo vi /etc/apt/sources.list.d/nginx.list
        
        # 파일내 내용 추가
        deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ bionic nginx
        deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx
        
        # nginx 공개 키 추가
        $ wget http://nginx.org/keys/nginx_signing.key
        $ sudo apt-key add nginx_signing.key
        
    2. 구성 파일 설정

      • /etc/nginx/nginx.conf 설정

         # /etc/nginx/nginx.conf
        
         events {
         	worker_connections 768;
         }
        
         http {
         	server {
         		listen 80;
        
         		location / {
         			root /home/boostcamp/IssueTracker-16/web/client/public;
         			index index.html index.htm;
         			try_files $uri $uri/ /index.html;
         		}
        
         		location /api {
         			proxy_pass http://localhost:3000;
         		}
         	}
         }

        참고 링크

        nginx 시작 가이드 문서

🗂 Project

❗️ Ground Rules

🧩 Trouble Shooting

🗒 API Details

⭐️ Output


🗓 Minutes of meeting
🗓 Daily Scrum
🗓 Peer Session
🗓 Retrospective
Clone this wiki locally