Node

송은우·2022년 1월 10일
0

import nunjucks from nunjucks
app.set('view engine','html');

app.setview대신
nunjucks.configure('views',{
express:app,
watch:true,
});

{{title}}
같은 것이 변수 넣는 방식이 됨 {% set node= 'Node.js'%} 같은 방식으로 변수 내부 선언 escape는
{{이스케이프 하지 않음|safe}}
같은 것들이 있을 수 있음 {% for item in array %}
  • {{item}}
  • {% endfor %} 같은 것을 통해 접근 가능함. {{loop.index}}를 통해 for문 안에 선언 안 하고 바로 접근 가능함. {{% if is asdf %}} {{% else %}} of {{% elif %}} {{% endif %}}

    {% include "header.html" %} 을 통해 헤더
    {% block content %}를 통해 처리 가능
    {% endblock%} 여기서 block은 다른 파일에 있는 코드를 의미함.
    {% extends '적용할 파일명' %} 를 불러올 파일 위에 적고,
    {% block content %}를 설정함
    {% endblock %}가 불러올 블럭 밑에 있어야 함. 이걸 그대로 불러옴.

    Mysql 에서 Index 아무이름 (인덱싱할변수명 ASC(오름차순))
    Foreign Key (sql상의변수)
    REFERENCES 어떤테이블 (어떤변수)
    를 통해서 외부 참조를 해서 비교할 수 있음
    ON DELETE CASCADE("on delete cascade"는 B tuple이 foreign key로 A tuple을 가리키고 있을 때, A tuple을 삭제하면 B tuple도 같이 삭제되는 기능이다.
    (setnull 사용자명만 바꿈, no action 아무것도 안 함)
    UNIQUE 면 INDEX 필수

    INSERT INTO 테이블명 (변수들) values (넣을값)
    SELECT 변수명,변수명 FROM (컬럼명 변수명에 해당하는 컬럼만 보여줌. *는 전체)
    뒤에 WHERE 변수명>0 같은 것들 설정 가능
    뒤에 ORDER BY 변수명 DESC(내림차순) 붙히면 정렬
    뒤에 LIMIT 숫자
    뒤에 OFFSET OFFSET 건너뛰고 뒤에만 찾을 수 있음.
    UPDATE 테이블명 SET 변수명='바꿀 내용' WHERE 조건 같은 것들을 통해 처리도 가능함.

    시퀄라이즈

    시퀄라이즈로 여러 RDB 호환 가능한 JS코드를 작성이 가능함. 하지만 간단한 것들만 처리 가능함.
    express morgan nunjucks sequelize sequelize-cli mysql2(여기 mysql2는 노드랑 mysql연결하는 드라이버임)
    npx sequelize init => config/config.json등 여러개 만들어줌.

    const Sequelize = require("sequelize");
    
    const env = process.env.NODE_ENV || "development";
    const config = require("../config/config")[env];
    const db = {};
    
    const sequelize = new Sequelize(
      config.database,
      config.username,
      config.password,
      config
    );
    
    db.sequelize = sequelize;
    db.Sequelize = Sequelize;//이 부분은 굳이 db에 넣을 필요 없이 import sequelize하면 됨
    
    module.exports = db;

    이 부분이 sequelize와 mysql 연결 코드

    CREATE 로 cmd넣기
    workbench
    model로 만들기 총 3가지 방법으로 테이블 생성 가능

    module.exports = class 모델명 extends Sequelize.Model{
     static init(sequelize) {
        return super.init(//id 는 자동으로 넣기에 생략이 가능함
        //SQL타입과 sequelize 타입과 다름 INT, INTEGER BOOLEAN, TINYINT 등
          {
            name: {
              type: Sequelize.STRING(20),
              allowNull: false,
              unique: true,
            },
            age: {
              type: Sequelize.INTEGER.UNSIGNED,
              allowNull: false,
            },
            married: {
              type: Sequelize.BOOLEAN,
              allowNull: false,
            },
            comment: {
              type: Sequelize.TEXT,
              allowNull: true,
            },
            created_at: {
              type: Sequelize.DATE,
              allowNull: false,
              defaultValue: Sequelize.NOW,
            },
            //createdAt,updatedAt이 timestamp:true인 기능임.
          },
          {
            sequelize,//db.sequelize 객체가 들어감
            timestamps: false,//true면 createdAt, updatedAt을 자동으로 만들어짐
            underscored: false,//createdAT or created_at 이런 것 정의
            modelName: "User", //JS 명
            tableName: "users", //sql명
            paranoid: false, //soft delete를 할지 deletedAt을 처리할 수 있음
            //hard delete는 완전 db에서 삭제, soft delete는 삭제 대신 그냥 표시정도
            charset: "utf8",
            collate: "utf8_general_ci",//utf8을 정렬하는 방법
          }
        );
      }
      static associate(db) {}//관계 컬럼
    }

    1:1 관계 사용자 테이블, 사용자 정보 테이블 => db.User.hasOne(db.Info,{foreignKey:'UserId',sourceKey:'id'}); 같은 것이 가능함
    db.Info.belongsTo(db.User,{foreignKey:'UserId',targetKey:'info');
    이거는 hasOne과 belongsTo가 양쪽 모두 왔다갔다 할 수 있다는 특징이 있음.
    선택의 팁은 어떤 테이블에 foreignKey에 해당하는 컬럼을 추가할 지에 대해서 고려하면 됨.

    1:N 관계 사람 1명이 여러 댓글을 작성
    N:M 관계 공동 집필하는 작성자 있는 게시글, 게시글 여러 해시태그, 하나 해시태그 여러글 등
    중간 테이블이라는 것이 생김. 대부분 User쪽에 다대다 관계를 설정함
    db.Post.belongsToMany(db.Hashtag,{through:'PostHashtag'})
    db.Hashtag.belongsToMany(db.Post,{through:'PostHashtag'})
    이렇게 중간 테이블 PostHashtag를 설치하는 방식으로 처리함

    postId hashtagId
    1 1
    1 2
    2 1
    3 3 같은 것들이 있긴 함.

    //User 쪽에 작성할 코드 db.User.hasMany(db.Comment, { foreignKey: "commenter", sourceKey: "id" }); //Comment쪽에 작성할 코드 db.Comment.belongsTo(db.User, { foreignKey: "commenter", targetKey: "id" });
    이게 sequelize 에서 1:N관계 표현 하는 방법 Comment의 commenter라는 컬럼이 내 id를 참조하고 있다 라는 뜻

    Comment 쪽에서 belongsTo가 있는 쪽에 foreignKey 컬럼이 추가됨. targetKey가 상대꺼
    ``
    INSERT INTO nodejs.users (name, age, married, comment) VALUES ('zero', 24, 0, '자기소개1'); //이 부분이 Console 내용. 밑이 JS 코드
    const { User } = require('../models');
    User.create({
    name: 'zero',
    age: 24,
    married: false,
    comment: '자기소개1',
    });


    SELECT FROM nodejs.users;
    User.findAll({});
    SELECT
    FROM nodejs.users LIMIT 1;
    User.findOne({});
    SELECT name, married FROM nodejs.users;
    User.findAll({
    attributes: ['name', 'married'],
    });

    SELECT name, age FROM nodejs.users WHERE married = 1 AND age > 30;
    const { Op } = require('sequelize');
    const { User } = require('../models');
    User.findAll({
    attributes: ['name', 'age'],
    where: {
    married: 1,
    age: { [Op.gt]: 30 },
    [Op.or]: [{ married: 0 }, { age: { [Op.gt]: 30 } }], //or 같은 처리도 가능
    order: ['age', 'DESC'],['id','DESC']
    limit: 1,
    offset: 1,//같은 1순위 정렬, 2순위 정렬 이런 느낌으로 쭉 가는게 가능함.
    },
    });
    User.update({
    comment:'바꿀 내용'
    })
    User.destroy({
    where:{id:2}
    })
    ``
    Op.gt , Op.lt, Op.gte Op.Lte, 같은 것들이 가능함. in(in array),ne(not equal)
    이런 코드들을 통해서 고르는 옵션 조절 가능

    const user=await User.findOne({ include: [{ model: Comment, }] })
    이 코드로 관계있는 것까지 다 가져옴 JOIN 기능.
    console.log(user.Comments); 1:다 인 경우에 복수형으로 자동으로 바꿔줌
    user=await User.findOne({});
    comments=user.getComments() 를 통해서 commets도 처리가 가능은 함.
    include는 성능상 문제가 있을 수 있음. 둘다 해보고 시간 초를 재보기
    include 내부에 where 과 그냥 where은 전혀 다르다. 어떤 속성에 속해있는지 생각하기
    getComments안에 where을 넣는 방법이 조금 더 직관적일 수는 있음.
    사용자를 먼저 만들고, 생성을 할때 id를 넣는 방법이 가장 많이 사용되는데,
    게임의 아이템 같은 경우 그냥 빈 객체를 먼저 만들고, 소유권을 나중에 하는 방법도 가능함.
    await user.addComment(comment.id) 같은 방식으로 연결을 시킴

    일반 쿼리 create, read update delete 였다면
    관계 쿼리는 add, get, set, remove 으로 서로 다르게 만들어서 조금 더 구분된다는 사실 정도
    rqw 쿼리에서 sql을 바로 날릴 수 있음.

    npx sequelize db:create로 db 생성 config.json에 나와 있는 database으로 만들어줌.
    테이블은 모델에 sync 되는 순간 바로 생성됨. console 에 create 보는 것도 가능함.

    페이지를 보내는거 아니면 대부분 JSON씀 단순한 문자열 SEND. SENDFILE, template engine rendering => render
    1:다 관계에서 작성자 =>댓글, 댓글->작성자 모두 가능함.

    profile
    학생의 마음가짐으로 최선을 다하자

    0개의 댓글