개발노트/Node.js

[NodeJS] DB 접근 ( Side Project - 스터디 사라져서 중단... )

Dahoon06 2021. 12. 4. 15:11
728x90
반응형

이전 포스팅에서는 MySQL ConnectionPool을 만드는 부분까지 진행했습니다.

 

이번 글에서는 직접 DB에 접근하여 저장된 값을 가져오는 방식을 해보려고합니다.

 

저는 각각의 역할을 수행하도록 디렉토리 구조를 나눠서 사용하였습니다.

 

1. routes -> Controller의 역할을 수행

2. services -> service 로직을 수행

3. db -> 설정한 connectionPool 객체를 반환해주는 DB 설정 관련

 

이러한 구조로 구분하였습니다.

 

 

routes

 

프론트에서 요청을 할때 /api/~~를 통하여 백엔드에 요청을 하게 됩니다.

 

따라서 /api 라는 요청이 들어오면 app.ts에서 api.ts로 접근을 하도록 하였습니다.

 

app.ts

import api from "../routes/api";

app.use('/api',api);

 

api.ts

import {NextFunction, Request, Response, Router} from 'express';
import userController from './USER/index'
import postController from './POST/index'
const router = Router();

router.get('/', async (req: Request, res: Response, next: NextFunction) => {
    return res.json({});
});

router.use('/users',userController);
router.use('/posts',postController);

export default router;

 

/api/users 의 요청에따라 userConroller인 USER 디렉토리의 index.ts를 사용하게 됩니다.

 

USER/index.ts

import { NextFunction, Request, Response, Router } from 'express';
import {userService} from "../../services/USER";

/** @swagger ...*/
const router = Router();
const uc = new userService();

/** @swagger ...*/
router.get('/', async (req: Request, res: Response, next: NextFunction) => {
    try {
        console.log('GET 요청');
        const result = await uc.getUser();

        console.log(result);
    } catch (e) {
        return res.json({
            result: false,
            error: e.message
        });
    }
});


export default router;

 

controller 역할에 맡게 라우트파일에서는 요청에따른 통제만 하게 됩니다.

 

실질적인 DB 접근은 services 디렉토리 파일에서 이루어지게 됩니다.

 

해당 코드에서의 uc객체 안의 getUser() 라는 함수를 생성하여 호출함으로써 DB에서 조회한 값을 반환 받도록 하였습니다.

 

 

services

 

USER/index.ts

import { DB } from '../../db/db.connect';
import { IUser } from "../../interfaces/USER/IUser";
import * as crypto from 'crypto';
import { ILoginInfo } from "../../interfaces/USER/ILoginInfo";

export class userService {
    constructor() {
    }

    async getUser() {
        try {
            const sql = `
                SELECT
                    TB_MEMBER.MEMBER_NAME, TB_MEMBER.MEMBER_EMAIL, TB_MEMBER.MEMBER_PHONE
                    TB_MEMBER_PROFILE.MEMBER_NICKNAME, TB_MEMBER_PROFILE.PROFILE_DESC, TB_MEMBER_PROFILE.PROFILE_PIC_ORG
                FROM
                    TB_MEMBER JOIN TB_MEMBER_PROFILE
                ON    
                    TB_MEMBER.MEMBER_ID = TB_MEMBER_PROFILE.MEMBER_ID       
            `;
            const client = await DB.MysqlConn.getInstance.connect();
            const exists = await client.query(sql);

            console.log(exists);
            return exists;
        } catch (e) {

        }
    }
    
} // CLASS END

USER/index.ts에서 서비스 로직을 수행하게 됩니다.

 

DB에 접근하여 값을 가져와서 다시 controller에 반환해줌으로써 각 디렉토리마다의 역할을 나눠줄 수 있습니다.

 

 

 


728x90
반응형