// dao/post.ts
import type { Connection } from 'mysql2/promise';
// 전체 post 조회
export const getPosts = async (connection: Connection) => {
// 데이터베이스에서 'post' 테이블의 모든 열을 조회합니다.
const [rows, fields] = await connection.query('SELECT * FROM post');
// 조회한 데이터를 반환합니다.
return rows;
}
// 특정 post 조회
export const getPost = async (idx: number, connection: Connection) => {
// 데이터베이스에서 'post' 테이블에서 특정 인덱스(idx)에 해당하는 열을 조회합니다.
const [rows, fields] = await connection.query(
`SELECT * FROM post WHERE idx=${idx}`
);
// 조회한 데이터를 콘솔에 로그로 출력합니다.
console.log('🚀 ~ file: post.ts:14 ~ getPost ~ rows:', rows);
// 조회한 데이터를 반환합니다.
return rows;
}
// services/getPosts.ts
import { getPosts } from '@/dao/post';
import type { Connection } from 'mysql2/promise';
import type { NextApiRequest, NextApiResponse } from 'next';
export const getPostsService = async (
req: NextApiRequest,
res: NextApiResponse<any>,
connection: Connection
) => {
// DAO의 getPosts 함수를 호출하여 모든 포스트를 가져옵니다.
const posts = await getPosts(connection);
// HTTP 응답으로 조회한 포스트 목록을 반환합니다.
res.status(200).json({
posts,
});
}
// controllers/getPosts.ts
import { getPostsService } from '@/services/getPosts';
import type { Connection } from 'mysql2/promise';
import type { NextApiRequest, NextApiResponse } from 'next';
export const getPostsController = async (
req: NextApiRequest,
res: NextApiResponse<any>,
connection: Connection
) => {
// 요청에 대한 검증
// (여기서는 간단한 주석으로 표시되어 있으나 실제로는 요청에 대한 검증이 이루어져야 함)
// 내 서비스의 유저가 맞는지 인증하기 같은 절차를 거침.
// (인증 로직은 여기서 구현되어야 할 사용자 확인 등을 의미함)
// 서비스 계층의 getPostsService 함수를 호출합니다.
await getPostsService(req, res, connection);
}
// pages/api/posts/index.ts
import { getPostsController } from '@/controllers/getPosts';
import { createConnection } from '@/utils/mysql';
import type { NextApiRequest, NextApiResponse } from 'next';
export default async function handler(
req: NextApiRequest,
res: NextApiResponse<any>
) {
// database connection 생성
// (MySQL 데이터베이스와 연결하는 connection 객체를 생성합니다.)
const connection = await createConnection();
// METHOD 분기
if (req.method === 'GET') {
// GET 메서드일 경우에만 컨트롤러를 호출합니다.
await getPostsController(req, res, connection);
} else {
// GET 메서드가 아닐 경우, 에러 응답을 반환합니다.
res.status(400).json({
error: {
message: '해당 메서드는 지원하지 않습니다.',
},
});
}
}
dao/post.ts 모듈
getPosts 함수: 데이터베이스 연결(connection)을 받아와서 'post' 테이블의 모든 데이터를 조회합니다.
조회된 데이터를 반환합니다.
getPost 함수: 특정 인덱스(idx)와 데이터베이스 연결(connection)을 받아와서 해당 인덱스에 해당하는 'post' 테이블의 데이터를 조회합니다.
조회된 데이터를 콘솔에 로그로 출력하고 반환합니다.
services/getPosts.ts 모듈
getPostsService 함수: Next.js의 API 요청(req 및 res)과 데이터베이스 연결(connection)을 받아옵니다.
dao/post.ts 모듈에서 가져온 getPosts 함수를 호출하여 모든 포스트를 가져옵니다.
가져온 포스트 목록을 HTTP 응답으로 반환합니다.
controllers/getPosts.ts 모듈
getPostsController 함수: Next.js의 API 요청(req 및 res)과 데이터베이스 연결(connection)을 받아옵니다.
주석으로 표시된 부분에서는 요청에 대한 검증과 사용자 인증을 수행하는 로직이 있어야 합니다. (실제 코드에는 주석에서 설명한 로직이 빠져 있습니다.)
services/getPosts.ts 모듈에서 가져온 getPostsService 함수를 호출하여 포스트를 가져옵니다.
pages/api/posts/index.ts 모듈
handler 함수: Next.js의 API 핸들러로서, API 요청(req 및 res)을 처리합니다.
createConnection 함수를 통해 데이터베이스 연결(connection)을 생성합니다.
요청의 HTTP 메서드를 확인하여 GET 메서드인 경우에만 getPostsController 함수를 호출합니다.
GET 메서드가 아닌 경우 400 Bad Request 응답을 반환합니다.
이렇게 코드의 흐름은 다음과 같습니다:
클라이언트가 API 엔드포인트에 GET 요청을 보냅니다.
pages/api/posts/index.ts 파일의 handler 함수가 요청을 받고, 데이터베이스 연결을 생성합니다.
GET 요청이면 getPostsController 함수를 호출하여 컨트롤러 로직을 실행합니다.
getPostsController에서는 요청의 검증 및 사용자 인증과 같은 전처리 작업을 수행한 후 getPostsService를 호출합니다.
getPostsService에서는 dao/post.ts 모듈에서 가져온 getPosts 함수를 호출하여 모든 포스트를 가져오고, HTTP 응답으로 반환합니다.
클라이언트는 받은 응답을 처리합니다.