실습 - Relationship의 실습

YoonSuk Choi·2024년 12월 12일

6주차_Relationship

목록 보기
2/2

MVC와 Relationship 실습

Relationship의 내용

관계 정의

  1. Player - Profile 관계: 1:1 관계를 통해 선수와 그의 세부 정보를 연결. 선수 삭제 시 프로필도 함께 삭제됨.
  2. Team - Player 관계: 1:N 관계를 통해 팀과 소속 선수들을 연결.
  3. Team - Game 관계: M:N 관계를 통해 중개 테이블인 TeamGame을 사용해 팀과 경기의 관계를 정의.

Sequelize를 활용한 모델 관계 설정

  • Player 모델과 Profile 모델 간 관계 정의:
    PlayerModel.hasOne(ProfileModel, {
      onDelete: "CASCADE",
      onUpdate: "CASCADE",
      foreignKey: "player_id",
    });
    ProfileModel.belongsTo(PlayerModel, {
      foreignKey: "player_id",
    });
  • Team 모델과 Player 모델 간 관계 정의:
    TeamModel.hasMany(PlayerModel, {
      foreignKey: "teamid",
      sourceKey: "team_id",
    });
    PlayerModel.belongsTo(TeamModel, {
      foreignKey: "teamid",
      targetKey: "team_id",
    });
  • Team 모델과 Game 모델 간 M:N 관계 정의:
    TeamModel.belongsToMany(GameModel, {
      through: TeamGameModel,
      foreignKey: "team_id",
    });
    GameModel.belongsToMany(TeamModel, {
      through: TeamGameModel,
      foreignKey: "game_id",
    });

실습결과

성공적으로 구현된 기능

  1. Player CRUD:

    • 전체 선수 조회
    • 특정 선수와 프로필 정보 조회 (JOIN 활용)
    • 새로운 선수 추가
    • 특정 선수의 팀 변경
    • 특정 선수 삭제
  2. Team 검색 및 정렬:

    • 이름순 정렬
    • 키워드 검색
  3. Team - Player JOIN:

    • 특정 팀의 선수 정보 조회
  4. Database 연결 성공:

    • Sequelize ORM을 통해 MySQL 데이터베이스와 성공적으로 통신.

폴더 구조와 코드의 역할

폴더 구조

15_MCV-sequelize
├── config/
│   ├── config.js
├── controller/
│   ├── Cmain.js
├── models
│   ├── Game.js
│   ├── Player.js
│   ├── Team.js
│   ├── TeamGame.js
│   ├── index.js
│   ├── profile.js
├── routes
│    ── index.js
├── node_modules/
│   ├── 다양한 파일
├── views/
│   ├── index.ejs
├── app.js
├── init.sql
├── package-lock.json
└── package.json

코드별 역할

config/config.js

  • 환경변수에서 데이터베이스 설정을 가져와 Sequelize에 전달.

controller/Cmain.js

  • 주요 역할: 요청 처리 및 데이터베이스와 상호작용.
    • 선수 CRUD.
    • 팀 검색, 정렬 및 선수 조회.
    • 복잡한 조건 검색 및 정렬 처리.

models/index.js

  • 주요 역할: Sequelize 초기화 및 모델 관계 설정.

models/*.js

  • 각 데이터베이스 테이블을 나타내는 모델 정의.
  • Game.js, Player.js, Team.js, TeamGame.js, profile.js 모델은 테이블 구조 및 데이터 타입을 명시.

routes/index.js

  • 요청 URL에 따라 컨트롤러와 라우트 매핑.

views/index.ejs

  • HTML 템플릿으로 사용자 인터페이스 제공.

app.js

  • Express 서버 설정 및 Sequelize와 연결.
  • 전체 애플리케이션의 진입점.

코드 내용

GitHub 링크 바로가기

app.js

const express = require("express");
const app = express();
const PORT = 8080;
const { sequelize } = require("./models");
// db={sequelize:~~~~, Sequelize: ~~~~}
// const {sequelize} =db;

// set middleware
app.set("view engine", "ejs");
app.use(express.urlencoded({ extended: false }));
app.use(express.json());

// router 설정
const indexRouter = require("./routes");
app.use("/", indexRouter);

sequelize
  .sync({ force: false })
  .then(() => {
    console.log("db connection success!");
    app.listen(PORT, () => {
      console.log(`http://localhost:${PORT}`);
    });
  })
  .catch((err) => {
    console.log("db connection Err!");
    console.log(err);
  });
profile
Name : 최윤석(YoonSuk Choi)

0개의 댓글