https://github.com/JayMon0327/MAT_ZIP_migration
- ๋ง.JAVA ํ์ ๋ง์ง ํ๋ฐฉ์ ๋๊ตฌ๋ณด๋ค ์ง์ฌ์ธ ์ฌ๋๋ค์ด ๋ญ์น ํ์ ๋๋ค. ๐
- ํ์์ ๋ชจ๋๊ฐ ๊ฒช๊ณ ์๋ ๋ถ์ ํ ๊ด๊ณ , ๋ฏฟ์ ์ ์๋ ํ๊ธฐ ์์์ ์๋น์๋ค์ด ๋ฏฟ๊ณ ๋ฐฉ๋ฌธํ ์ ์๋ ๋ง์ง์ ๋ชจ์ ๋ณผ ์ ์๋ ์ฌ์ดํธ์ ํ์์ฑ์ ๋๊ผ์ต๋๋ค.
- ๊ทธ๋์, ์์์ฆ 2ํ ์ด์ ์ธ์ฆ๋ ๋ง์ง๋ง ๋ฑ๋ก๋๋๋ก ํด์ ์ ๋ขฐ๋ ๋ฐ ๋ง์กฑ๋๊ฐ ๋์ ๋ง์ง๋ง ์ ๋ณํ์ฌ ์๋น์์๊ฒ ์ ๊ณตํ๋ ๋ชฉ์ ์ผ๋ก ๊ฐ๋ฐ์ ์งํํ์ต๋๋ค.
- ๊ตญ๋ด ์ด์ ์ค์ธ ๋ง์ง ์ถ์ฒ ์ฌ์ดํธ, ๋ํ ํฌํธ ์ง๋ ์ฌ์ดํธ์ ์ฌ๋ก ๋ถ์์ ํตํด, ์น์ฌ์ดํธ ๊ธฐ๋ฅ์ ๋ฐฉํฅ์ฑ์ "์ง์ ์ฑ ์๋ ๋ง์ง ๊ณต์ "๋ก ์ด์ ์ ๋ง์ท์ต๋๋ค.
- ๋ง์ง์ ์ข์ํ๋ ์ฌ๋๋ค ๋ฟ๋ง ์๋๋ผ, ๋ง์ง์ ์ข์ํ๋ ์ฌ๋๋ค์ ๋ฐฉ๋ฌธ์ ์ํ๋ ์์์ ๊ณ ์ฌ์ฅ๋๋ค๋ ํ์ผํ ํ ์ฌ์ฅ๋ ์ ์ฉ ๊ตฌ๋ ์๋น์ค ๋ฐ ๋ ธ์ถ ๋ฐฐ๋ ๊ด๊ณ ๋ฅผ BM์ผ๋ก ์ค์ ํ์ต๋๋ค.
- Java 8
- Spring Framework 5
- Junit5
- Maven
- Mybatis
- JSP
- JQuery 3.6.4
- BootStrap 4
- AWS EC2, S3, RDS, CloudFront, Route 53, ALB
- Tomcat 8.5
- MySQL 8.0.32
- Git, Sourcetree
- Slack
- Notion
- Google Drive
- Toss Payments API
- Google chart API
- Naver AI Sentiment
๐ป๐main
๐ป๐java
๐ป๐boss
๐ป๐controller
BoardController.java
ReplyController.java
ChartController.java
PaymentController.java
๐ป๐dao
BoardDAO.java
ReplyDAO.java
MemberDAO.java
ChartDAO.java
ReviewAnalysisDAO.java
PaymentDAO.java
๐ป๐model
BoardVO.java
BoardLikesVO.java
ReplyVO.java
BossMemberVO.java
MemberVO.java
ChartVO.java
ReturnCustomerCountVO.java
ReturnOrderCountVO.java
ReturnOrderTotalVO.java
PaymentResponse.java
PaymentVO.java
๐ป๐service
ChartService.java
ReviewTransferService.java
ReviewAnalysisService.java
PaymentService.java
RegisterMemberAndPaymentService.java
๐ป๐resources
๐ป๐mapper
BoardMapper.xml
ReplyMapper.xml
BossMapper.xml
ChartMapper.xml
ReviewAnalysisMapper.xml
PaymentMapper.xml
๐ป๐webapp
๐ป๐boss
index.jsp
chart.jsp
saveMember.jsp
boardInsert.jsp
boardUpdate.jsp
boardDelete.jsp
๐ป๐layout
foorter.jsp
header.jsp
๐ป๐resources
๐ป๐js
bossMenu.js
bossReply.js
bossScroll.js
๐ป๐WEB-INF
๐ป๐views
๐ป๐boss
boardDetail.jsp
boardIndex.jsp
boardInsert.jsp
boardSearch.jsp
boardUpdate.jsp
saveReply.jsp
tossFail.jsp
tossSuccess.jsp
-
- ํ ์ค ํ์ด API๋ฅผ ์ด์ฉํ ํธ๋์ญ์ ๊ตฌ๋ ๊ฒฐ์ ์์คํ ๊ณผ ์์ธ์ฒ๋ฆฌ
- Ajax์ Restful ๋ฐฉ์์ผ๋ก ๊ฒ์ํ ๊ฒ์๊ธ ์์ฑ, ์์ , ์ญ์ , ๊ฒ์ ๊ธฐ๋ฅ, '์ข์์' ๊ธฐ๋ฅ๊ณผ ํ์ด์ง ๊ธฐ๋ฅ
- DB์์ ๋ฐ์ดํฐ ์ ๋ณ, SQL๋ฌธ ๋ก์ง์์ฑ, ๊ตฌ๊ธ chart API๋ก ๋งค์ถ์ฐจํธ ๋ฐ ์ฌ๋ฐฉ๋ฌธ ์ฐจํธ ๊ตฌํ
- Clova API๋ฅผ ์ฌ์ฉํ์ฌ ์๋๋ค์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ์ฐจํธํ
๐ํต์ฌ ๊ธฐ๋ฅ ์ค๋ช
-
๋จผ์ , JavaScript ์ฝ๋์์๋ 'https://js.tosspayments.com/v1/payment' JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ TossPayments ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํฉ๋๋ค. ์ด ๊ฐ์ฒด๋ ํ ์ค ๊ฒฐ์ ํด๋ผ์ด์ธํธ ํค์ธ clientKey๋ฅผ ์ธ์๋ก ๋ฐ์, ๊ฒฐ์ ์์คํ ๊ณผ์ ์ฐ๊ฒฐ์ ์ค์ ํฉ๋๋ค.
-
์ฌ์ฉ์๊ฐ '๊ฒฐ์ ํ๊ธฐ' ๋ฒํผ์ ํด๋ฆญํ๋ฉด, jQuery๋ฅผ ์ด์ฉํ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ํตํด requestPayment ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค. ์ด ํจ์ ๋ด๋ถ์์๋ ๋ ๊ฐ์ง ์ฃผ์ ์์ ์ ์ํํฉ๋๋ค: ์ฒซ์งธ, jQuery์ $.ajax ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์์ ID(storeId)์ ์ค๋ณต ์ฌ๋ถ๋ฅผ ์๋ฒ์ ๋น๋๊ธฐ์ ์ผ๋ก ์์ฒญํ๊ณ ์๋ต์ ์ฒ๋ฆฌํฉ๋๋ค. ๋์งธ, ์ค๋ณต๋์ง ์๋ storeId๋ฅผ ํ์ธํ ํ, ๋๋ค์ผ๋ก orderID๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ๊ฒ ์์ฑ๋ orderID๋ ๊ฒฐ์ ์์ฒญ ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋ ์์ ์ด ๋ชจ๋ ์ฑ๊ณต์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ์๋ง ๊ฒฐ์ ์์ฒญ์ด ์ด๋ฃจ์ด์ง๋๋ค.
-
๊ฒฐ์ ์์ฒญ์ TossPayments API๋ก ์ ์ก๋๋ฉฐ, ๊ฒฐ์ ์ ๋ณด๋ฅผ ๋ด์ JavaScript ๊ฐ์ฒด๋ฅผ JSON.stringify ํจ์๋ฅผ ์ฌ์ฉํ์ฌ JSON ๋ฌธ์์ด๋ก ๋ณํํ ๋ค ์ ์กํฉ๋๋ค. ์ด ๋, Apache์ CloseableHttpClient์ HttpPost๋ฅผ ์ฌ์ฉํ์ฌ HTTP ์์ฒญ์ ๋ณด๋ด๋ฉฐ, ์์ฒญ ํค๋๋ฅผ setHeader ๋ฉ์๋๋ก ์ค์ ํ๊ณ , ์์ฒญ ์ํฐํฐ๋ฅผ StringEntity ๊ฐ์ฒด๋ฅผ ํตํด ์ค์ ํฉ๋๋ค. ๊ฒฐ์ ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉด, ๊ฒฐ์ ์ฑ๊ณต URL๋ก ์ด๋ํ๊ฒ ๋ฉ๋๋ค.
-
โผ๊ฒฐ๊ณผโผ ๊ฒฐ์ ํ๊ธฐ ๋ฒํผ ํด๋ฆญ ์ ํ ์ค ๊ฒฐ์ API์ ์ฐ๊ฒฐ๋์ด ์์ ID์ ์ค๋ณต ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๊ณ ๊ฒฐ์ ๋ฅผ ์งํํฉ๋๋ค.
-
๊ฒฐ์ ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ์, ์์ ID(storeId)์ ์ธ์ ์ user_id๋ฅผ ์ด์ฉํด ์ฌ์ฅ ๋ฉค๋ฒ๋ก์ ํ์ ๋ฑ๋ก์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด ๊ณผ์ ์ jQuery์ AJAX๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ๋น๋๊ธฐ์ ์ผ๋ก ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ด AJAX ์์ฒญ์ ํน์ ์๋ํฌ์ธํธ์ธ '/innerJoinAndInsert'๋ก ์ ์ก๋๋ฉฐ, ์๋ฒ์์๋ ์ด ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
-
์๋ฒ ์ฌ์ด๋์์๋ MemberAndPaymentService ํด๋์ค๊ฐ ์ด ์์ฒญ์ ์ฒ๋ฆฌํฉ๋๋ค. MemberAndPaymentService๋ ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ ํตํด ํ์ํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ต๋๋ค. ์ด ํด๋์ค๋ ํ์ ๋ฑ๋ก๊ณผ ๊ฒฐ์ ๋ฅผ ๋์์ ์ฒ๋ฆฌํ๋ ํธ๋์ญ์ ์ ๊ด๋ฆฌํฉ๋๋ค.
-
ํด๋ผ์ด์ธํธ์์๋ AJAX ์์ฒญ์ ์ฑ๊ณต ์ฌ๋ถ์ ๋ฐ๋ผ ์ฝ์์ ์ฑ๊ณต ๋๋ ์คํจ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์ด๋ ์ฑ๊ณต ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ ๊ฒฝ์ฐ๋ ์๋ฒ์์ ํ์ ๋ฑ๋ก์ด ์ ์์ ์ผ๋ก ์๋ฃ๋์์ ๋์ด๋ฉฐ, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์คํจ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ํ์ ๋ฑ๋ก ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉด, ํด๋ผ์ด์ธํธ์์๋ ์ด storeId๋ฅผ ์ธ์ ์์ ์ ๊ฑฐํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์์ ์ธํฐํ์ด์ค๋ฅผ ์ ๋ฐ์ดํธํ๊ณ , ์์ ID๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
-
โผ๊ฒฐ๊ณผโผ ์๋ฒ์์ ํ์ ๋ฑ๋ก์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉด, ํด๋ผ์ด์ธํธ ์ฝ์์ ์ฑ๊ณต ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๊ณ , ์์ ID๋ ์ธ์ ์์ ์ ๊ฑฐ๋ฉ๋๋ค.
-
๊ฒฐ์ ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ํ, ๊ฒฐ์ ๋ด์ญ์ ์๋ฒ๋ก ์ ์ก๋ฉ๋๋ค. ์ด ์ ๋ณด๋ /payment ์๋ํฌ์ธํธ๋ก ์ ์ก๋๋ฉฐ, ์๋ฒ๋ ์ด ์ ๋ณด๋ฅผ ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํฉ๋๋ค. ์ด ๋์ ์๋ฒ ์ฌ์ด๋ ์ฒ๋ฆฌ๋ PaymentService์ PaymentController ํด๋์ค์์ ์ํ๋๋ฉฐ, ์ด๋ค ํด๋์ค ์ญ์ ์์กด์ฑ ์ฃผ์ ์ ํตํด ํ์ํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ต๋๋ค.
-
PaymentVO ๊ฐ์ฒด์๋ ์ฃผ๋ฌธ ID, ๊ฒฐ์ ๊ธ์ก, ์ฃผ๋ฌธ ์ด๋ฆ ๋ฑ์ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ์ ๋ณด๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต์์ ์ถ์ถํ๋ฉฐ, ์ด ๊ณผ์ ์์ Apache์ HttpComponents ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
ํด๋ผ์ด์ธํธ๋ CloseableHttpClient ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ๋ก HTTP ์์ฒญ์ ์ ์กํฉ๋๋ค. ์ด๋ HttpPost ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ ํค๋์ ์ํฐํฐ๋ฅผ ์ค์ ํฉ๋๋ค. ํค๋๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ณ , ์ํฐํฐ๋ POST ์์ฒญ์ ํตํด ์๋ฒ๋ก ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
-
์์ฒญ์ด ์๋ฒ๋ก ์ ์ก๋ ํ, ํด๋ผ์ด์ธํธ๋ CloseableHttpResponse ๊ฐ์ฒด๋ฅผ ํตํด ์๋ฒ๋ก๋ถํฐ์ ์๋ต์ ๋ฐ์ต๋๋ค. ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ EntityUtils์ toString ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด๋ก ๋ณํํฉ๋๋ค. ์ด ๋ฌธ์์ด์ JSON ํํ๋ก ๋์ด ์์ผ๋ฏ๋ก, JsonParser.parseString ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ JSON ๋ฌธ์์ด์ JsonObject๋ก ํ์ฑํฉ๋๋ค.
-
์ด๋ ๊ฒ ํ์ฑ๋ JsonObject์์, ์ฃผ๋ฌธ ID, ๊ฒฐ์ ๊ธ์ก, ์ฃผ๋ฌธ ์ด๋ฆ ๋ฑ์ ์ ๋ณด๋ฅผ ์ถ์ถํ์ฌ PaymentVO ๊ฐ์ฒด์ ์ค์ ํฉ๋๋ค. ์ด๋ ๊ฒ ์์ฑ๋ PaymentVO ๊ฐ์ฒด๋ ์๋ฒ์ ๋ณด๋ด์ง๋๋ค. ์ด๋ฅผ ํตํด ์๋ฒ๋ ๊ฒฐ์ ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ด๋ฃจ์ด์ก์์ ํ์ธํ๊ณ , ํด๋น ๊ฒฐ์ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ์ ์์ต๋๋ค.
-
โผ๊ฒฐ๊ณผโผ ๊ฒฐ์ ์ ๋ณด๊ฐ ์๋ฒ์ ์ ๋ฌ๋๊ณ , ํด๋น ์ ๋ณด๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฑ๊ณต์ ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
โฝํธ๋ฌ๋ธ ์ํ
-
์ฒซ ๋ฒ์งธ ์๋ : ํด๋ผ์ด์ธํธ์์ ๊ฒฐ์ ์์ฒญ ๊ฐ ์ค์ -> โ๋น์ ์์๋
- 'PaymentKey, PaymentType, orderId, amount ๊ฐ ๋ชจ๋ ํ์ํ๋ค'๊ณ ์น ์ฝ์ ์๋ฌ ๋ฉ์์ง๊ฐ ๋์๋๋ฐ, ๊ฒฐ๊ตญ PaymentKey์ PaymentType ๊ฐ์ ์๋ฒ์์ ์ค์ ํด์ผ ํ๋ค๋ ๊ฑธ ์๊ฒ ๋๋ค. ์ด๊ฒ ์์ธ์ด์๋๋ณด๋ค ์ถ์ด์ orderId์ amount ๊ฐ๋ง ์์ฒญ์ ๋ฃ์๋๋ฐ, ๊ฒฐ์ ๋ ๋๋๋ฐ ๊ฒฐ์ ์ฑ๊ณต ํ์ด์ง์์ ๊ฒฐ์ ์๋ต๊ฐ์ ์ฌ์ ํ ๋ชป ๋ฐ์์๋ค.
-
๋ ๋ฒ์งธ ์๋ : API ์์ฒญ์ ์๋ฒ์์ ์ฒ๋ฆฌ -> โญ์ ์์๋!
ํด๋ผ์ด์ธํธ์์ API ์์ฒญ์ ์ฒ๋ฆฌํ๋ ค๋ ๋ณด์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋ ๊ฑธ ์๊ฒ ๋์๋ค. ๊ทธ๋์ ๊ฒฐ์ ์๋ต๊ฐ์ JSON ํํ๋ก ๋ฐ์์ค๋ ๊ฒ๋ ์๋ฒ์์ ์ฒ๋ฆฌํ๋๋ก ๋ฐ๊ฟจ๋ค. ์๋น์ค ๋ ์ด์ด๋ฅผ ๋ถ๋ฆฌํ๊ณ , Secret Key๋ฅผ Base64๋ก ์ธ์ฝ๋ฉํด์ ์์ฒญ์ ๋ณด๋ด๋๊น ์ ์์ ์ผ๋ก ๋์ํ๋ค. ์์ธ ์ฒ๋ฆฌ๋ try-catch ๊ตฌ๋ฌธ์ ์จ์ ํด๊ฒฐํ๊ณ , ์์ฒญ์ด ์ฑ๊ณตํ๋ฉด 200์ด๋ผ๋ HTTP OK ์ ํธ๊ฐ ์ค๋ ๊ฒ์ ์ด์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ต ํค๋์ 'Content-Type: application/json'์ ์จ์ JSON์ผ๋ก ํ์ฑ๋ ๊ฐ์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋๊น ์๋ต์ ๋ณด๋ ์ ํ์๋๋ค.
์ด๋ฒ ์ค๋ฅ๋ฅผ ํตํด์ ๋ค์ํ ๊ฒ์ ๋ฐฐ์ธ ์ ์์๋ค. ํด๋ผ์ด์ธํธ์์ API ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ณด์ ๋ฌธ์ ๊ฐ ์์ผ๋ ์๋ฒ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค๋ ๊ฒ, ์๋น์ค ๋ ์ด์ด๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ, ์์ธ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ, Secret Key๋ฅผ Base64๋ก ์ธ์ฝ๋ฉํ๋ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ 'Content-Type: application/json' ํค๋๋ฅผ ์ฌ์ฉํด์ JSON์ผ๋ก ํ์ฑ๋ ๊ฐ์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ ๋ฑ์ ์๊ฒ ๋์๋ค.
String encodedSecretKey = Base64.getEncoder().encodeToString((secretKey + ":").getBytes()); Base64์ธ์ฝ๋ฉ ํ๋ ์ฝ๋
-
์ฒซ ๋ฒ์งธ ๋ฐ๊ฒฌ : mapper์์ ์ฟผ๋ฆฌ๋ฌธ ์์ฑ ํ ์คํ -> โsyntax ์๋ฌ ๋ฐ์
- Mysql ๋ฌธ๋ฒ์ ๋ง์ง ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค. ์ฟผ๋ฆฌ๋ฌธ ์์ฑ์์ ์๋ชป๋๋ค๊ณ ํ๋จํ์๊ณ , ํ์ธํด๋ณธ ๊ฒฐ๊ณผ ๋ถ๋ฑํธ์ ๊ฐ์ ํน์ ๋ฌธ์ ๋๋ฌธ์ XML ํ์ฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
<![CDATA[]]>
๋ฅผ ์ด์ฉํด ํด๋น ๋ถ๋ถ์ ๊ฐ์ธ ์ฒ๋ฆฌํ์์ผ๋, ์ดํ MySQL์์๋ ๋ค์ ๋ฌธ๋ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
- Mysql ๋ฌธ๋ฒ์ ๋ง์ง ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค. ์ฟผ๋ฆฌ๋ฌธ ์์ฑ์์ ์๋ชป๋๋ค๊ณ ํ๋จํ์๊ณ , ํ์ธํด๋ณธ ๊ฒฐ๊ณผ ๋ถ๋ฑํธ์ ๊ฐ์ ํน์ ๋ฌธ์ ๋๋ฌธ์ XML ํ์ฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
-
ํด๊ฒฐ ๋ฐฉ๋ฒ : XML ์ํฐํฐ ์ฌ์ฉ -> โญ์ ์์๋!
XML ๋ฌธ๋ฒ์ ๋ฐ๋ฅด๋ฉด, <, >์ ๊ฐ์ ํน์ ๋ฌธ์๋ ํ๊ทธ๋ฅผ ์๋ฏธํ๊ธฐ์ ์ด๋ค์ ๋ฌธ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ์ด๋ฐ ๋ฌธ์๋ฅผ ์ฌ์ฉํ ๋๋ XML ์ํฐํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ, <๋
⁢
๋ก, >๋>
๋ก ๋ณ๊ฒฝํ์๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ์ ํตํด ๊ธฐ๋ฅ์ด ์ ์์ ์ผ๋ก ์๋ํ์๋ค.์ด๋ฒ ์ค๋ฅ๋ฅผ ํตํด SQL ์ฟผ๋ฆฌ๋ฌธ์ ์์ฑํ๋ ๊ณผ์ ์์ XML ์ค๋ฅ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์๋์ง, ๋ XML์์ ํน์ ๋ฌธ์๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง์ ๋ํด ๋ฐฐ์ธ ์ ์์๋ค.
๊ฐ์ ๋ถ์ API๋ฅผ ํตํด ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์ ๋ถ์์ ์์ฒญํ์ ๋, ์๋ต๊ฐ ์ค '์ค๋ฆฝ'๋ง ๋ฐํ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋ถ์ ๋์์ธ 'content'๊ฐ '???' ํํ ํน์ null๋ก ์๋ต ๋ฐ์์ง๋ ๊ฒ์ด ์์ธ์ด์๋ค.
-
์ฒซ ๋ฒ์งธ ์๋ : ํจ์ ๋ด๋ถ์์ ์ฌ๋ฌ ajax ์์ฒญ์ ๋์์ ๋ณด๋ด๋ ๊ฒ์ด ๋ฌธ์ ๋ผ๊ณ ํ๋จํด์ promise ๋ฌธ๋ฒ์ ์ฌ์ฉํด ์์ฐจ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์๋ -> โ๋น์ ์์๋
-
๋ ๋ฒ์งธ ์๋ : JSON ํ์์ผ๋ก ์์ฒญ์ด ๋์ง ์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด JSON.stringify๋ฅผ ์ฌ์ฉํ์ฌ ์ ์์ ์ผ๋ก JSON ์์ฒญ์ ๋ณด๋ -> โ๋น์ ์์๋
-
์ธ ๋ฒ์งธ ์๋ : ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ ์์ฒด๊ฐ DB์์ UTF-8๋ก ์ธ์ฝ๋ฉ๋์ง ์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ utf8mb4๋ก ์ธ์ฝ๋ฉ -> โ๋น์ ์์๋
-
๋ค ๋ฒ์งธ ์๋ : ์คํ๋ง ํ๋ ์์ํฌ์์ DB์ ์ฐ๊ฒฐ ์ UTF-8 ์ค์ ์ด ์ ๋์ด ์๋ ๋ฌธ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด spring์ root-context.xml ํ์ผ์ ํ์ธ -> โ๋น์ ์์๋
-
๋ค์ฏ ๋ฒ์งธ ์๋ : API ์์ฒญ์ ๋ณด๋ผ ๋ ์ธ์ฝ๋ฉ/๋์ฝ๋ฉ ๋ฌธ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ ์ธ์ฝ๋ฉํ์ฌ ๋ณด๋ด๊ณ , ์๋ฒ์์ ๋์ฝ๋ฉํ์ฌ ๋ฐ์ ํ ์๋ฒ์์ API ์์ฒญ์ ๋ณด๋ -> โ๋น์ ์์๋
-
์ฌ์ฏ ๋ฒ์งธ ์๋ : ์๋ฒ์์ API ์์ฒญ์ ๋ณด๋ผ ๋ base64๋ก ์ธ์ฝ๋ฉํ๊ณ ์ฒ๋ฆฌ ํ ํด๋ผ์ด์ธํธ๋ก ์ ๋ฌํ์๊ณ , ํด๋ผ์ด์ธํธ ์ธก์์ ๋์ฝ๋ฉํ์ฌ ์ถ๋ ฅ -> โ๋น์ ์์๋
-
์ผ๊ณฑ ๋ฒ์งธ ์๋ : HttpEntity ๊ฐ์ฒด ์ฌ์ฉ ๋ฐ ContentType์ UTF-8 ๋ช ์ -> โญ์ ์ ์๋!
๋ค์ด๋ฒ ๊ฐ์ ๋ถ์ API ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด ์์ฒญ ํค๋์ UTF-8์ ๋ช ์ํ๋ผ๊ณ ๋์ด์๋ค. ์ด๋ฅผ ์ ์ฉํด ๋ณด๋ ์ ์์ ์ผ๋ก ์์ฒญ์ด ์ด๋ฃจ์ด์ก๋ค.
headers.setContentType(new MediaType("application", "json", StandardCharsets.UTF_8));
์ด๋ฒ ๋ฌธ์ ๋ฅผ ํตํด API ์์ฒญ์ ๋ณด๋ผ ๋ ์ธ์ฝ๋ฉ๊ณผ ํค๋ ์ค์ ์ ์ค์์ฑ์ ๊นจ๋ซ๊ฒ ๋์๋ค. ๋ํ, ๊ณต์๋ฌธ์๋ฅผ ์ฃผ์ ๊น๊ฒ ์ฝ๋ ๊ฒ์ ์ค์์ฑ๋ ๋ค์ ํ๋ฒ ์ธ์งํ๊ฒ ๋์๋ค.
-
์ถ๊ฐ ์๋ฌ ๋ฐ์
-
๋ ๋ฒ์งธ ๋ฌธ์ ์ : API ์์ฒญ๊ณผ ์๋ต์ด ์ ์์ ์ผ๋ก ์ด๋ฃจ์ด์ง๊ณ , ๊ธ์ , ๋ถ์ , ์ค๋ฆฝ ์๋ต๋ ์ ์์ ์ผ๋ก ๋ฐ์์ค๋ ์ํฉ์์, ์๋ต๋ฐ์ ํ์ด์ง์์ 'content'๋ฅผ ํ๋ฉด์ ํ์ํ ๋ '???' ํํ๋ก ํ์๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ ์์ธ ๋ถ์ ๊ฒฐ๊ณผ, ์๋น์ค ํ์ผ๊ณผ ์๋ต ํ์ ๋ฐ ์ธ์ฝ๋ฉ ํ์์ ๋ง์ถ๋ ๊ฒ์ด ์๋๋ผ, ํด๋ผ์ด์ธํธ ์ธก๊ณผ ๋ง์ถ์ด์ผ ํ๋ค. ๊ฐ์ ๋ถ์ API์ ๋ค๋ฅธ ์ค๋ฅ ํด๊ฒฐ์ ์ํด ์ฝ๋๋ฅผ ์์ ํ๋ ๊ณผ์ ์์ ์ด ๋ถ๋ถ์ ๋์น๊ฒ ๋ ๊ฒ์ผ๋ก ํ์ ๋์๋ค.
-
ํด๊ฒฐ๋ฐฉ๋ฒ : ์ปจํธ๋กค๋ฌ ๋งคํ์์ ๋ฐ์์ค๋ ํ์ ์ ํด๋ผ์ด์ธํธ ์ธก๊ณผ ๋ง์ถ์ด์ฃผ๋, 'content'๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
@GetMapping(value = "/analyze/{storeId}", produces = "application/json; charset=UTF-8")
์ด๋ฅผ ํตํด, ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ ๋ฐ์ดํฐ ๊ตํ ์ ๋ฐ์ดํฐ ํ์๊ณผ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ค์์ฑ์ ์ฌ์ธ์ํ๊ฒ ๋์๋ค. ๋ํ, API๋ฅผ ์ฌ์ฉํ๋ฉด์ ์๊ธฐ๋ ๋ค์ํ ๋ฌธ์ ์ ๋์ํ๊ธฐ ์ํด์๋ ๊น์ ์ดํด์ ์ ํํ ๋ฌธ์ ํ์ ๋ฅ๋ ฅ์ด ํ์ํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ค.
-