티스토리 뷰

어드민 페이지는 따로 만들지 않아서 모임들은 DB에 임의로 등록해놨다.
유저에 따라 모임 가입 상태나 관심 목록이 다르기 때문에 사용자별로 모임을 불러왔다.

 

* 회원가입 URI : /clubs

 

1. controllers/clubController.js

const express = require("express");
const checkAuth = require("../middlewares/checkAuth");
const router = express.Router()

const clubService = require("../services/clubService")

// 모임 불러오기
router.get("/", checkAuth, async (req, res) => {
    const userId = req.user.id
    
    const newClubs = await clubService.getNew();
    const allClubs = await clubService.getAll();
    const categories = await clubService.getCategories();
    const joinInfos = await clubService.getJoinInfos();
    const likedClubsById = await clubService.getLikedClubsById(userId);
    
    return res.json({ newClubs, allClubs, categories, joinInfos, likedClubsById });
})
  • 모임들을 단순 조회하는 API기 때문에 HTTP Method는 GET을 이용했다.
  • 구현해뒀던 checkAuth 미들웨어를 통해 request를 한 유저 id 값을 받아온다.
  • newClubs : 새로 추가된 모임(최근 4개)
    allClubs : 전체 모임
    categories : 카테고리
    joinInfos : 유저의 모임 가입 정보
    likedClubsById : 유저의 관심 모임 목록

 

2. services/clubsService.js

const db = require("../libs/db")

// * SQL문 변수에 담아 사용
const CLUBS_WITH_CATEGORIES =
    `SELECT cb.id AS clubs_id, cb.name AS clubs_name, location, capacity, img, views, description,
    cg.id AS categories_id, cg.name AS categories_name
    FROM clubs AS cb LEFT JOIN categories AS cg ON cb.category_id = cg.id`
const JOIN_INFO_WITH_USERS =
    `SELECT users.id, users.name, status FROM clubs_users
    LEFT JOIN users ON clubs_users.user_id = users.id`

const clubService = {
    getNew: async () => {
        const contentSize = 4;

        const conn = await db.getConnection();

        const [newClubs] = await conn.query(`${CLUBS_WITH_CATEGORIES} ORDER BY cb.id DESC LIMIT ${contentSize}`);

        conn.release();

        return newClubs;
    },
    getAll: async () => {
        const conn = await db.getConnection();

        const [clubs] = await conn.query(`${CLUBS_WITH_CATEGORIES}`);

        conn.release();

        return { clubs };
    },
    getCategories: async () => {
        const conn = await db.getConnection();

        const [categories] = await conn.query("SELECT * FROM categories");

        conn.release();

        return categories;
    },
    getJoinInfos: async () => {
        const conn = await db.getConnection();

        const [joinInfos] = await conn.query("SELECT * FROM clubs_users WHERE status = 'JOINED'");

        conn.release();

        return joinInfos;
    },
    getLikedClubsById : async (userId) => {
        const conn = await db.getConnection();

        const [likedClubsById] = await conn.query("SELECT club_id FROM likes WHERE user_id = ?", [userId])

        conn.release();

        return likedClubsById
    },
}

module.exports = clubService;

 

* SQL문 변수에 담아 사용

const CLUBS_WITH_CATEGORIES =
    `SELECT cb.id AS clubs_id, cb.name AS clubs_name, location, capacity, img, views, description,
    cg.id AS categories_id, cg.name AS categories_name
    FROM clubs AS cb LEFT JOIN categories AS cg ON cb.category_id = cg.id`
const JOIN_INFO_WITH_USERS =
    `SELECT users.id, users.name, status FROM clubs_users
    LEFT JOIN users ON clubs_users.user_id = users.id`
  • 여러 번 사용될 SQL문을 변수에 담았다.
    → 값이 이렇게 상수인 경우는 변수명을 모두 대문자로 사용한다고 한다.

 


 

개선할 점

  • 에러 핸들링
  • new, all, categories, joinInfo 등을 모두 나눠서 가져올 필요가 있을까?
    → 데이터는 한 번에 보내고 프론트에서 가공해서 사용할 수 있을까? 뭐가 더 효율적일까 고민..
 
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함