Raw Query
Raw Query란?
Raw 쿼리는 데이터베이스와 직접 상호작용하기 위해 데이터베이스 질의 언어(주로 SQL)를 사용하여 작성된 쿼리를 의미합니다. 즉, ORM(Object-Relational Mapping)이나 쿼리 빌더와 같은 추상화 계층을 거치지 않고, 개발자가 SQL 문법을 그대로 사용하여 데이터베이스에 명령을 내리는 방식입니다. 말 그대로 날것의 질문 방식입니다.
Node.js에서 Raw Query를 실행하려면 MySQL과 연결할 수 있는 데이터베이스 드라이버가 필요합니다. 대표적으로 mysql2 라이브러리를 사용하면 됩니다.
mysql2란?
mysql2는 Node.js 환경에서 MySQL 데이터베이스와 연결하고 쿼리를 실행할 수 있게 해주는 데이터베이스 드라이버 라이브러리입니다. 쉽게 말해, Node.js 코드와 MySQL 서버 사이에서 통신을 도와주는 중간 다리 역할을 합니다.
사용법
AWS RDS(MySQL)를 사용하려면 먼저 mysql2 라이브러리를 설치한 뒤, 아래와 같이 RDS에서 제공하는 엔드포인트(주소), 계정명, 비밀번호, 데이터베이스 이름을 지정하여 연결 객체를 생성합니다.
import mysql from 'mysql2';
const connect = mysql.createConnection({
host: //AWS RDS 엔드포인트
user: // AWS RDS 계정 명
password: //AWS RDS 비밀번호
database: //연결할 MySQL DB 이름
})
위와 같은 방식은 MySQL 계열 데이터베이스(MySQL, MariaDB 등)에서 동일하게 적용할 수 있습니다.
그리고 연결 객체를 다음과 같이 사용하면 됩니다.
connect.promise().query(SQL문);
//예시
await connect.promise().query(`
CREATE TABLE ${tableName}
(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
createdAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
)`);
ORM과 Prisma
ORM이란?
ORM은 객체 지향 프로그래밍 언어에서 데이터베이스를 객체처럼 다룰 수 있게 해주는 기술입니다.
즉, SQL 쿼리를 직접 작성하지 않고도, 코드에서 데이터베이스 레코드를 클래스나 객체처럼 다루도록 추상화해 줍니다.
✅ 하는 일
- 테이블 → 클래스
- 행(Row) → 객체
- 컬럼(Column) → 클래스의 속성(Property)
✅ 장점
- SQL을 직접 작성할 필요가 줄어듦 (생산성 향상)
- 코드에서 데이터베이스 접근을 일관성 있게 관리
- 데이터베이스 종속성이 줄어듦
✅ 단점
- 복잡한 쿼리나 성능 튜닝은 ORM이 자동 생성한 쿼리로는 한계가 있음
- ORM이 추상화를 제공하기 때문에 내부 동작을 잘 모르면 디버깅이 어려울 수 있음
Prisma란?
Prisma는 Node.js와 TypeScript 환경에서 널리 쓰이는 차세대 ORM입니다.
기존 ORM들(TypeORM, Sequelize 등)에 비해 타입 안정성(Type Safety) 과 개발자 경험(DX) 을 강조한 것이 특징입니다.
✅ 특징
- Prisma Schema라는 전용 스키마 파일로 데이터 모델 정의
- prisma generate 명령으로 타입이 보장되는 Prisma Client를 자동 생성
- TypeScript에서 모델에 접근할 때, 속성과 타입을 자동 완성으로 바로 확인 가능
- MySQL, PostgreSQL, SQLite, MongoDB 등 여러 데이터베이스 지원
✅ 사용 흐름
- schema.prisma 파일에 데이터 모델 정의
- npx prisma migrate dev로 마이그레이션 (DB 스키마 업데이트)
- npx prisma generate로 Prisma Client 생성
- 코드에서 Prisma Client를 불러와 쿼리 실행
쿠키와 세션
쿠키란?
쿠키는 사용자가 naver.com과 같은 웹 사이트를 방문할 때마다 이전에 방문했던 정보를 기억하는 데이터 파일입니다.
세션이란?
쿠키를 기반으로 구성된 기술입니다. 단, 클라이언트가 마음대로 데이터를 확인 할 수 있던 쿠키와는 다르게 세션은 데이터를 서버에만 저장합니다.
쿠키 만들기
app.get("/set-cookie", (req, res) => {
let expire = new Date();
expire.setMinutes(expire.getMinutes() + 60); // 만료 시간을 60분으로 설정합니다.
res.writeHead(200, {
'Set-Cookie': `name=sparta; Expires=${expire.toGMTString()}; HttpOnly; Path=/`,
});
return res.end();
});
Set-Cookie는 HTTP 프로토콜에서 이미 정해져 있는(예약된) 헤더 키워드입니다.
개발자가 임의로 만든 게 아니라, HTTP 응답 헤더 중 하나로 브라우저에게 쿠키를 만들어 저장하라고 지시하는 역할을 합니다.
만들어진 쿠키 조회하기
app.get('/get-cookie', (req, res) => {
const cookie = req.headers.cookie;
console.log(cookie); // name=sparta
return res.status(200).json({ cookie });
});
req.headers.cookie를 이용하면 클라이언트의 모든 쿠키를 조회 할 수 있습니다.
그런데 위와 같이 적으면 귀찮으니 cookie-parser 미들웨어를 이용하면 간편한게 쿠키를 관리 할 수 있습니다.
JWT(Json Web Token)
JWT란?
JWT(Json Web Token)은 웹 표준으로써, 서버와 클라이언트 사이에서 정보를 안전하게 전송하기 위해 도움을 주는 웹 토큰(Web Token)입니다
JWT(Json Web Token)는 크게 세 부분, 헤더(Header), 페이로드(Payload), 서명(Signature)로 구성되어 있습니다. 각각의 부분은 점(.)으로 분리됩니다. https://jwt.io/ 에서 구조를 간단히 확인 할 수 있습니다.
- Header(머리): 헤더는 토큰의 타입과 어떤 암호화를 사용하여 생성된 데이터인지 정의되어 있습니다.
- Payload(가슴): 페이로드는 실제 전달하려는 데이터를 담고 있습니다. 대표적으로 개발자가 원하는 데이터를 저장합니다.
- Signature(배): 서명은 헤더와 페이로드, 그리고 비밀 키(Secret Key)를 이용하여 생성됩니다. 이 서명은 토큰이 변조되지 않은 정상적인 토큰인지 확인할 수 있게 도와줍니다
JWT의 특성 정리
- JWT는 비밀 키를 모르더라도 복호화가 가능합니다. 변조만 불가능 할 뿐, 누구나 복호화하여 보는 것은 가능합니다.
- 민감한 정보는 담지 않도록 해야합니다.
- 자바스크립트 같이 특정 언어에서만 사용 가능한 것은 아닙니다.
JWT 사용하는 이유
- JWT가 인증 서버에서 발급되었는지 위변조 여부를 확인할 수 있습니다.
- 누구든지 JWT 내부에 들어있는 정보를 확인할 수 있습니다. (복호화)
'이노베이션캠프 > TIL' 카테고리의 다른 글
Node.js 숙련 2주차 강의 정리 - Access, Refresh Token (0) | 2025.07.24 |
---|---|
Node.js 숙련 2주차 강의 정리 - 인증과 인가 구현하기 (0) | 2025.07.23 |
Prisma Client 생성 안되는 오류 (0) | 2025.07.21 |
이노베이션 캠프 10일차_AWS에 Node.js 서버 배포 (0) | 2025.07.17 |
이노베이션 캠프 9일차_스킬을 구현해보자 (0) | 2025.07.16 |