๊ฐœ๋ฐœ์ผ์ง€-17 [๐Ÿฅฏ๋–จ์ด ๋ฉ”๋‰ด ๋„๋ฉ”์ธ: ์กฐํšŒ, ๋“ฑ๋ก/์ˆ˜์ •]

๊น€์„ฑ์ธยท2023๋…„ 9์›” 13์ผ
0

๋–จ์ด ๋ฉ”๋‰ด ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ ์ •์˜ ํฌ์ŠคํŒ…


๋–จ์ด ๋ฉ”๋‰ด ์กฐํšŒ ๋ฐ ๋“ฑ๋ก/์ˆ˜์ • ๋ทฐ


1. [GET] /jat/todaymenu

๋“ฑ๋กํ•œ ๋–จ์ด ๋ฉ”๋‰ด ํ˜„ํ™ฉ ์กฐํšŒ

  • ๋–จ์ด ๋ฉ”๋‰ด๋ฅผ ์ตœ์ดˆ ๋“ฑ๋ก ํ•˜๊ธฐ ์ „์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค ์‹œ์ž‘ ์ „์— ๋“ฑ๋กํ–ˆ๋˜ ๋ฉ”๋‰ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ• ์ธ์œจ๊ณผ ์ˆ˜๋Ÿ‰์ด 0์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด์„œ ์กฐํšŒ์— ์‘๋‹ตํ•œ๋‹ค.
  • ๋–จ์ด ๋ฉ”๋‰ด ๋“ฑ๋ก ํ›„์—๋Š” DB์— ๋“ฑ๋ก๋œ ๋–จ์ด ๋ฉ”๋‰ด ํ…Œ์ด๋ธ”๊ณผ ๊ธฐ๋ณธ ๋ฉ”๋‰ด ํ…Œ์ด๋ธ”์„ Join ํ•˜์—ฌ, ๊ฒฐ๊ณผ๊ฐ’์ด NULL์ด ์•„๋‹Œ ๊ฒฝ์šฐ์— ํ• ์ธ์œจ๊ณผ ์ˆ˜๋Ÿ‰์„ ์ฑ„์›Œ์„œ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ˆ˜์ •๊ณผ ๋“ฑ๋ก์„ ์ฆ‰๊ฐ์ ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ ์‘๋‹ต์— todaymenuIdx๋ฅผ ์ฑ„์›Œ์„œ ๋ณด๋‚ด์ฃผ๊ณ , ๋“ฑ๋ก/์ˆ˜์ • ์‹œ์—๋Š” ์กฐํšŒ ์‘๋‹ต ๋ฐ”๋””์— ๋“ฑ๋ก/์ˆ˜์ • ์—ฌ๋ถ€๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์„œ๋ฒ„์— ์š”์ฒญํ•œ๋‹ค.
  • ์‘๋‹ต ๋ฐ”๋””
  • TodayMenuControlller.java
  • TodayMenuService.java
    1. JWT์—์„œ ์ถ”์ถœํ•œ ์‚ฌ์šฉ์ž ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํŒ๋งค์ž์˜ ๊ฐ€๊ฒŒ ID ์กฐํšŒ
    public GetMainPageMenu getTodayMenuList(int sellerIdx) throws BaseException{
        // 1) ์‚ฌ์šฉ์ž ๊ฐ€๊ฒŒ ์กฐํšŒ
        int storeIdx;
        try{
            storeIdx = storeDao.storeIdxBySellerIdx(sellerIdx);
        } catch (Exception e) {
            throw new BaseException(POST_STORES_NOT_REGISTERD); // 2030 : ์‚ฌ์šฉ์ž์˜ ๊ฐ€๊ฒŒ๊ฐ€ ๋“ฑ๋ก๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
        }
  1. ์กฐํšŒ๋œ ๊ฐ€๊ฒŒ Id๋กœ ๊ฐ€๊ฒŒ์— ๋“ฑ๋ก๋œ ๋–จ์ด๋ฉ”๋‰ด๋ฅผ ์กฐํšŒ

    List<GetMainPageItem> mainTodaymenuItems, sideTodaymenuItems;
    try{
        mainTodaymenuItems = todayMenuDao.getTodayMenuList(storeIdx, "M");
    }catch (Exception e) {
        throw new BaseException(POST_STORES_NOT_REGISTERD); // 2030 : ์‚ฌ์šฉ์ž์˜ ๊ฐ€๊ฒŒ๊ฐ€ ๋“ฑ๋ก๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    }
    
    try{
        sideTodaymenuItems = todayMenuDao.getTodayMenuList(storeIdx, "S");
    }catch (Exception e) {
        throw new BaseException(POST_STORES_NOT_REGISTERD); // 2030 : ์‚ฌ์šฉ์ž์˜ ๊ฐ€๊ฒŒ๊ฐ€ ๋“ฑ๋ก๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    }
    
    return new GetMainPageMenu(storeIdx, mainTodaymenuItems, sideTodaymenuItems);

    }

  • TodayMenuDao.java
    ๋–จ์ด ๋ฉ”๋‰ด๋ฅผ ์•„์ง ํ…Œ์ด๋ธ”์— ๋„ฃ์ง€ ์•Š์•˜๋‹ค๋ฉด, ์กฐ์ธ ์‹œ์— ๊ฒฐ๊ณผ ์นผ๋Ÿผ์— ๊ฒฐ๊ณผ๊ฐ€ NULL๋กœ ๋‚˜์˜ค๋„๋ก ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.
      public List<GetMainPageItem> getTodayMenuList(int storeIdx, String status) {
        String query = "SELECT\n" +
                "    M.menuIdx, M.menu_name, M.price as origin_price,\n" +
                "    IF(T.status = 'D' , null, T.todaymenuIdx) as todaymenuIdx,\n" +
                "    IF(T.status = 'D' , null, T.discount) as discount,\n" +
                "    IF(T.status = 'D' , null, T.price) as discount_price,\n" +
                "    IF(T.status = 'D' , null, T.remain) as remain,\n" +
                "    IF(T.status = 'D' , null, T.status) as status\n" +
                "FROM Menu M\n" +
                "LEFT JOIN TodayMenu T on M.menuIdx = T.menuIdx AND T.status != 'D'\n" +
                "WHERE M.storeIdx = ?\n" +
                "AND M.status = ?";

        Object[] params = new Object[]{
                storeIdx,
                status
        };

        return this.jdbcTemplate.query(query,
                (rs, rowNum) -> new GetMainPageItem(
                        rs.getInt("menuIdx"),
                        rs.getString("menu_name"),
                        rs.getInt("origin_price"),
                        rs.getInt("todaymenuIdx"),
                        rs.getInt("discount"),
                        rs.getInt("discount_price"),
                        rs.getInt("remain"),
                        rs.getString("status") == null ? "N" : rs.getString("status"),
                        rs.getString("status") == null ? -1 : 0
                ), params);
    }

ํ…Œ์ŠคํŠธ

  • API ํ…Œ์ŠคํŠธ๋กœ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ๋‚˜์˜ค๋Š” ๋ชจ์Šต

  • ํ™”๋ฉด๋ทฐ์—๋„ ๊ฐ’์ด ์ž˜ ์ ์šฉ๋˜์–ด ๋‚˜์˜ค๋Š” ๋ชจ์Šต


2. [POST] /jat/todaymenu

๋–จ์ด ๋ฉ”๋‰ด ๋“ฑ๋ก/์ˆ˜์ •

๋–จ์ด ๋ฉ”๋‰ด ์กฐํšŒ์‹œ์—๋Š” ๋“ฑ๋กํ•˜์ง€ ์•Š์€ ๋ฉ”๋‰ด, ๋“ฑ๋กํ•œ ๋ฉ”๋‰ด๋กœ ๋‚˜๋‰˜๊ฒŒ ๋˜๊ณ ,
๋–จ์ด ๋“ฑ๋ก/์ˆ˜์ • ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • ๋ฏธ๋“ฑ๋ก or ๋“ฑ๋กํ–ˆ๋Š”๋ฐ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (๊ฐ’ ๋ณ€๊ฒฝ X)
  • ๋–จ์ด ๋ฉ”๋‰ด๋ฅผ ์ƒˆ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ฒฝ์šฐ (๊ฐ’ ๋ณ€๊ฒฝ O)
  • ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š”๋ฐ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ (๊ฐ’ ๋ณ€๊ฒฝ O)

์ด๋ ‡๊ฒŒ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ •ํ•œ ์ด์œ ๋Š” ์กฐํšŒ๋ฅผ ํ•  ์‹œ์—, ๋“ฑ๋กํ•œ ๋ฉ”๋‰ด์˜ ๊ฒฝ์šฐ ์‘๋‹ต ๊ฐ’์œผ๋กœ ํ•ด๋‹น ๋–จ์ด ๋ฉ”๋‰ด์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‚ ์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น todaymenuIdx๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐ’์„ ์ฑ„์›Œ ๋„ฃ์–ด๋„ Insert ๋Œ€์‹  Update๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
*์ด์ „์— ๋“ฑ๋กํ•œ ๋–จ์ด๋ฉ”๋‰ด๋ฅผ ์—†์• ๊ณ  ์ˆ˜์ •๋œ ํ˜•ํƒœ๋กœ ์ƒˆ๋กœ Insert ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ํ•ด๋‹น ๋–จ์ด ๋ฉ”๋‰ด์˜ ์ •๋ณด๋ฅผ Update

(1) ๋กœ์ง ํ”Œ๋กœ์šฐ
1. ์กฐํšŒ์‹œ ์‘๋‹ต์œผ๋กœ ๋ฐ›์€ Body๊ฐ’์— ๋“ฑ๋ก/์ˆ˜์ • ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ „์†กํ•œ๋‹ค
(GET๋ฉ”์„œ๋“œ์˜ ์‘๋‹ต ๋ฐ”๋””์™€POST ๋ฉ”์„œ๋“œ์˜ ์š”์ฒญ ๋ฐ”๋””๋Š” ๊ฐ™์€ ํ˜•ํƒœ์ด๋‹ค!)
2. ์‚ฌ์šฉ์ž์˜ ๊ฐ€๊ฒŒ Idx๋ฅผ ์กฐํšŒํ•˜๊ณ ,
3. ๋“ฑ๋กํ•  ๋–จ์ด๋ฉ”๋‰ด๋Š” ํŒ๋งค์ž์˜ ๊ฐ€๊ฒŒ์— ๋–จ์ด ๋ฉ”๋‰ด๋ฅผ ์—ฐ๊ด€ ์ง€์–ด ๋“ฑ๋กํ•œ๋‹ค.
4. ์ˆ˜์ •ํ•  ๋–จ์ด๋ฉ”๋‰ด๋Š” ์š”์ฒญ์œผ๋กœ ๋“ค์–ด์˜จ ๋–จ์ด๋ฉ”๋‰ด Idx๋ฅผ ํ†ตํ•ด ์ˆ˜์ • ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๊ณ 
5. ๋“ฑ๋ก/์ˆ˜์ •์„ ํ•œ ๋–จ์ด๋ฉ”๋‰ด ๊ฐœ์ˆ˜๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ฐ˜ํ™˜ํ•จ.

  • ์š”์ฒญ ๋ฐ”๋”” : [GET] /jat/todaymenu ์™€ ๋™์ผ
  • ์‘๋‹ต ๋ฐ”๋”” :
  • TodayMenuController.java
  • TodayMenuService.java
    1. ๋“ฑ๋ก์„ ํ•˜๊ธฐ์œ„ํ•œ ์‚ฌ์šฉ์ž ๊ฐ€๊ฒŒ Idx๋ฅผ ์กฐํšŒ
      @Transactional(rollbackFor = BaseException.class)
    public PostMainPageTMenuRes registerTodayMenu(int sellerIdx, PostMainPageTMenu postTodayMenuReq) throws BaseException {
        // 1) ์‚ฌ์šฉ์ž ๊ฐ€๊ฒŒ ์กฐํšŒ
        int storeIdx;
        try{
            storeIdx = storeDao.storeIdxBySellerIdx(sellerIdx);
        } catch (Exception e) {
            throw new BaseException(POST_STORES_NOT_REGISTERD); // 2030 : ์‚ฌ์šฉ์ž์˜ ๊ฐ€๊ฒŒ๊ฐ€ ๋“ฑ๋ก๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
        }
  1. ๋ฉ”์ธ ๋ฉ”๋‰ด ์ค‘ ๋“ฑ๋ก/์ˆ˜์ •ํ•  ๋–จ์ด ๋ฉ”๋‰ด๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ , ๋“ฑ๋ก/์ˆ˜์ •
        // -1 : ๋ฏธ๋“ฑ๋ก ์ƒํƒœ ๋ฉ”๋‰ด
        //  0 : ๋“ฑ๋ก ๋˜์–ด์žˆ์ง€๋งŒ ์ˆ˜์ • ์•ˆํ•˜๋Š” ๋–จ์ด๋ฉ”๋‰ด
        //  1 : ๋“ฑ๋ก๋˜์–ด ์žˆ๊ณ , ์ˆ˜์ •์„ ํ•˜๋Š” ๋–จ์ด๋ฉ”๋‰ด
        //  2 : ๋“ฑ๋ก ์•ˆ๋˜์–ด ์žˆ๋‹ค๊ฐ€ ์ƒˆ๋กœ ๋“ฑ๋กํ•˜๋Š” ๋–จ์ด๋ฉ”๋‰ด
        // 2-1) ๋ฉ”์ธ ๋ฉ”๋‰ด ๋–จ์ด๋ฉ”๋‰ด ์ˆ˜์ •/๋“ฑ๋ก ํ™•์ธ
        List<GetMainPageItem> newTodayMain = new ArrayList<>(), updateTodayMain = new ArrayList<>();
        int newTodayMainCnt = 0, updateTodayMainCnt = 0;
        if (postTodayMenuReq.getMainMenus() != null) {
            for (GetMainPageItem pageItem : postTodayMenuReq.getMainMenus()) {
                if (pageItem.getIsUpdated() == 2) { // 2: ์ƒˆ๋กœ ๋“ฑ๋กํ•˜๋Š” ์˜ค๋Š˜์˜ ๋–จ์ด ๋ฉ”๋‰ด ์ผ ๊ฒฝ์šฐ!
                    newTodayMain.add(pageItem);
                }
                else if(pageItem.getIsUpdated() == 1){ // 1: ๋“ฑ๋ก๋˜์–ด์žˆ๋Š” ๋ฉ”๋‰ด ์ค‘ ์ˆ˜์ •ํ•˜๋Š” ๋–จ์ด ๋ฉ”๋‰ด์ผ ๊ฒฝ์šฐ!
                    updateTodayMain.add(pageItem);
                }
            }
        }
        // 2-2) ๋ฉ”์ธ ๋–จ์ด๋ฉ”๋‰ด ๋“ฑ๋ก/์ˆ˜์ •
        try{
            newTodayMainCnt = todayMenuDao.registerTodayMenu(storeIdx, newTodayMain, "M");
            updateTodayMainCnt = todayMenuDao.updateTodayMenu(updateTodayMain);
        } catch (Exception e) {
            throw new BaseException(POST_TODAY_MAINMENU_SAVE_ERROR); // 2030 : ์‚ฌ์šฉ์ž์˜ ๊ฐ€๊ฒŒ๊ฐ€ ๋“ฑ๋ก๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
        }
  1. ์‚ฌ์ด๋“œ๋„ ๋˜‘๊ฐ™์€ ๊ณผ์ • ํ›„ ๋””๋น„์— ์ ์šฉ๋œ ํ–‰ ๊ฐœ์ˆ˜ ๋ฐ˜ํ™˜
        // 3-1) ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด ๋–จ์ด๋ฉ”๋‰ด ์ˆ˜์ •/๋“ฑ๋ก ํ™•์ธ
        List<GetMainPageItem> newTodaySide = new ArrayList<>(), updateTodaySide = new ArrayList<>();
        int newTodaySideCnt = 0, updateTodaySideCnt = 0;
        if (postTodayMenuReq.getSideMenus() != null) {
            for (GetMainPageItem pageItem : postTodayMenuReq.getSideMenus()) {
                if (pageItem.getIsUpdated() == 2) { // 2: ์ƒˆ๋กœ ๋“ฑ๋กํ•˜๋Š” ์˜ค๋Š˜์˜ ๋–จ์ด ๋ฉ”๋‰ด ์ผ ๊ฒฝ์šฐ!
                    newTodaySide.add(pageItem);
                }
                else if(pageItem.getIsUpdated() == 1){
                    updateTodaySide.add(pageItem);
                }
            }
        }
        // 3-2) ์‚ฌ์ด๋“œ ๋–จ์ด๋ฉ”๋‰ด ๋“ฑ๋ก/์ˆ˜์ •
        try{
            newTodaySideCnt = todayMenuDao.registerTodayMenu(storeIdx, newTodaySide, "S");
            updateTodaySideCnt = todayMenuDao.updateTodayMenu(updateTodaySide);
        } catch (Exception e) {
            throw new BaseException(POST_TODAY_MAINMENU_SAVE_ERROR); // 2030 : ์‚ฌ์šฉ์ž์˜ ๊ฐ€๊ฒŒ๊ฐ€ ๋“ฑ๋ก๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
        }

        return new PostMainPageTMenuRes(storeIdx, newTodayMainCnt, updateTodayMainCnt, newTodaySideCnt, updateTodaySideCnt);
    }
  • TodayMenuDao.java
  // ๋–จ์ด๋ฉ”๋‰ด ์ผ๊ด„ ๋“ฑ๋ก
    public int registerTodayMenu(int storeIdx, List<GetMainPageItem> todayMenuItems, String status) {
        String query = "INSERT INTO TodayMenu(date, storeIdx, menuIdx, price, discount, remain, status)\n" +
                "VALUE(NOW(),?,?,?,?,?,?)";

        this.jdbcTemplate.batchUpdate(query,
                todayMenuItems,
                todayMenuItems.size(),
                (PreparedStatement ps, GetMainPageItem todayMenuItem) ->{
                    ps.setInt(1, storeIdx);
                    ps.setInt(2, todayMenuItem.getMenuIdx());
                    ps.setInt(3, todayMenuItem.getDiscountPrice());
                    ps.setInt(4, todayMenuItem.getDiscountRatio());
                    ps.setInt(5, todayMenuItem.getRemain());
                    ps.setString(6, status);
                });

        return todayMenuItems.size();
    }
  // ๋–จ์ด ๋ฉ”๋‰ด ์ผ๊ด„ ์ˆ˜์ •
      public int updateTodayMenu(List<GetMainPageItem> todayMenuItems){
        String query = "UPDATE TodayMenu\n" +
                "    SET price = ?,\n" +
                "        discount = ?,\n" +
                "        remain = ?\n" +
                "WHERE todaymenuIdx = ?";

        return this.jdbcTemplate.batchUpdate(query,
                todayMenuItems,
                todayMenuItems.size(),
                (PreparedStatement ps, GetMainPageItem todayMenuItem) -> {
                    ps.setInt(1, todayMenuItem.getDiscountPrice());
                    ps.setInt(2, todayMenuItem.getDiscountRatio());
                    ps.setInt(3, todayMenuItem.getRemain());
                    ps.setInt(4, todayMenuItem.getTodaymenuIdx());
                }).length ;

    }

ํ…Œ์ŠคํŠธ

1. ๋“ฑ๋ก ์ „

2. ๋“ฑ๋กํ•  ๊ฐ’ ์ž…๋ ฅ

ํ™”๋ฉด์—์„œ ํ• ์ธ์œจ์ด ๊ฐ€๊ฒฉ์— ๋ฐ”๋กœ ์ ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์€ ํ”„๋ก ํŠธ์—์„œ ๊ณ„์‚ฐ์‹์„ ๋„ฃ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์†Œ๊ธˆ๋ฒ„ํ„ฐ๋กค : ํ• ์ธ์œจ 20%, ํ• ์ธ๊ฐ€๊ฒฉ 2000 -> 1600, ์ˆ˜๋Ÿ‰ 5๊ฐœ
  • ๋ง›์‚ด ์ƒŒ๋“œ์œ„์น˜ ๋นต : ํ• ์ธ์œจ 30%, ํ• ์ธ๊ฐ€๊ฒฉ 4500 -> 3100, ์ˆ˜๋Ÿ‰ 6๊ฐœ

3. ๋–จ์ด ๋“ฑ๋กํ•˜๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ

  • DB์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฐ’์ด ์˜ฌ๋ผ๊ฐ€๊ณ ,
  • API ์‘๋‹ต ๊ฒฐ๊ณผ๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ๋œ ๋ชจ์Šต

4. ์ˆ˜์ • ๋ฐ ์ถ”๊ฐ€๋“ฑ๋ก

์ƒŒ๋“œ์œ„์น˜์˜ ์ˆ˜๋Ÿ‰์„ 3๊ฐœ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ๊ฟ€ ํ† ์ŠคํŠธ ์‹๋นต์„ ๋–จ์ด๋ฉ”๋‰ด ๋“ฑ๋ก์„ ํ•ด๋ณด๊ฒ ๋‹ค.

5. ์ˆ˜์ • ํ™•์ธ

  • ๋“ฑ๋ก ๋ฒ„ํŠผ ๋‹ค์‹œ ํด๋ฆญ
  • ์ˆ˜์ •๊ณผ ์ถ”๊ฐ€๋“ฑ๋ก์ด ์ž˜ ๋ฐ˜์˜๋˜์–ด DB์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ๋ชจ์Šต.

ํ•ด๋‹น ๋–จ์ด๋ฉ”๋‰ด๋“ค์€ ๊ตฌ๋งค์ž๊ฐ€ ๊ฐ€๊ฒŒ๋ฅผ ์กฐํšŒํ–ˆ์„ ๋•Œ ํ‘œ์‹œํ•  ๋ฉ”๋‰ด๋“ค์ด๋‹ค!

profile
๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฟˆ์ธ 25์‚ด ๋Œ€ํ•™์ƒ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€