SeSAC x CodingOn 웹 취업 부트캠프

[새싹/코딩온] 풀스택 웹 개발자 취업 부트캠프 6주차 (2): 환경변수, Sequelize, Database 응용

haeriyouu 2025. 1. 4. 21:02

환경변수

  • 운영체제나 소프트웨어에서 참조하는 변수로, 프로그램 동작에 영향을 주는 값들을 저장한다.

💻 dotenv 

  • .env 파일에 키=값 형식으로 환경변수를 정의
  • 보안에 민감한 정보를 코드에서 분리할 수 있다!
  • 보안상 중요한 정보를 포함하므로 .gitignore에 추가하여 버전 관리에서 제외해야 한다.

Sequelize

  • Node.js에서 사용하는 ORM(Object-Relational Mapping)라이브러리
  • 개발자가 SQL 쿼리를 직접 작성하지 않고도 Javascript 객체를 통해 데이터베이스와 상호 작용할 수 있다!

💻 모델 정의

Sequelize.define(param1, param2, param3);
// param1: 모델(테이블) 이름 설정
// param2: 컬럼 정의
// param3: 모델 옵션 정의

💻 컬럼 정의

  • type: 데이터 타입 (예: DataTypes.STRING, DataTypes.INTEGER)
  • allowNull: null 값 허용 여부 (기본값: true)
  • primaryKey: 기본 키 설정 (기본값: false)
  • autoIncrement: 자동 증가 설정 (INTEGER 타입에서 사용 가능)
  • unique: 고유값 설정
  • defaultValue: 기본값 설정
  • field: 실제 데이터베이스 컬럼명 지정
더보기
const GameModel = (sequelize, DataTypes) => {
  return sequelize.define(
    "game",
    {
      game_id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        allowNull: false,
        autoIncrement: true,
      },
      date: {
        type: DataTypes.DATE,
        allowNull: false,
      },
      location: {
        type: DataTypes.STRING(63),
        allowNull: false,
      },
    },
    {
      freezeTableName: true,
    }
  );
};

module.exports = GameModel;

Database 응용

💻 JOIN 종류

  1. INNER JOIN: 공통된 값만을 가진 행 반환
  2. LEFT JOIN: 왼쪽 테이블 모든 행을 포함하고, 오른쪽 테이블에서 일치하는 행을 결합 
  3. RIGHT JOIN: 오른쪽 테이블의 모든 결과가 포함되고, 왼쪽 테이블에서 일치하는 행을 결합 (없으면 NULL 값이 채워진다)
  4. FULL JOIN: 양쪽 테이블의 모든 레코드가 결과에 포함. 일치하지 않는 레코드는 NULL 값으로 채워진다. 중복은 제거된다.
SELECT 조회할 필드 FROM 테이블 명 INNER JOIN 조인할 테이블 명 ON 일치해야할 필드

#########################
-- JOIN: 두 테이블을 묶어서 하나의 테이블로 만듦

-- INNER JOIN
-- 1. INNER JOIN과 ON 사용
SELECT * FROM customer INNER JOIN orderlist ON customer.id=orderlist.customer_id;

-- 2. WHERE로 INNER JOIN 사용
SELECT * FROM customer, orderlist WHERE customer.id=orderlist.customer_id;

-- 3. INNER JOIN과 ON 사용, WHERE 조회 조건 추가
SELECT * FROM customer INNER JOIN orderlist ON customer.id=orderlist.customer_id WHERE quantity >=5;

-- 4. WHERE로 INNER JOIN, 조회 조건 추가
SELECT * FROM customer, orderlist WHERE customer.id=orderlist.customer_id AND quantity >=5;

-- 5. 특정 컬럼 조회
SELECT orderlist.id, customer.id, customer.name, orderlist.product_name, orderlist.quantity
FROM orderlist, customer WHERE customer.id=orderlist.customer_id;

-- 6. 테이블에 별침 지어서 접근(AS)
SELECT c.id, o.customer_id, c.name, o.product_name, o.quantity 
FROM customer as c, orderlist as o
WHERE c.id=o.customer_id;

-- ## [LEFT OUTER JOIN, RIGHT OUTER JOIN]
SELECT* FROM orderlist LEFT OUTER JOIN customer ON orderlist.customer_id=customer.id;
SELECT* FROM orderlist RIGHT OUTER JOIN customer ON orderlist.customer_id=customer.id;

-- ## NATURAL JOIN
SELECT * FROM orderlist NATURAL JOIN customer;
-- 같은 column이 없어서 안됨

 

💻 Relationship

  1. 일대일 (1:1) 관계: 한 테이블의 레코드가 다른 테이블의 레코드 하나와 정확히 연결
  2. 일대다 (1:N) 관계: 한 테이블의 레코드가 다른 테이블의 여러 레코드와 연결 
  3. 다대다 (N:M) 관계: 양쪽 테이블의 여러 레코드가 서로 연결
// 1) Player:Profile = 1:1 관계
PlayerModel.hasOne(ProfileModel, {
  onDelete: "CASCADE",
  onUpdate: "CASCADE",
  foreignKey: "player_id",
});
ProfileModel.belongsTo(ProfileModel, {
  foreignKey: "player_id", // 내가 정해주는 이름
});

// 2) Team:Player = 1:N 관계
TeamModel.hasMany(PlayerModel, {
  foreignKey: "teamid", // 내가 정해주는 이름
  sourceKey: "team_id", // 실제로 참조할 이름
});

PlayerModel.belongsTo(TeamModel, {
  foreignKey: "teamid",
  targetKey: "team_id", // 실제로 참조할 이름
  // 실제 team model의 컬럼명과 일치해야 함
  // models/Team.js의 primary Key
});

// 3) Team:Game = N:N 관계
// 중개 테이블 TeamGameModel을 활용해야 함
TeamModel.belongsToMany(GameModel, {
  through: TeamGameModel,
  foreignKey: "team_id", // 내가 정해주는 이름 for team model
});

GameModel.belongsToMany(TeamModel, {
  through: TeamGameModel,
  foreignKey: "game_id", // 내가 정해주는 이름
});