POST 조회

PromptAction·2023년 11월 29일
0

백엔드

목록 보기
11/20
// 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 응답으로 반환합니다.
클라이언트는 받은 응답을 처리합니다.

0개의 댓글