X project에 MySQL 연동

현서·2025년 5월 7일

백엔드

목록 보기
12/18
post-thumbnail

MySQL에서 database.sql을 작성했다.

🗄️database.sql

use nodejs;

create table userss (
	idx int auto_increment primary key,
    userid varchar(50) unique not null,
    password varchar(200) not null,
    name varchar(20) not null,
    email varchar(50) not null,
    url varchar(200)
);

create table postss (
	idx int auto_increment primary key,
    useridx int not null,
    createAt datetime default now(),
    text varchar(2000) not null,
    foreign key(useridx) references userss(idx)
);

select * from userss;
select * from postss;

select * from userss where userid='apple';
insert into userss (userid, password, name, email, url) values ('apple', '1111', '김사과', 'apple@apple.com', 'https://randomuser.me/api/portraits/women/32.jpg');
select * from userss where idx=2;

insert into postss (useridx, text) values (2, "안녕하세요!");

select u.userid, u.name, u.url, p.idx, p.useridx, p.text, p.createAt from userss as u join postss p on u.idx = p.useridx;

update postss set text='바뀐 글!!!' where idx=2;

이후 코드들은 git main branch가 아닌 mysql-db라는 branch를 하나 새로 만들어서 거기에 작성했다.

그리고 npm install mysql2도 했던 듯.

✨ db/database.mjs

import mysql from "mysql2";
import { config } from "../config.mjs";

const pool = mysql.createPool({
  host: config.db.host,
  user: config.db.user,
  password: config.db.password,
  database: config.db.database,
});

export const db = pool.promise();

✨ app.mjs

import { db } from "./db/database.mjs";

이 코드를 추가했다.

db.getConnection().then((connection) => console.log(connection));

이 코드를 통해 DB와 잘 connection 되었는지 확인할 수 있었다.
(연결 확인용이어서 주석 처리했음.)

✨ config.mjs

host: {
    port: parseInt(required("HOST_PORT", 9091)),
  },
  db: {
    host: required("DB_HOST"),
    user: required("DB_USER"),
    password: required("DB_PASSWORD"),
    database: required("DB_DATABASE"),
    port: required("DB_PORT"),
  },

이렇게 host를 수정하고, db 부분을 추가했다.
원래 9090이었는데, 이미 과제에 9090을 사용하고 있어서 9091로 변경했다.

✨ data/auth.mjs

import { db } from "../db/database.mjs";

// 회원가입 사용자 추가 userid, password, name, email, url
export async function createUser(user) {
  const { userid, password, name, email, url } = user;
  return db
    .execute(
      "insert into userss (userid, password, name, email, url) values (?, ?, ?, ?, ?)",
      [userid, password, name, email, url]
    )
    .then((result) => result[0].insertId);
}

// 로그인
export async function login(userid, password) {
  const [rows] = await db.execute(
    "SELECT * FROM userss WHERE userid = ? AND password = ?",
    [userid, password]
  );
  return rows[0];
}

export async function findByUserid(userid) {
  return db
    .execute("select * from userss where userid=?", [userid])
    .then((result) => result[0][0]);
}

export async function findByid(idx) {
  return db
    .execute("select * from userss where idx=?", [idx])
    .then((result) => result[0][0]);
}

✨ controller/auth.mjs

async function createJwtToken(idx) {
  return jwt.sign({ idx }, secretKey, { expiresIn: jwtExpiresInDays });
}

id였는데 idx로 수정

const { userid, password, name, email, url } = req.body;

회원가입에 url 추가

const users = await authRepository.createUser({
    userid,
    password: hashed,
    name,
    email,
    url,
  });
  const token = await createJwtToken(users.idx);

✨ data/post.mjs

import { db } from "../db/database.mjs";

const SELECT_JOIN =
  "select u.userid, u.name, u.url, p.idx, p.useridx, p.text, p.createAt from userss as u join postss p on u.idx = p.useridx";
const ORDER_DESC = "order by p.createAt desc";

// 모든 포스트를 리턴
export async function getAll() {
  return db.execute(`${SELECT_JOIN} ${ORDER_DESC}`).then((result) => result[0]);
}

// 사용자 아이디(userid)에 대한 포스트를 리턴
// 조건을 만족하는 모든 요소를 배열로 리턴
export async function getAllByUserid(userid) {
  return db
    .execute(`${SELECT_JOIN} where u.userid=? ${ORDER_DESC}`, [userid])
    .then((result) => result[0]);
}

// 글 번호(id)에 대한 포스트를 리턴
// 조건을 만족하는 첫 번째 요소 하나를 리턴
export async function getById(idx) {
  return db
    .execute(`${SELECT_JOIN} where p.idx=?`, [idx])
    .then((result) => result[0][0]);
}

// 포스트 작성
export async function create(text, useridx) {
  return db
    .execute("insert into postss (useridx, text) values (?, ?)", [
      useridx,
      text,
    ])
    .then((result) => getById(result[0].insertId));
}

// 포스트 변경
export async function update(idx, text) {
  return db
    .execute("update postss set text=? where idx=?", [text, idx])
    .then(() => getById(idx));
}

// 포스트 삭제
export async function remove(idx) {
  return db.execute("delete from postss where idx=?", [idx]);
}

✨ controller/post.mjs

❇️ Postman 결과 확인

  • 회원가입 결과

  • MySQL userss 테이블 확인

  • 이미 있는 userid의 경우, 결과

  • 로그인 결과

  • '포스트 가져오기' 결과

  • '글번호로 포스트 가져오기' 결과

  • '포스트 쓰기' 결과

  • '포스트 수정' 결과

  • '포스트 삭제' 결과

  • MySQL postss 테이블 확인

??? 알려주세요! 지피티 선생님👩‍💻

📦 .execute() 기본 반환 구조

const result = await db.execute('SOME SQL');
result = [rows, fields]
인덱스내용설명
0rows실제 쿼리 결과 (데이터 또는 상태)
1fields컬럼 정보 (보통 안 씀)

✅ 1. (result) => result[0].insertId

  • 사용 위치: INSERT 쿼리
  • 반환값: 새로 삽입된 행의 id (예: AUTO_INCREMENT 값)
const result = await db.execute('INSERT INTO users (name) VALUES (?)', ['홍길동']);
const id = result[0].insertId; // 예: 5

✅ 2. (result) => result[0][0]

  • 사용 위치: SELECT 쿼리
  • 반환값: 첫 번째 행 (row) 객체
const result = await db.execute('SELECT * FROM users WHERE id = ?', [1]);
const row = result[0][0]; // 예: { id: 1, name: '홍길동' }
코드사용 용도설명
(result) => result[0].insertIdINSERT 쿼리새로 삽입된 행의 ID 가져오기
(result) => result[0][0]SELECT 쿼리SELECT 결과의 첫 번째 행 가져오기
profile
The light shines in the darkness.

0개의 댓글