MySQL에서 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도 했던 듯.
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();
import { db } from "./db/database.mjs";
이 코드를 추가했다.
db.getConnection().then((connection) => console.log(connection));
이 코드를 통해 DB와 잘 connection 되었는지 확인할 수 있었다.
(연결 확인용이어서 주석 처리했음.)
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로 변경했다.
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]);
}
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);
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]);
}


❇️ Postman 결과 확인
회원가입 결과

MySQL userss 테이블 확인

이미 있는 userid의 경우, 결과

로그인 결과

'포스트 가져오기' 결과

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

'포스트 쓰기' 결과

'포스트 수정' 결과

'포스트 삭제' 결과

MySQL postss 테이블 확인

📦 .execute() 기본 반환 구조
const result = await db.execute('SOME SQL');
result = [rows, fields]
| 인덱스 | 내용 | 설명 |
|---|---|---|
0 | rows | 실제 쿼리 결과 (데이터 또는 상태) |
1 | fields | 컬럼 정보 (보통 안 씀) |
✅ 1. (result) => result[0].insertId
const result = await db.execute('INSERT INTO users (name) VALUES (?)', ['홍길동']);
const id = result[0].insertId; // 예: 5
✅ 2. (result) => result[0][0]
const result = await db.execute('SELECT * FROM users WHERE id = ?', [1]);
const row = result[0][0]; // 예: { id: 1, name: '홍길동' }
| 코드 | 사용 용도 | 설명 |
|---|---|---|
(result) => result[0].insertId | INSERT 쿼리 | 새로 삽입된 행의 ID 가져오기 |
(result) => result[0][0] | SELECT 쿼리 | SELECT 결과의 첫 번째 행 가져오기 |