ํ๋ฉด์ ์ง์ ๋ช ๋ฐ ์นธ ์์ ์ค๋ณตํ์ธ ๋ฒํผ์ ๋๋ฅด๋ฉด ์๋ฒ์ 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); }
- ํ๋งค์๊ฐ ๊ฐ๊ฒ๋ฅผ ์ด์ํ๊ธฐ ์ํ ๋ชจ๋ ๊ฐ๊ฒ ์ ๋ณด๋ฅผ ์์ฑ ํ๊ธฐ ์ํ ๋จ๊ณ์ด๋ค.
- ์ฃผ์ ์ฒ๋ฆฌ๋ฅผ ์ํด ์นด์นด์ค ์์น 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); } }
- ํด๋น ์ ์ ๊ฐ ์ด๋ฏธ ๊ฐ๊ฒ๋ฅผ ๋ฑ๋กํ์๋์ง ํ๋ณํ๊ณ , ๊ฐ๊ฒ ๋ฑ๋ก์ ์ด๋ฏธ ์ํ๋ค๋ฉด
- ๊ฐ๊ฒ ์ ๋ณด์ ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด URL์ ๋ง๋ค ์ค๋น๋ฅผ ํ๋ค.
- AWS S3์ ์ ์ฅํ ํ์ผ์ Key๊ฐ์ธ ํ์ผ๋ช ์ ํ์ฌ์๊ฐ์ ๋๋ ธ์ด๊น์ง์ ๊ฐ + ํ์ผ ํ์ฅ์ ๋ก ์ง์ ํ์๋ค.
- ํ์ผ๋ช ์ ๊ฐ ์ด๋ฏธ์ง์ ๋ง๊ฒ ๋ง๋ค์์ผ๋ฉด Ubuntu ํ๊ฒฝ์ ์ง์ ๋ ํด๋์ ์ค์ ๋ก ํ์ผ์ ์์ฑํ๊ณ ,
- ํด๋น ํ์ผ์ AWS S3 ์๋น์ค๋ฅผ ์ด์ฉํ์ฌ S3 ๋ฒํท์ ์ง์ ์ ์ฅํ๊ณ URL์ ์์ฑํ๋ค.
- ์ด๋ฏธ์ง URL ์์ฑ์ด ๋๋๊ณ ,
- ์ฑ์์ ๊ตฌ๋งค์๊ฐ ์ง๋๋ก ๊ฐ๊ฒ๋ฅผ ํ์ธํ๊ธฐ ์ํด, ์ ๋ ฅ๋ฐ์ ๊ฐ๊ฒ์ ๋ณด๋ฅผ Kakao ์์น API๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๊ฒ ์ฃผ์์ ๊ฒฝ/์๋ ์ขํ๋ฅผ ํ ๋น๋ฐ๋๋ค.
- S3๋ฅผ ํตํ ์ด๋ฏธ์ง URL ํ ๋น & Kakao API๋ฅผ ์ด์ฉํ ์ฃผ์ ์ขํ ๊ฐ์ ๋ชจ๋ ๊ตฌํ์๋ค๋ฉด, ๋๋จธ์ง ์ ๋ ฅ๋ฐ์ ๊ฐ๊ณผ ํจ๊ป ํ๋งค์์ ๊ฐ๊ฒ ์ ๋ณด๋ฅผ "์น์ธ ๋๊ธฐ ์ํ๋ก" DB์ ์ ์ฅํ๋ค!
- ์น์ธ ๋๊ธฐ์ธ ์ด์ ๋ ๊ด๋ฆฌ์๊ฐ ํด๋น ๊ฐ๊ฒ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์๋น์ค ์ด์ฉ์ ํ๋ฝํ๊ธฐ ์ํจ์ด๋ค!
-> ์นด์นด์ค ์์น 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); }
- ์ฐ๋ฆฌ ๋๋ค์ ๋นต์ง์ผ๋ก ๊ฐ๊ฒ ๋ฑ๋ก์ ํ๋ฒ ํด๋ณด๊ฒ ๋ค.
- 0 ์ด๋ฉด ์ค๋ณต๋์ง ์๋ ๊ฐ๊ฒ ์ด๋ฆ (๋ช ์ธ์ ์ฐธ๊ณ )
- ๊ฐ๊ฒ ์ ๋ณด ๋ฑ๋ก์ ์ฒญ ์๋ฃ ํ ๋ชจ์ต
- ๋ค์ ๋ก๊ทธ์ธ ํ๋ฉด ๊ฐ๊ฒ๊ฐ ๋ฑ๋ก๋ ๊ฒ์ ํ์ธ ๊ฐ๋ฅํ๋ค.