Node.js 교과서 : 7. MySQL

전지연·2025년 11월 7일

GDGoC_2025

목록 보기
8/16
post-thumbnail

MySQL 설치하기

데이터를 변수에 저장하면 서버 종료 후 소멸
-> 데이터베이스 사용

저장 장소
보안 제약이 없는 것 -> 클라이언트
보안 체크 필요한 것 -> 서버(파일, DBMS 등)

  • MySQL : 관계형 데이터베이스
  • 몽고디비 : NoSQL

MySQL 설치(윈도우)

MySQL 사이트에 가서 설치한다.
주의할점 : MySQL은 경로에 한글 들어가면 에러 -> 미리 영어로 변경

MySQL 접속

MySQL 설치된 폴더는 미리 환경변수로 설정

  1. cmd에서 명령어를 실행한다.
mysql -h localhost -u root -p

이 명령어에서 사용자 이름은 디폴드값이 localhost이므로 -h localhost는 생략해도 됨

  1. 비밀번호를 입력해준다.
mysql -h localhost -u root -p
Enter password : [비밀번호 입력]
mysql>
  1. 콘솔로 돌아가려면 exit을 사용한다.
mysql> exit

커넥션 생성

  1. MySQL 들어가서 +를 클릭한다.
  1. 커넥션 이름을 작성하고, Store in Vault를 누르고 비밀번호를 설정해준다.

테이블 만들기

명령어를 아래처럼 입력

컬럼의 자료형

컬럼의 옵션

컬럼의 옆에 작성한다.

컬럼의 옵션들

사용자의 댓글을 저장하는 테이블

  • PRIMARY KEY : 겹칠 가능성 없는 id를 주로 지정
  • index : 자주 검색할 만한 것 -> 검색 성능 빨라짐
    commenter ASC : commenter 컬럼을 오름차순으로 인덱싱
  • CONSTRAINT, FOREIGN KEY, REFERENCES : 다른 테이블간의 관계 생성
    REFERENCES : user의 id를 참조, 없는 user의 id를 가져오지 않기 위함

user 테이블 생성

  • UNIQUE INDEX : 고유값 생성
    (unique를 붙이기 위해 모든 값을 검색해봐야 함 -> index로 지정)

테이블 확인/삭제

  • 생성 확인
mysql> DESC users;
  • 삭제
mysql> DROP TABLE users;
  • 테이블 목록 확인
mysql> show tables;

테이블 생성은 콘솔이 아닌 workbench로도 가능


CRUD 작업하기

CRUD : Create, Read, Update, Delete

Create

=> INSERT 사용

READ

=> SELECT 사용

  • SELECT * FROM [테이블] : 모든 컬럼 조회
  • SELECT { 특정 칼럼 } ~~ : 특정 칼럼만 조회

=> WHERE 절 사용 : 특정 조건을 가진 데이터만 조회

  1. AND 사용
  2. OR 사용

=> ORDER BY [컬럼명][ASC|DESC] : 오름차순/내림차순으로 정렬

  1. LIMIT [숫자] : 조회할 로우 개수

  2. OFFSET [숫자] : 건너뛸 로우 개수 설정
    (21~40 조회 -> 1~20을 OFFSET으로 설정)


UPDATE

=> UPDATE, SET 사용

WHERE 필수
-> WHERE 안붙이면 모든 값에 적용 !


DELETE


시퀄라이즈 사용하기

시퀄라이즈(Sequelize) : 자바스크립트 구문을 자동으로 SQL로 바꿔줌

시퀄라이즈 설치

필요한 패키지 : sequelize, sequelize-cli, mysql2

$ npm i express morgan nunjucks sequelize sequelize-cli mysql2
$ npm i -D nodemon

실행

$ npx sequelize init
  • init을 실행하면 config, models, migrations, seeders 폴더가 생성
  • models 폴더 안에 index.js가 생성됨

index.js

여기에서 sequelize를 여러 개 호출해 줄 수 있다(node에 DB 여러 개 연결 가능)

app.js

app.js를 생성하고 익스프레스와 시퀄라이즈 연결

sync 메서드를 사용하지 않으면 연결 x

config.json

password에 사용할 MySQL 비밀번호를 입력하고, database에 node.js를 작성한다.

시퀄라이즈 모델 만들기

User 모델 정의

1. User.init() : 컬럼 정의

  • 컬럼 이름과 그 안의 옵션 작성
  • sequelize에서는 id 자동생성 -> 생략
  • Sequelize.DATE = MySQL의 Datetime
    MySQL의 DATE = Sequelize.DateOnly
  1. sequelize : 모델에 대한 설정
  • timestamps : true일 경우 createdAt과 UpdatedAt이 자동으로 추가
  • underscored : 테이블명과 컬럼명의 기본 설정인 캐멀 케이스(createdAt)을 스네이크 케이스(created_at)으로 바꾸는 옵션
  • modelName, tableName : 모델 이름이 User라면 테이블 이름은 users로 바꾸는 형식
  • paranoid : true로 설정하면 deletedAt이 자동 추가(지운 시각 기록 soft Delete)

Comment 모델

Comment 모델에 commenter이 없음 -> 관계 따로 정의

index.js

  • initiate로 각 모델 연결
  • associate로 미리 실행

테이블 관계 이해하기

테이블 관계를 정의할 때 Sequelize에서는 hasMany, hasOne, belongsToMany 등의 메서드를 사용

1 : N

user는 comment 여러 개 작성 가능 -> 1:n관계

1:n은 hasMany 메서드 사용해서 표현

  • user.js

    - 1로 지정되는 user가 hasMany 사용
    - user의 id를 sourceKey로 지정 -> 다른 테이블에서 갖고감

  • comment.js

    - comment = user 의 부속 정보 => belongsTo 사용(comment가 누구 껀지 작성해야)
    - foreign 키로 User의 id 컬럼 지정 => commenter 컬럼으로 지정
    - commenter 컬럼은 Comment 모델에 작성됨

1 : 1

user의 정보를 담고있는 userInfo 테이블 -> 1 : 1 관계

1 : 1은 hasOne 메서드 사용해서 표현

hasOne과 belongsTo 자리 정하는법
=> foreign 키 위치에 따라

여기서는 userInfo에 userId라는 외래키 추가 -> userInfo에 belongsTo 사용
(이미 user모델에 id가 있으므로 키 추가가 필요없음

N : M

post와 해시태그 -> N : M 관계

N : M은 둘 다 belongsToMany를 사용한다.

N : M 관계 특성상 중간 테이블(새로운 모델) 생성됨

시퀄라이즈 쿼리 알아보기

생성

윗줄 : SQL
아래줄 : Sequelize

  • create : promise 반환
    => await/then 이 있어야 결과값을 받아올 수 있음
  • MySQL에서 0/1 -> Sequelize에서 true/false
    => married 작성 시 false 설정

조회(모든 데이터)

  • findAll()
  • attributes : 원하는 컬럼만 가져오는 옵션

데이터 하나만 필요할 때에는 findOne()을 사용

조회(where 사용)

  • Op : 연산자

    Op.gt(초과)
    Op.gte(이상)
    Op.lt(미만)
    Op.lte(이하)
    Op.ne(같지 않음)
    Op.or(또는)
    Op.in(배열 요소 중 하나)
    Op.notIn(배열 요소와 모두 다름)

정렬

  • order : 2차원 배열
    => 조건 여러개 설정(앞에 있을수록 우선순위 높음)

  • 로우 개수 설정은 limit사용(1개일 경우에는 fineOne도 사용 가능)

  • offset 역시 구현 가능

---

수정

=> UPDATE 사용
where에 조건 작성


삭제

destroy 사용


관계 쿼리 알아보기

MySQL에서의 JOIN -> include 사용

방법1

user를 가져오면서 comment까지 가져올수 있다.

방법2
다른 방법으로 메서드를 사용할 수 있다.

getComments()로 user의 comment를 조회한다.

1번 방법보다는 2번 방법이 더 좋음
=> 1번 방법은 사용자와 댓글을 동시 조회해서 에러 확률 up

대소문자 구별 주의
(Comment와 comment 다름)


AS 사용

Comment 이름을 Answer로 바꾸면 이름이 바뀐다.

  • getComments -> getAnswers
  • user.Comments -> user.Answers

include나 관계 쿼리 메서드에서 where나 attributes 옵션 사용

include와 where를 동시에 사용할 수 있음

  • where로 지정된 id는 Comment의 id
  • attributes는 id컬럼만 가져오는 옵션

다른 방법)

이것도 where에서의 id은 댓글의 id이다

생성 쿼리

  • user : 사용자 생성
  • comment : 주인 없는 comment 생성(괄호 안에 userid넣으면 user의 comment)
  • addComment : 사용자와 댓글 연결

여러 개 추가 시에는 배열로 추가

수정/삭제 메서드
: set + 모델명 / remove + 모델명

raw 쿼리

시퀄라이즈 없이 직접 쿼리 작성도 가능


시퀄라이즈 실습하기

데이터베이스 생성

데이터베이스를 만들어 놓던가

sequelize로도 데이터베이스 만들 수 있다.

npx sequelize db:create

테이블 생성

models 폴더 안에 user과 comment 모델 있음

index.js에서 sequelize를 sync해주면 테이블 생성됨

서버 요청

npm start로 서버 생성 후 localhost:3001에 접속하면 다음과 같은 창이 뜬다.

  1. User 등록

보이는 폼에 작성한 후 등록하면 DB에 저장된다.

routes/users.js 안에 작성한 폼을 등록하는 코드는 다음과 같다.

json 사용해서 user 정보 전송

문자열 전송 : send/binary
파일 전송 : sendFile
템플릿 엔진 렌더링 : render
API에서 json 전송 : json

  1. 댓글 등록/조회

routes/users.js 안에 comment를 불러오는 코드는 다음과 같다.

routes/comments.js안에 comment를 등록하는 코드는 다음과 같다.

user과 주인 없는 comment를 선언해준 뒤 둘을 연결해주는 방식으로 comment를 등록할 수도 있다.

수정(update), 삭제(delete)도 등록(post), 조회(get)와 같은 원리로 작동한다.

0개의 댓글