๊ฐœ๋ฐœ์ผ์ง€-12 [๐Ÿ ๊ฐ€๊ฒŒ ๋„๋ฉ”์ธ: ํŒ๋งค์ž ๊ฐ€๊ฒŒ ๋“ฑ๋ก]

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

๊ฐ€๊ฒŒ ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ ์ •์˜ ํฌ์ŠคํŒ…


๊ฐ€๊ฒŒ ๋“ฑ๋ก ์‹ ์ฒญ ํ™”๋ฉด


1. [GET] /jat/stores/duplicate

๊ฐ€๊ฒŒ ๋“ฑ๋ก ์ „ ์ค‘๋ณต๋œ ๊ฐ€๊ฒŒ ์ด๋ฆ„์ด ์„œ๋ฒ„์— ๋“ฑ๋ก ๋˜์–ด์žˆ๋Š”์ง€ ์กฐํšŒ

ํ™”๋ฉด์˜ ์ง€์ ๋ช… ๋ฐ‘ ์นธ ์˜†์— ์ค‘๋ณตํ™•์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์„œ๋ฒ„์— API ์š”์ฒญ

  • ์‘๋‹ต ๋ฐ”๋”” [StoreNameDupRes.java]
  • StoresController.java
    ๊ฐ€๊ฒŒ์ด๋ฆ„์„ queryParam์œผ๋กœ ๋„˜๊ฒจ๋ฐ›๋Š”๋‹ค.
  • StoresService.java
  • StoreDao.java
// Stores ํ…Œ์ด๋ธ”์— ๊ฐ€๊ฒŒ ์ด๋ฆ„์ด queryParam์œผ๋กœ ๋„˜์–ด์˜จ ๊ฐ€๊ฒŒ์ด๋ฆ„๊ณผ ๋™์ผํ•œ ๊ฐ€๊ฒŒ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€?
public int storeNameDuplicate(String storeName) {
        String duplicateCheck = "SELECT 
        				EXISTS(SELECT storeIdx FROM Stores WHERE store_name = ?)";

        return this.jdbcTemplate.queryForObject(duplicateCheck, int.class, storeName);
}

2. [POST] /jat/stores

ํŒ๋งค์ž๊ฐ€ ์„œ๋น„์Šค ์ด์šฉํ•˜๊ธฐ์ „ ๋ณธ์ธ์˜ ๊ฐ€๊ฒŒ ์ •๋ณด๋ฅผ ๋“ฑ๋ก ์š”์ฒญ

  • ํŒ๋งค์ž๊ฐ€ ๊ฐ€๊ฒŒ๋ฅผ ์šด์˜ํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ๊ฐ€๊ฒŒ ์ •๋ณด๋ฅผ ์ž‘์„ฑ ํ•˜๊ธฐ ์œ„ํ•œ ๋‹จ๊ณ„์ด๋‹ค.
  • ์ฃผ์†Œ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์นด์นด์˜ค ์œ„์น˜ API๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ ,
  • ๊ฐ ์ด๋ฏธ์ง€ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด AWS S3 ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค.
  • ์„œ๋ฒ„์— AWS S3 ์˜์กด์„ฑ ์ฃผ์ž… ํ›„, ์„œ๋น„์Šค ์ด์šฉ์„ ์œ„ํ•ด S3 ์„œ๋น„์Šค ์ด์šฉ ๊ถŒํ•œ์ด ์žˆ๋Š” AWS IAM ๊ณ„์ •์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ ํ•ด๋‹น ๊ณ„์ •์˜ ์ธ์ฆํ‚ค๋ฅผ ์ด์šฉํ•˜์˜€์Œ.
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์˜ฌ ๋•Œ ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ๋‹ด๊ฒจ ์žˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด MultiPart ๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉ.
  • @ReuqestBody๋Š” JSONํ˜•ํƒœ๋กœ ํŒŒ์‹ฑํ•ด์„œ ์„œ๋ฒ„์˜ ๊ฐ์ฒด ํด๋ž˜์Šค๋กœ ๋งคํ•‘ ๋˜์ง€๋งŒ, MultiPart ํŒŒ์ผ์€ form-data ํ˜•์‹์œผ๋กœ ์„œ๋ฒ„์— ๋„˜๊ฒจ์ค˜์•ผ ๋งคํ•‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ณ ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›๋Š” API์˜ ์š”์ฒญ ๋ฐ”๋””์—๋Š” @RequestBody ์–ด๋…ธํ…Œ์ด์…˜์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๋‹ค.
  • ํŒŒ์ผ์€ S3์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„ OS ํ™˜๊ฒฝ์— ์ž ์‹œ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ S3์— ์ €์žฅํ›„ ๋ฐ”๋กœ ์‚ญ์ œ, ํŒŒ์ผ๋ช…์€ ํ˜„์žฌ์‹œ๊ฐ„์„ ๋‚˜๋…ธ์ดˆ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฐ’ + ํ™•์žฅ์ž์œผ๋กœ ์ง€์ •ํ•˜์˜€๋‹ค.

(1) ๋กœ์ง ํ”Œ๋กœ์šฐ
0. ๋กœ๊ทธ์ธ ์‹œ ๋ฐœํ–‰๋ฐ›์€ JWT ํ† ํฐ์„ ํ—ค๋”์— ์ถ”๊ฐ€ํ•˜๊ณ ,
1. ๊ฐ€๊ฒŒ์ด๋ฆ„, ๊ฐ€๊ฒŒ์—…์ข…, ์‚ฌ์—…์ž ํœด๋Œ€๋ฒˆํ˜ธ, ์‚ฌ์—…์ฃผ ์ด๋ฉ”์ผ, ์‚ฌ์—…์ž ๋“ฑ๋ก์ฆ/์˜์—…์ž ๋“ฑ๋ก์ฆ/ํ†ต์žฅ์‚ฌ๋ณธ/๊ฐ€๊ฒŒ๋กœ๊ณ /๋งค์žฅ๊ฐ„ํŒ ์ด๋ฏธ์ง€, ํœด๋ฌด์ผ, ์šด์˜ ์‹œ์ž‘/์ข…๋ฃŒ ์‹œ๊ฐ„, ๊ฐ€๊ฒŒ ์ „ํ™”๋ฒˆํ˜ธ, ๊ฐ€๊ฒŒ ์ฃผ์†Œ๋ฅผ ํ•œ๋ฒˆ์— Body์— ๋‹ด์•„ ์„œ๋ฒ„์— ์š”์ฒญ.
2. ๊ฐ€๊ฒŒ ์ •๋ณด์— ๋Œ€ํ•œ ์ด๋ฏธ์ง€๋ฅผ URL ํ• ๋‹น
3. ์ฃผ์†Œ๋ฅผ ์ด์šฉํ•œ ๊ฐ€๊ฒŒ ์œ„์น˜ ์ขŒํ‘œ ํ• ๋‹น
4. ์ž…๋ ฅ ์ •๋ณด + ์ด๋ฏธ์ง€ URL + ๊ฐ€๊ฒŒ ์œ„์น˜ ์ขŒํ‘œ ๋ฅผ ์ตœ์ข…์ ์œผ๋กœ DB์˜ ๊ฐ€๊ฒŒ ํ…Œ์ด๋ธ”์— ๊ฐ€๊ฒŒ ์ •๋ณด๋กœ ๋“ฑ๋กํ•œ๋‹ค.

  • ์š”์ฒญ ๋ฐ”๋”” [PostStoreReq.java]
    ์ฃผ์„์— ์ด๋ฏธ์ง€ url์€ ์ด๋ฏธ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์ฑ„์šฐ๋Š” ํ•„๋“œ์ด๋‹ค..ใ…Žใ…Ž
  • StoreController.java
    ๋กœ๊ทธ์ธ ํ›„ ์‚ฌ์šฉ๋˜๋Š” ์„œ๋น„์Šค ์ด๋ฏ€๋กœ ํ—ค๋”์— ์˜ฌ๋ฐ”๋ฅธ JWTํ† ํฐ์„ ํ™•์ธํ•˜์—ฌ ์‚ฌ์šฉ์ž ์‹๋ณ„์ž๋ฅผ ํš๋“ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
  • StoreService.java
@Transactional(rollbackFor = {BaseException.class, IOException.class})
    public PostStoreRes storeRegister(int sellerIdx, PostStoreReq postStoreReq) throws BaseException, IOException {
        //0) ๊ฐ€๊ฒŒ ์ค‘๋ณต ๋“ฑ๋ก ๋ฐฉ์ง€
        int storeRegistredCheck = storeDao.storeAlreadyRegister(sellerIdx);
        if (storeRegistredCheck == 1){
            throw new BaseException(STORE_ALREADY_REGISTERD); // 2034:"๊ฐ€๊ฒŒ ๋“ฑ๋ก ์š”์ฒญ์„ ์ด๋ฏธ ํ•˜์˜€์Šต๋‹ˆ๋‹ค(๋ฉ”๋‰ด ๋“ฑ๋ก ๋˜๋Š” ๊ด€๋ฆฌ์ž์˜ ์Šน์ธ์„ ๊ธฐ๋‹ค๋ฆฌ์„ธ์š”).
        }

        // 1) ๊ฐ€๊ฒŒ ์ด๋ฏธ์ง€ ๋“ฑ๋ก์ •๋ณด URL ๋ฐœ์ƒ
        String[] fileNames = new String[]{null, null, null, null, null};
        File[] files = new File[]{null, null, null, null, null};
        try{

            fileNames[0] = checkFileIsNullThenName(postStoreReq.getBusinessCertificateFile()); // ์‚ฌ์—…์ž ๋“ฑ๋ก์ฆ ์ด๋ฏธ์ง€ํŒŒ์ผ
            fileNames[1] = checkFileIsNullThenName(postStoreReq.getSellerCertificateFile()); // ์˜์—…์ž ๋“ฑ๋ก์ฆ ์ด๋ฏธ์ง€ ํŒŒ์ผ
            fileNames[2] = checkFileIsNullThenName(postStoreReq.getCopyAccountFile()); // ํ†ต์žฅ ์‚ฌ๋ณธ ์ด๋ฏธ์ง€ ํŒŒ์ผ
            fileNames[3] = checkFileIsNullThenName(postStoreReq.getStoreLogoFile()); // ๊ฐ€๊ฒŒ๋กœ๊ณ  ์ด๋ฏธ์ง€ํŒŒ์ผ
            fileNames[4] = checkFileIsNullThenName(postStoreReq.getSignFile()); // ๊ฐ€๊ฒŒ ๊ฐ„ํŒ ์ด๋ฏธ์ง€ ํŒŒ์ผ

            // ๋ณด๋‚ผ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
            for (int i = 0; i<5 ; i++)
                if (fileNames[i] != null) {
                    files[i] = new File(absolutePath + fileNames[i]);
                    System.out.println(fileNames[i] +": "+ files[i]);
                }
        }catch (Exception e){
            throw new BaseException(STORE_URL_POST_ERROR); // 4034: ๋“ฑ๋กํ•˜๋Š” ์ด๋ฏธ์ง€์˜ ํ˜•ํƒœ๊ฐ€ ์ž˜๋ชป ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
        }

        // ์‹ค์ œ ํŒŒ์ผ ์ƒ์„ฑ
        try{
            if (files[0] != null)
                postStoreReq.getBusinessCertificateFile().transferTo(files[0]);
            if (files[1] != null)
                postStoreReq.getSellerCertificateFile().transferTo(files[1]);
            if (files[2] != null)
                postStoreReq.getCopyAccountFile().transferTo(files[2]);
            if (files[3] != null)
                postStoreReq.getStoreLogoFile().transferTo(files[3]);
            if (files[4] != null)
                postStoreReq.getSignFile().transferTo(files[4]);
        }catch (Exception e){
            throw new BaseException(STORE_URL_POST_ERROR); // 4034: ๋“ฑ๋กํ•˜๋Š” ์ด๋ฏธ์ง€์˜ ํ˜•ํƒœ๊ฐ€ ์ž˜๋ชป ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
        }

        // 2) ๊ฐ€๊ฒŒ ๋“ฑ๋ก์— ํ•„์š”ํ•œ ๊ฐ ์ด๋ฏธ์ง€ url ์ƒ์„ฑ
        String[] urls = new String[]{null, null, null, null, null};
        try{
            for (int i = 0; i<5; i++) {
                if (fileNames[i] != null) {
                    s3Client.putObject(new PutObjectRequest(bucketName, fileNames[i], files[i]));
                    urls[i] = "" + s3Client.getUrl(bucketName, fileNames[i]);
                    files[i].delete();
                }
            }
        } catch (Exception e){
            throw new BaseException(S3_ACCESS_API_ERROR); // 5030 : ์ด๋ฏธ์ง€ url ์ƒ์„ฑ์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค.
        }

        // ๊ฐ€๊ฒŒ ์ขŒํ‘œ ๊ตฌํ•˜๊ธฐ(๊ฒฝ/์œ„๋„)
        ResponseEntity<LocationInfoRes> apiResponse;
        try{
            apiResponse = locationValue.kakaoLocalAPI(postStoreReq.getStoreAddress());
        }catch (Exception e) {
            throw new BaseException(STORE_XY_CODE_FAILED); // 2035 : ๊ฐ€๊ฒŒ์ฃผ์†Œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
        }

        // ์นด์นด์˜ค ์œ„์น˜ API ์‘๋‹ต ์‹คํŒจ
        if (apiResponse.getStatusCode() != HttpStatus.OK){
            throw new BaseException(STORE_XY_CODE_FAILED); // 2035 : ๊ฐ€๊ฒŒ์ฃผ์†Œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
        }

        // ์‘๋‹ต ๊ฐ’์ด 1์ด์ƒ์ด๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์กด์žฌํ•จ
        LocationInfoRes currentLoc = apiResponse.getBody();
        if (currentLoc.getDocuments().length == 0){
            throw new BaseException(STORE_XY_CODE_FAILED); //2036 :๊ฐ€๊ฒŒ ๋“ฑ๋ก ์š”์ฒญ ์‹คํŒจ.
        }

        String locAddress = currentLoc.getDocuments()[0].getAddress().getAddress_name();
        String roadAddress = currentLoc.getDocuments()[0].getRoad_address().getAddress_name();
        double nowX = currentLoc.getDocuments()[0].getX();
        double nowY = currentLoc.getDocuments()[0].getY();

        try{ // url ์ €์žฅ
           return new PostStoreRes(storeDao.storeRegister(sellerIdx, postStoreReq, fileNames, nowX, nowY));
        } catch (Exception e){
            throw new BaseException(STORE_REGISTER_FAILED);
        }
    }
  1. ํ•ด๋‹น ์œ ์ €๊ฐ€ ์ด๋ฏธ ๊ฐ€๊ฒŒ๋ฅผ ๋“ฑ๋กํ•˜์˜€๋Š”์ง€ ํŒ๋ณ„ํ•˜๊ณ , ๊ฐ€๊ฒŒ ๋“ฑ๋ก์„ ์ด๋ฏธ ์•ˆํ–ˆ๋‹ค๋ฉด
  2. ๊ฐ€๊ฒŒ ์ •๋ณด์˜ ์ด๋ฏธ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด URL์„ ๋งŒ๋“ค ์ค€๋น„๋ฅผ ํ•œ๋‹ค.
  3. AWS S3์— ์ €์žฅํ•  ํŒŒ์ผ์˜ Key๊ฐ’์ธ ํŒŒ์ผ๋ช…์€ ํ˜„์žฌ์‹œ๊ฐ„์˜ ๋‚˜๋…ธ์ดˆ๊นŒ์ง€์˜ ๊ฐ’ + ํŒŒ์ผ ํ™•์žฅ์ž ๋กœ ์ง€์ •ํ•˜์˜€๋‹ค.
  4. ํŒŒ์ผ๋ช…์„ ๊ฐ ์ด๋ฏธ์ง€์— ๋งž๊ฒŒ ๋งŒ๋“ค์—ˆ์œผ๋ฉด Ubuntu ํ™˜๊ฒฝ์— ์ง€์ •๋œ ํด๋”์— ์‹ค์ œ๋กœ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ ,
  5. ํ•ด๋‹น ํŒŒ์ผ์„ AWS S3 ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ S3 ๋ฒ„ํ‚ท์— ์ง์ ‘ ์ €์žฅํ•˜๊ณ  URL์„ ์ƒ์„ฑํ•œ๋‹ค.
  6. ์ด๋ฏธ์ง€ URL ์ƒ์„ฑ์ด ๋๋‚˜๊ณ ,
  7. ์•ฑ์—์„œ ๊ตฌ๋งค์ž๊ฐ€ ์ง€๋„๋กœ ๊ฐ€๊ฒŒ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด, ์ž…๋ ฅ๋ฐ›์€ ๊ฐ€๊ฒŒ์ •๋ณด๋ฅผ Kakao ์œ„์น˜ API๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ€๊ฒŒ ์ฃผ์†Œ์˜ ๊ฒฝ/์œ„๋„ ์ขŒํ‘œ๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค.
  8. S3๋ฅผ ํ†ตํ•œ ์ด๋ฏธ์ง€ URL ํ• ๋‹น & Kakao API๋ฅผ ์ด์šฉํ•œ ์ฃผ์†Œ ์ขŒํ‘œ ๊ฐ’์„ ๋ชจ๋‘ ๊ตฌํ•˜์˜€๋‹ค๋ฉด, ๋‚˜๋จธ์ง€ ์ž…๋ ฅ๋ฐ›์€ ๊ฐ’๊ณผ ํ•จ๊ป˜ ํŒ๋งค์ž์˜ ๊ฐ€๊ฒŒ ์ •๋ณด๋ฅผ "์Šน์ธ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ" DB์— ์ €์žฅํ•œ๋‹ค!
  9. ์Šน์ธ ๋Œ€๊ธฐ์ธ ์ด์œ ๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ํ•ด๋‹น ๊ฐ€๊ฒŒ์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ์„œ๋น„์Šค ์ด์šฉ์„ ํ—ˆ๋ฝํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค!
    -> ์นด์นด์˜ค ์œ„์น˜ API ํฌ์ŠคํŒ…, S3 ๊ด€๋ จ ํฌ์ŠคํŒ…
  • StoreDao.java
// ์ด๋ฏธ ๋“ฑ๋ก ์š”์ฒญ์„ ๋งˆ์นœ ํŒ๋งค์ž ์ธ์ง€ ์‹๋ณ„
public int storeAlreadyRegister(int sellerIdx) {
        String query = "SELECT EXISTS(
        			SELECT * FROM Stores 
                    WHERE sellerIdx = ? AND (status = 'W' OR status = 'A'))";

        return this.jdbcTemplate.queryForObject(query, int.class, sellerIdx);
    }
// ๊ฐ€๊ฒŒ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— "์Šน์ธ๋Œ€๊ธฐ(W)" ์ƒํƒœ๋กœ ๋“ฑ๋ก
public int storeRegister(int sellerIdx, PostStoreReq postStoresReq, String[] urls, double nowX, double nowY) {

        String query = "INSERT INTO Stores (sellerIdx,\n" +
                "                    categoryIdx,\n" +
                "                    city,\n" +
                "                    local,\n" +
                "                    town,\n" +
                "                    x,\n" +
                "                    y,\n" +
                "                    store_name,\n" +
                "                    business_phone,\n" +
                "                    business_email,\n" +
                "                    business_certificate_url,\n" +
                "                    seller_certificate_url,\n" +
                "                    copyaccount_url,\n" +
                "                    breakday,\n" +
                "                    store_open,\n" +
                "                    store_close,\n" +
                "                    store_phone,\n" +
                "                    store_address,\n" +
                "                    store_logo_url,\n" +
                "                    sign_url)\n" +
                "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";

        Object[] params = new Object[]{
                sellerIdx,
                postStoresReq.getCategoryIdx(),
                postStoresReq.getCity(),
                postStoresReq.getLocal(),
                postStoresReq.getTown(),
                nowX,
                nowY,
                postStoresReq.getStoreName(),
                postStoresReq.getBusinessPhone(),
                postStoresReq.getBusinessEmail(),
                urls[0] != null ? urls[0] : "",
                urls[1] != null ? urls[1] : "",
                urls[2] != null ? urls[2] : "",
                postStoresReq.getBreakDay(),
                postStoresReq.getStoreOpen(),
                postStoresReq.getStoreClose(),
                postStoresReq.getStorePhone(),
                postStoresReq.getStoreAddress(),
                urls[3] != null ? urls[3] : "",
                urls[4] != null ? urls[4] : ""
        };

        this.jdbcTemplate.update(query, params);

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

API ํ…Œ์ŠคํŠธ

[GET] /jat/stores/duplicate

  • ์šฐ๋ฆฌ ๋™๋„ค์˜ ๋นต์ง‘์œผ๋กœ ๊ฐ€๊ฒŒ ๋“ฑ๋ก์„ ํ•œ๋ฒˆ ํ•ด๋ณด๊ฒ ๋‹ค.
  • 0 ์ด๋ฉด ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ๊ฐ€๊ฒŒ ์ด๋ฆ„ (๋ช…์„ธ์„œ ์ฐธ๊ณ )

[POST] /jat/stores

  • ๊ฐ€๊ฒŒ ์ •๋ณด ๋“ฑ๋ก์‹ ์ฒญ ์™„๋ฃŒ ํ•œ ๋ชจ์Šต
  • ๋‹ค์‹œ ๋กœ๊ทธ์ธ ํ•˜๋ฉด ๊ฐ€๊ฒŒ๊ฐ€ ๋“ฑ๋ก๋œ ๊ฒƒ์„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.
profile
๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฟˆ์ธ 25์‚ด ๋Œ€ํ•™์ƒ์ž…๋‹ˆ๋‹ค.

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