๊ฐœ๋ฐœ์ผ์ง€-32 [๐Ÿ›’์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋„๋ฉ”์ธ: ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ & ํ™•์ธ]

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

์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ธฐ๋Šฅ ๊ด€๋ จ ํฌ์ŠคํŒ…


1. [POST] /jat/app/basket/same-store

๋‚ด๊ฐ€ ๋‹ด์œผ๋ ค๋Š” ๋ฉ”๋‰ด๊ฐ€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์žˆ๋Š” ๋ฉ”๋‰ด์™€ ๊ฐ™์€ ๊ฐ€๊ฒŒ์ธ์ง€?

  • ๋ฐฐ๋‹ฌ์˜ ๋ฏผ์กฑ์„ ๋ณด๋ฉด ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ™์€ ๊ฐ€๊ฒŒ์˜ ๋ฉ”๋‰ด๋งŒ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋œฌ๋‹ค.
  • ๊ทธ๋ž˜์„œ ๋˜‘๊ฐ™์ด ๋ฉ”๋‰ด๋ฅผ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์„ ๋•Œ, ํ˜„์žฌ ๊ตฌ๋งค์ž์˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ™์€ ๊ฐ€๊ฒŒ์˜ ๋ฉ”๋‰ด๋งŒ ๋‹ด์„ ์ˆ˜ ์žˆ๋„๋ก ํ™•์ธ์„ ํ•˜๊ธฐ๋กœ ํ•จ.
  • ์š”์ฒญ๋ฐ”๋””
    : storeIdx (๊ฐ€๊ฒŒ Idx) -> ๋–จ์ด ๋ฉ”๋‰ด์— ํ• ๋‹น๋œ ๊ฐ€๊ฒŒ์˜ Idx
  • ์ปจํŠธ๋กค๋Ÿฌ
  • ์„œ๋น„์Šค
    public BasketStoreCheckRes storeCheck(int customerIdx, BasketStoreCheckReq checkReq) throws BaseException {
        // 1) ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ฒจ์žˆ๋Š”์ง€ ๋จผ์ € ์กฐํšŒ
        // ๊ฐ™์€ ๊ฐ€๊ฒŒ๋งŒ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ.
        List<BasketExist> basketExist;
        try{
            basketExist = basketDao.checkBaketAlreadyExists(customerIdx);
        }
        catch (Exception e){
            throw new BaseException(DATABASE_ERROR); // ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์กฐํšŒ ์‹คํŒจ
        }

        // 2) ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ถ”๊ฐ€ ๋ฐฉ์‹ ์„ค์ •
        // 2-1) ํ˜„์žฌ ๋‹ด์•„๋†“์€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ์—†์„ ๋•Œ
        if (basketExist.size() == 0){
            // sameStoreCheck = 0 ์ด๋ฉด ๊ทธ๋ƒฅ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ ๊ฐ€๋Šฅ
            return new BasketStoreCheckRes(0, 0);
        }
        // 2-2) ํ˜„์žฌ ๋‹ด์•„๋†“์€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ์žˆ์„ ๋•Œ
        else{
            // 2-2-1) ๊ฐ™์€ ๊ฐ€๊ฒŒ ๋ฉ”๋‰ด๋ฅผ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์„๋•Œ
            if(basketExist.get(0).getStoreIdx() == checkReq.getStoreIdx()){
                // sameStoreCheck = 0 ์ด๋ฉด ๊ทธ๋ƒฅ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ ๊ฐ€๋Šฅ
                return new BasketStoreCheckRes(basketExist.get(0).getStoreIdx(), 0);
            }
            // 2-2-2) ๋‹ค๋ฅธ ๊ฐ€๊ฒŒ ๋ฉ”๋‰ด๋ฅผ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์„๋•Œ
            else {
                // sameStoreCheck = 1 ์ด๋ฉด ๊ฐ™์€ ๊ฐ€๊ฒŒ๋งŒ ๋‹ด๊ธฐ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์•Œ๋ฆผ
                return new BasketStoreCheckRes(basketExist.get(0).getStoreIdx(), 1);

            }
        }
    }
  1. ๊ตฌ๋งค์ž์˜ ํ˜„์žฌ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํƒœ๋ฅผ ์กฐํšŒ.
    (์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฌด์กฐ๊ฑด ๊ฐ™์€ ๊ฐ€๊ฒŒ์˜ ๋ฉ”๋‰ด๋งŒ ๋‹ด์„ ์ˆ˜ ์žˆ๋„๋ก ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋†”์„œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์•ˆ์— ์„œ๋กœ๋‹ค๋ฅธ๊ฐ€๊ฒŒ์˜ ๋ฉ”๋‰ด๊ฐ€ ์กด์žฌํ•˜๋Š”์ผ์€ X)
  2. ํ˜„์žฌ ๋‹ด์•„ ๋†“์€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ์—†์„ ๋•Œ๋Š” ์ถ”๊ฐ€ ๊ฐ€๋Šฅ์ƒํƒœ.
  3. ํ˜„์žฌ ๋‹ด์•„๋†“์€ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ์žˆ์„๋•Œ ๋‹ด๊ธด ๋ฉ”๋‰ด์™€ ๋‹ด์„ ๋ฉ”๋‰ด์˜ ๊ฐ€๊ฒŒ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋‹ด๊ธฐ ๋ถˆ๊ฐ€๋Šฅ.
  • Dao
// ํ˜„์žฌ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ๋ฉ”๋‰ด๋ฅผ ํ™•์ธ (status != 'A' : ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ฒผ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง„ ๋ฉ”๋‰ด๋“ค)
    public List<BasketExist> checkBaketAlreadyExists(int customerIdx) {
        String query = "SELECT * FROM Basket WHERE customerIdx = ? AND status = 'A'";

        return this.jdbcTemplate.query(query,
                (rs, rowNum) -> new BasketExist(
                        rs.getInt("basketIdx"),
                        rs.getInt("storeIdx"),
                        rs.getInt("todaymenuIdx"),
                        rs.getInt("cnt"),
                        rs.getString("status")
                ), customerIdx);
    }

ํ…Œ์ŠคํŠธ

ํ˜„์žฌ ์‚ฌ์šฉ์ž๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ๋‹ด์€๊ฒŒ ์—†์–ด์„œ ๋ชจ๋‘ 0์ด๋ผ๋Š” ์ƒํƒœ๊ฐ’์ด ๋ฐ˜ํ™˜


2. [POST] /jat/app/basket

๋–จ์ด ๋ฉ”๋‰ด ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ

  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด์œผ๋ ค๋Š” ๋ฉ”๋‰ด๊ฐ€
    • ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ๋น„์–ด์žˆ๊ฑฐ๋‚˜,
    • ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ๊ฐ™์€ ๊ฐ€๊ฒŒ์˜ ๋ฉ”๋‰ด๋กœ ์ฐจ์žˆ๊ฑฐ๋‚˜,
    • ์žฅ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ๋‹ค๋ฅธ ๊ฐ€๊ฒŒ์˜ ๋ฉ”๋‰ด๋กœ ์ฐจ์žˆ์„ ๋•Œ
      ์ด ์„ธ๊ฐ€์ง€๋กœ ๊ตฌ๋ถ„๋˜๋Š”๋ฐ, ๋‹ค๋ฅธ ๊ฐ€๊ฒŒ์˜ ๋ฉ”๋‰ด๋กœ ์ฐจ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ๋นˆ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒˆ๋กœ ๋‹ด๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.
  • ์š”์ฒญ ๋ฐ”๋””
    • sameStoreCheck ๋Š” [POST] /jat/app/basket/same-store ์—์„œ ๋ฐ˜ํ™˜๋ฐ›์€ ํ˜„์žฌ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋Œ€ํ•œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ์ปจํŠธ๋กค๋Ÿฌ
  • ์„œ๋น„์Šค
    @Transactional(rollbackFor = BaseException.class)
    public PostBasketRes postBasket(int customerIdx, PostBasketReq basketReq) throws BaseException {
        int basketIdx = 0;
        try{
            if (basketReq.getSameStoreCheck() == 1){
                basketDao.renewBasket(customerIdx); // ์›๋ž˜ ๋‹ด์•„๋†จ๋˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์‚ญ์ œ
            }
            basketIdx = basketDao.postBasket(customerIdx, basketReq);
        }catch (Exception e){
            throw new BaseException(DATABASE_ERROR); // ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋ฉ”๋‰ด ๋‹ด๊ธฐ๋ฅผ ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค.
        }

        return new PostBasketRes(basketIdx);
    }
  1. ํ™•์ธํ•œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํƒœ๊ฐ€ ์ด๋ฏธ ๋‹ค๋ฅธ ๊ฐ€๊ฒŒ์˜ ๋ฉ”๋‰ด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค๋ฉด, ํ˜„์žฌ ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•˜๊ณ ,
  2. ๊ทธ ๋‹ค์Œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋ฉ”๋‰ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.
  • Dao
// ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ดˆ๊ธฐํ™”
    public void renewBasket(int customerIdx) {
        String query = "UPDATE Basket\n" +
                "    SET status = 'D'\n" +
                "WHERE customerIdx = ? \n" +
                "AND status <> 'D'";

        this.jdbcTemplate.update(query, customerIdx);
    }
// ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋–จ์ด๋ฉ”๋‰ด ๋‹ด๊ธฐ
    public int postBasket(int customerIdx, PostBasketReq basketReq) {
        String query = "INSERT INTO Basket(storeIdx, customerIdx, todaymenuIdx, cnt)\n" +
                "VALUES(?, ?, ?, ?)";
        Object[] params = new Object[]{
                basketReq.getStoreIdx(),
                customerIdx,
                basketReq.getTodaymenuIdx(),
                basketReq.getCount()
        };

        this.jdbcTemplate.update(query, params);

        String lastInsertIdQuery = "select last_insert_id()";
        return this.jdbcTemplate.queryForObject(lastInsertIdQuery,int.class);
    }

ํ…Œ์ŠคํŠธ


3. [GET] /jat/apps/basket

์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ๋–จ์ด๋ฉ”๋‰ด ์กฐํšŒ

  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋–จ์ด๋ฉ”๋‰ด๋ฅผ ๋‹ด์•˜์œผ๋‹ˆ ํ™•์ธ๋„ ํ•ด์•ผํ•œ๋‹ค.
  • ์ฃผ๋ฌธ ์ „ ๋‹จ๊ณ„๋“ค
  • ์‘๋‹ต ๋ฐ”๋””
  • ์ปจํŠธ๋กค๋Ÿฌ
  • ์„œ๋น„์Šค
    public GetBasketRes getBasket(int customerIdx) throws BaseException{
        // 1. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์กฐํšŒ
        List<BasketItemFromDao> basketItemsDao;
        try{
            basketItemsDao = basketDao.getBasket(customerIdx);
        }catch (Exception e){
            throw new BaseException(DATABASE_ERROR); // ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์กฐํšŒ์‹คํŒจ.
        }

        // API ์‘๋‹ต ํ˜•ํƒœ๋กœ ์ „ํ™˜
        // ์ด ๋ฉ”๋‰ด ๋ฐ ๊ฐ€๊ฒฉ ๋งŒ๋“ค๊ธฐ
        List<BasketItem> basketItems = new ArrayList<>();
        int totalMenuCount = 0, totalMenuPrice = 0;
        try{
            if(basketItemsDao.size() != 0){
                for (BasketItemFromDao basketItem :basketItemsDao){
                    totalMenuCount += 1; // ๋ฉ”๋‰ด ์ข…๋ฅ˜ ๊ฐœ์ˆ˜
                    totalMenuPrice += basketItem.getTodayPrice() * basketItem.getCount(); // ์ด ์ฃผ๋ฌธ ๊ฐ€๊ฒฉ
                    basketItems.add(
                            new BasketItem(basketItem.getStoreIdx(),
                                    basketItem.getTodaymenuIdx(),
                                    basketItem.getBaksetIdx(),
                                    basketItem.getMenuUrl(),
                                    basketItem.getMenuName(),
                                    basketItem.getCount(),
                                    basketItem.getPrice(),
                                    basketItem.getDiscount(),
                                    basketItem.getTodayPrice())
                    );
                }
            }
        }catch (Exception e){
            throw new BaseException(DATABASE_ERROR); // ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฐ˜ํ™˜ ์‹คํŒจ
        }

        // menu url ๊ฐ€์ ธ์˜ค๊ธฐ
        try{
            if(basketItems.size() != 0){
                for(BasketItem basketItem : basketItems){
                    if (basketItem.getMenuUrl() != null && !basketItem.getMenuUrl().equals("")){
                        basketItem.setMenuUrl(""+s3Client.getUrl(bucketName, basketItem.getMenuUrl()));
                    }
                }
            }
        }catch (Exception e){
            throw new BaseException(DATABASE_ERROR); // ๋ฉ”๋‰ด ์‚ฌ์ง„ ์กฐํšŒ ์‹คํŒจ
        }

        // ๊ฐ€๊ฒŒ url ๊ฐ€์ ธ์˜ค๊ธฐ
        String storeUrl;
        try{
            storeUrl = basketDao.getStoreUrl(basketItemsDao.get(0).getStoreIdx());
            storeUrl = ""+s3Client.getUrl(bucketName, storeUrl);
        }catch (Exception e){
            throw new BaseException(DATABASE_ERROR); // ๋ฉ”๋‰ด ์‚ฌ์ง„ ์กฐํšŒ ์‹คํŒจ
        }

        try{
            GetBasketRes basketRes = new GetBasketRes(0, null, null, 0,0, null);
            if(basketItemsDao.size() != 0){
                basketRes.setStoreIdx(basketItemsDao.get(0).getStoreIdx());
                basketRes.setStoreName(basketItemsDao.get(0).getStoreName());
                basketRes.setStoreUrl(storeUrl);
                basketRes.setTotalMenuCount(totalMenuCount);
                basketRes.setTotalMenuPrice(totalMenuPrice);
                basketRes.setBasketItems(basketItems);
            }
            return basketRes;
        }catch (Exception e){
            throw new BaseException(DATABASE_ERROR); // ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ฒฐ๊ณผ ์—๋Ÿฌ
        }
    }
  1. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ๋–จ์ด ๋ฉ”๋‰ด๋“ค์˜ ๊ธฐ๋ณธ์ •๋ณด๋ฅผ ์กฐํšŒ
  2. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ๋–จ์ด ๋ฉ”๋‰ด๋“ค์˜ ์ด ํ•ฉ ๊ฐ€๊ฒฉ์„ ์ƒ์„ฑ
  3. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํ™”๋ฉด์—์„œ ๋ณผ ๋–จ์ด ๋ฉ”๋‰ด์˜ ์ด๋ฏธ์ง€ URL ์„ ์ƒ์„ฑ
  4. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํ™”๋ฉด์— ๋ณด์ด๋Š” ๊ฐ€๊ฒŒ์˜ ์ž‘์€ ๊ฐ€๊ฒŒ์‚ฌ์ง„์„ ์ฑ„์šธ ์ด๋ฏธ์ง€ URL ์ƒ์„ฑ
  5. ์ƒ์„ฑํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์‘๋‹ต๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜
  • Dao
// ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ๊ธฐ๋ณธ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ
(๊ฐ€๊ฒŒ Id, ๊ฐ€๊ฒŒ ์ด๋ฆ„, ๋–จ์ด๋ฉ”๋‰ดId, ์žฅ๋ฐ”๊ตฌ๋‹ˆid, ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด์€๊ฐœ์ˆ˜, 
๊ฐ€๊ฒฉ, s3๊ฐ์ฒดํ‚ค, ๋ฉ”๋‰ด์ด๋ฆ„, ๋–จ์ด๋ฉ”๋‰ด ๊ฐ€๊ฒฉ, ๋–จ์ด๋ฉ”๋‰ด ํ• ์ธ์œจ)
   public List<BasketItemFromDao> getBasket(int customerIdx) {
        String query ="" +
                "SELECT\n" +
                "    B.storeIdx, store_name,\n" +
                "    B.todaymenuIdx, B.basketIdx, B.cnt,\n" +
                "    M.price as originPrice,\n" +
                "    M.menu_url, M.menu_name,\n" +
                "    TM.price as discountedPrice,\n" +
                "    TM.discount\n" +
                "FROM Basket B\n" +
                "LEFT JOIN TodayMenu TM on B.todaymenuIdx = TM.todaymenuIdx\n" +
                "LEFT JOIN Menu M on TM.menuIdx = M.menuIdx AND M.status != 'D'\n" +
                "LEFT JOIN Stores S on B.storeIdx = S.storeIdx AND S.status = 'A'\n" +
                "WHERE customerIdx = ?\n" +
                "    AND B.status = 'A'";

        return this.jdbcTemplate.query(query,
                (rs, rowNum) -> new BasketItemFromDao(
                        rs.getInt("storeIdx"),
                        rs.getString("store_name"),
                        rs.getInt("todaymenuIdx"),
                        rs.getInt("basketIdx"),
                        rs.getString("menu_url"),
                        rs.getString("menu_name"),
                        rs.getInt("cnt"),
                        rs.getInt("originPrice"),
                        rs.getInt("discount"),
                        rs.getInt("discountedPrice")
                ), customerIdx);
    }

ํ…Œ์ŠคํŠธ

์•„๊นŒ ๋ฉ”๋‰ด ๋‹ด๊ธฐ์—์„œ ๋‹ด์€ ๋–จ์ด๋ฉ”๋‰ด 240 ๋ฒˆ์ธ ์†Œ๊ธˆ ๋ฒ„ํ„ฐ๋กค์ด ์ž˜ ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


4. [GET] /jat/app/basket/count

์žฅ๋ฐ”๊ตฌ๋‹ˆ์•ˆ์— ๋‚ด๊ฐ€ ๋‹ด์€ ๋–จ์ด๋ฉ”๋‰ด ๊ฐœ์ˆ˜

  • ์‘๋‹ต๋ฐ”๋””
  • ์ปจํŠธ๋กค๋Ÿฌ
  • ์„œ๋น„์Šค
  • Dao
    ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐœ์ˆ˜๋ฅผ ์ง‘๊ณ„ํ•จ์ˆ˜๋กœ ๊ฐ€์ ธ์˜ด

ํ…Œ์ŠคํŠธ


ํ›„๊ธฐ

์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋–จ์ด ๋ฉ”๋‰ด๋ฅผ ๋‹ด์„ ๋•Œ, ๊ฐ™์€ ๊ฐ€๊ฒŒ์˜ ๋ฉ”๋‰ด์ธ์ง€ ๋‹ค๋ฅธ๊ฐ€๊ฒŒ์˜ ๋ฉ”๋‰ด์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ๋กœ์ง์„ ์ฒ˜์Œ์— ๋– ์˜ฌ๋ฆฌ๊ธฐ ํž˜๋“ค์—ˆ๋‹ค.
์ฒ˜์Œ์—๋Š” ๋‹ด์„ ๋•Œ์™€ ๊ฐ™์€ ๊ฐ€๊ฒŒ์˜ ๋ฉ”๋‰ด์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ๊ฒƒ์„ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์œผ๋กœ ์ƒ๊ฐํ•ด api๋ฅผ ํ•˜๋‚˜๋กœ ๋งŒ๋“ค์—ˆ์ง€๋งŒ ๊ตฌํ˜„ํ•˜๋Š” ๋กœ์ง์—์„œ ์กฐ๊ฑด๋ฌธ์ด ๋„ˆ๋ฌด ๊ธธ๊ณ  ๋”๋Ÿฌ์›Œ์ ธ์„œ ๋‘˜๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋จ.

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

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