TIL 21.06.24

Jaemin Jung·2021년 6월 24일
0

Today I Learned

목록 보기
46/62
post-thumbnail

오늘한일

mvc 디자인패턴을 바탕으로 sequelize를 이용해(orm)
요청에 따른 데이터베이스 핸들링 과제를 수행하였다.
이전 과제처럼 todo를 채우는 방식이 아니라,
직접 controller 파일을 바닥부터 만들어 보았다.

Achievement goals

  • Sequelize ORM으로 1:1. 1:N, N:N 관계를 표현할 수 있다.
  • splint를 통해 알게된 사실들 정리

design pattren

여기서의 디자인 패턴은 ‘소프트웨어 공학’의 개념을 말한다.
디자인 패턴(Design pattern)은 프로그램 개발 시에 자주 부닥치는 애로 상황에 대한 일반적이고 재사용 가능한 추상화된 해결책이다.
이번에 배웠던 mvc 패턴과 더불어, 이전에도 디자인 패턴을 배운적이 있다고 하였다.
바로 리액트의 단방향 데이터 흐름과, 리덕스의 Flux패턴도 디자인 패턴의 한 부분이라고 하더라.

module.exports & require

splint를 진행하면서 controller파일을 직접 바닥부터 만들어봤을때, module.exports 와 require에 대해서 깊게 이해하고 있질 않아 정보를 다시 찾아보았다.

프로그래밍에서 모듈은 외부에 영향을 받지 않는 독립된, 재사용 가능한 코드들의 묶음이다.

  • require()함수는 module.exports를 리턴한다.(외부 모듈을 가져온다.)
    인자로 들어가는 값에 경로를 설정하지 않는다면, NodeJS 자체 라이브러리에서 모듈을 찾게된다.

  • module.exports는 밖으로 내보낼 해당 파일의 코드를 module.exports의 객체에 정의하는 절차이다.
    바깥 파일에서 해당 파일을 가져오기 위해서는 module.export에 대입해줘야한다.

Migrations Model 차이점

Migrations은 적용되지 않은 설정값들을 실제 데이터베이스에 데이터를 반영한다.

Model은 sql을 객체지향 형식으로 가능하게 해주는것

Redirections

리다이렉트란 말 그대로 re(다시) + 지시하다(direct) 다시 지시하는 것이다.
사용자가 요청한 페이지가 아닌 다른 페이지 혹은 다른 서버로 접속하도록 유도하는 기술이다.

예를들어서 https://bitly.com/ 은 복잡한 url을 단순화 시킨 url로 만들어주는 서비스를 제공한다.

https://www.instagram.com/james.7507/ 는 내 인스타그램 url이다.
이를 짧게 단축시켜준 https://bit.ly/3gQNW2Y 로도 접속이 가능하다.

사용자가 https://bit.ly/3gQNW2Y 를 입력했을때 https://www.instagram.com/james.7507/ 로 접속하도록 유도해준다.

최초 요청을 받은 웹서버는 HTTP 응답 상태코드로 302를 보내고 응답 메시지 헤더 중 Location 값으로 리다이렉트 되어야 할 주소를 설정해 리턴한다.

그밖에 알게된 사실

기본적으로 테이블 이름이 지정되지 않은 경우 Sequelize는 모델 이름을 자동으로 복수화하여 테이블 이름으로 사용

Sequelize로 Schema 구현

(Associations을 이용한 Join Table 구현)

  1. 새로운 모델과 마이그레이션을 생성한다.(users)
    • 모델 생성할때 마이그레이션 파일도 자동 생성
npx sequelize-cli model:generate --name user --attributes name:string
  1. urls 테이블에 칼럼을 추가하기 위해
    마이그레이션 스켈레톤 파일을 만듦
npx sequelize-cli migration:generate --name add_userid
  1. 스켈레톤 파일을 생성하면 내부는 up과 down 함수를 가진 객체가 존재한다.

up: 마이그레이션 실행 명령어
npx sequelize-cli db:migrate를 실행했을때,
실행 되는 함수, 내부는 원하는 쿼리문을 작성한다.

down: 마이그레이션 undo 명령어
npx sequelize-cli db:migrate:undo를 실행했을때,
실행 되는 함수, 내부는 up에서 추가한 내용을 삭제 해주는 쿼리문을 작성한다.

  1. 스켈레톤 파일에서 컬럼 추가, 외래키 연결

queryInterface, Sequelize는 객체,클래스(내부에 여러 메소드 존재)

칼럼추가 / (해당 테이블, 추가할 컬럼 이름, 타입)

await queryInterface.addColumn('urls', 'userId', Sequelize.INTEGER );

왜래키 연결

await queryInterface.addConstraint('urls', {
      fields: ['userId'],
      type: 'foreign key',
      name: 'FK_user',
      references: {
        table: 'users',
        field: 'id'
      },
      onDelete: 'cascade',
      onUpdate: 'cascade'
    });

onDelete, onUpdate -> 왜래키로 연결된 데이터가 삭제 업데이트 되었을때 어떻게 상호작용할것인지 정의
cascade는 연쇄작용을 의미

Associations을 이용한 Join Table 구현
model의 index.js에서 구현한다.

시퀄라이즈의 models 객체 내부에 설정한 모델이름이 키값으로 있고,
구조분해 할당으로 변수에 각각 지정해준다.
예를들어 n:1 상황이라면

n belongsTo(1);
1 hasMany(n);

const {url, user} = sequelize.models;
url.belongsTo(user);
user.hasMany(url);

참고 사이트

https://dololak.tistory.com/147
https://shoark7.github.io/programming/knowledge/what-is-design-pattern
https://medium.com/@chullino/require-exports-module-exports-%EA%B3%B5%EC%8B%9D%EB%AC%B8%EC%84%9C%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1d024ec5aca3

profile
내가 보려고 쓰는 블로그

0개의 댓글