- ๋ง.JAVA ํ์ ๋ง์ง ํ๋ฐฉ์ ๋๊ตฌ๋ณด๋ค ์ง์ฌ์ธ ์ฌ๋๋ค์ด ๋ญ์น ํ์ ๋๋ค. ๐
- ํ์์ ๋ชจ๋๊ฐ ๊ฒช๊ณ ์๋ ๋ถ์ ํ ๊ด๊ณ , ๋ฏฟ์ ์ ์๋ ํ๊ธฐ ์์์ ์๋น์๋ค์ด ๋ฏฟ๊ณ ๋ฐฉ๋ฌธํ ์ ์๋ ๋ง์ง์ ๋ชจ์ ๋ณผ ์ ์๋ ์ฌ์ดํธ์ ํ์์ฑ์ ๋๊ผ์ต๋๋ค.
- ๊ทธ๋์, ์์์ฆ 2ํ ์ด์ ์ธ์ฆ๋ ๋ง์ง๋ง ๋ฑ๋ก๋๋๋ก ํด์ ์ ๋ขฐ๋ ๋ฐ ๋ง์กฑ๋๊ฐ ๋์ ๋ง์ง๋ง ์ ๋ณํ์ฌ ์๋น์์๊ฒ ์ ๊ณตํ๋ ๋ชฉ์ ์ผ๋ก ๊ฐ๋ฐ์ ์งํํ์ต๋๋ค.
- ๊ตญ๋ด ์ด์ ์ค์ธ ๋ง์ง ์ถ์ฒ ์ฌ์ดํธ, ๋ํ ํฌํธ ์ง๋ ์ฌ์ดํธ์ ์ฌ๋ก ๋ถ์์ ํตํด, ์น์ฌ์ดํธ ๊ธฐ๋ฅ์ ๋ฐฉํฅ์ฑ์ "์ง์ ์ฑ ์๋ ๋ง์ง ๊ณต์ "๋ก ์ด์ ์ ๋ง์ท์ต๋๋ค.
- ๋ง์ง์ ์ข์ํ๋ ์ฌ๋๋ค ๋ฟ๋ง ์๋๋ผ, ๋ง์ง์ ์ข์ํ๋ ์ฌ๋๋ค์ ๋ฐฉ๋ฌธ์ ์ํ๋ ์์์ ๊ณ ์ฌ์ฅ๋๋ค๋ ํ์ผํ ํ ์ฌ์ฅ๋ ์ ์ฉ ๊ตฌ๋ ์๋น์ค ๋ฐ ๋ ธ์ถ ๋ฐฐ๋ ๊ด๊ณ ๋ฅผ BM์ผ๋ก ์ค์ ํ์ต๋๋ค.
- Java 8
- Spring Framework 5.0.1, Spring MVC
- Junit5
- Maven
- Mybatis
- Eclipse, Visual Studio Code
- HTML
- CSS
- JavaScript
- JQuery 3.6.4
- BootStrap 4.1
- AWS EC2, S3, RDS, CloudFront, Route 53, ALB
- Tomcat 8.5
- MySQL 8.0.32
- Git, Sourcetree
- Slack
- Notion
-
- ๋ง์ง์ ๊ด์ฌ์ด ์๋ ์๋น์๊ฐ ์ด์ฉํ๋ ์ปค๋ฎค๋ํฐ๋ก, ๋ฆฌ๋ทฐ / ์ฌ์ง / ์ง์ ๊ฒ์ํ์ผ๋ก ๋๋์ด ์ ์ ์ฉ๋์ ๋ฐ๋ผ ์ธ๋ถ ๋ฉ๋ด ๋ถ๋ฅ
- ๊ฐ ๊ฒ์ํ๋ณ ๊ฒ์๋ฌผ CRUD ๊ธฐ๋ฅ ๋ฐ ๋๊ธ insert ๊ธฐ๋ฅ
- ๋ฆฌ๋ทฐ๊ฒ์ํ์ ์์์ฆ ๋ฑ๋ก ์ฌ๋ถ๋ฅผ ์ฒดํฌํ์ฌ ์์์ฆ ๋ฑ๋ก์ ํ ์ ์ ๋ง ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ธธ ์ ์๋๋ก ์ ์ฝ์ฌํญ์ ์ถ๊ฐํ์ฌ ๋ฆฌ๋ทฐ์ ์ ๋ขฐ๋๋ฅผ ๊ฐํํจ.
๐ ํต์ฌ ๊ธฐ๋ฅ ์ค๋ช
- ํ์ ์ปค๋ฎค๋ํฐ ๋ด ๋ฆฌ๋ทฐ ๊ฒ์ํ์ ์ ์ ๊ฐ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ๊ณ , ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ฆฌ๋ทฐ์ ๋๊ธ์ ๋จ๊ธธ ์ ์๋ ๊ตฌ์กฐ์ ๊ฒ์ํ ํ์ด์ง๋ก ๊ตฌํ.
- ๋ฆฌ๋ทฐ์ ์ ๋ขฐ๋๋ฅผ ๋์ด๊ธฐ ์ํด, ์ ์ ์ ์์์ฆ ๋ฑ๋ก ์ฌ๋ถ ํ๋จ์ด ํ์ํจ.
- ์์์ฆ์ ๋ค์์ ์๋น์ ๋ฑ๋กํ๊ณ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ ๋, ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ธฐ๊ณ ์ถ์ ์์์ฆ์ ์ ํํ๋ form์ผ๋ก ๋จผ์ ์ด๋์ด ํ์ํจ.
- ๋ฆฌ๋ทฐ๊ฒ์ํ (Review...) ๊ฒ์๋ฌผ ๋ฑ๋ก ๋ก์ง์ ์ฒ๋ฆฌํ๊ธฐ ์ํด registerAndSearch ํจํค์ง ์์ ์๋ MZRegisterInfoVO ์ RestaurantVO์ ์ฌ์ฉ์ด ํ์ํจ. ๋ model ๋ชจ๋ ๋ค๋ฅธ ํจํค์ง์ ์์ง๋ง, public ๋ฉ์๋๋ก ์์ฑ๋์ด์๊ธฐ ๋๋ฌธ์ board ํจํค์ง์ ๋์ผ model์ ๋ง๋ค์ง ์๊ณ MZRegisterReceiptDTO ๋ง ์์ฑํ์ฌ mzRegisterInfoVO์ restaurantVO๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํจ.
- ReviewMapper.xml์์ mzregisterinfo ์ restaurant ํ ์ด๋ธ์ join ํด์ ์์์ฆ ์ ๋ณด์ ์๋น ์ ๋ณด๋ฅผ ์ถ์ถํ๋ getReceiptWithRestaurant ์ฟผ๋ฆฌ ์์ฑ. (mzregisterinfo ํ ์ด๋ธ์ storePhoneNumber ์ปฌ๋ผ ๋ฐ์ดํฐ์ restaurant ํ ์ด๋ธ์ tel ์ปฌ๋ผ ๋ฐ์ดํฐ๊ฐ ์ผ์นํ๋ restaurant ํ ์ด๋ธ์ name ์ปฌ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ํธ๋ช ์ผ๋ก ์ถ์ถ)
- ์์์ฆ 1์ฅ์ผ๋ก ๋ฆฌ๋ทฐ๋ฅผ ๋คํ ์์ฑ์ ๋ง๊ธฐ ์ํด cs_review ํ ์ด๋ธ์ receipt_id ์ปฌ๋ผ (mzregisterinfo์ no ์ปฌ๋ผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ ์ฅ) ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ๊ณ ์์์ฆ ์ ๋ณด์ ์๋น ์ ๋ณด๋ฅผ ์ถ์ถ.
- โผ๊ฒฐ๊ณผโผ writeReview๋ก ์ด๋ํ๋ฉด getReceiptWithRestaurant ์ฟผ๋ฆฌ๋ฅผ ์ํํ์ฌ ์์์ฆ์ ์ํธ๋ช + ์ฃผ์ ๊ฐ radio form์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์ถ๋ ฅ, ์ ์ ๊ฐ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ ์์์ฆ์ ์ ํํ๊ณ ๋ฆฌ๋ทฐ ์์ฑ form์ผ๋ก ์ด๋ํ๋๋ก ๊ตฌํ. (์์์ฆ์ ๋ฑ๋กํ์ง ์์ ์ ์ ๊ฐ writeReview ์ผ๋ก ์ด๋ํ๋ฉด alert ์ฐฝ์ ๋ณด์ฌ์ฃผ๊ณ ๋ฆฌ๋ทฐ๊ฒ์ํ์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ๋จ.)
- ์ ์ ๊ฐ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑ ํ ์ ์ถํ๊ธฐ ์ ์, ์ด๋ชจํฐ์ฝ ์กฐํ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์๋น ๋ฐฉ๋ฌธ ์ ์ฐธ๊ณ ํ ์ ์๋ ์ฃผ์ ํค์๋ (ex. ์ฃผ์ฐจ, ๋ง, ์ฒญ๊ฒฐ, ๊ฐ์ฑ๋น ๋ฑ) ๋ฅผ ๊ฒ์ํด์ ์ด๋ชจํฐ์ฝ์ ์ถ๋ ฅํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋ฆฌ๋ทฐ ์์ฑ form ์ ์ถ๊ฐ.
- ๊ธฐ์กด์๋ ๋ค์ด๋ฒ Sentiment API๋ฅผ ํ์ฉํ๋ ค๊ณ ํ์ผ๋, ๊ธ์ /๋ถ์ ํํธ๋ฅผ ํผ์ผํธ๋ก ํ๋จํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ผ ๋ค์ํ ํค์๋๋ฅผ ๊ฒ์ ํ ์ถ๋ ฅ์ด ํ์ํ ์ง๊ธ ์ํฉ์๋ API๊ฐ ์ฝ๊ฐ ๋ง์ง ์๋ค๊ณ ํ๋จํ์ฌ MySQL์ ํค์๋์ ์ด๋ชจํฐ์ฝ์ ์ ์ฅํ emojiMap ํ ์ด๋ธ์ DB์ ์์ฑํ์ฌ ํค์๋๋ฅผ ์ ์ฅํ๋ ์์ ์ ์งํ. (ํํ์ ๋ถ๋ฆฌ๊ฐ ํ์ํ์ง๋ง ์ผ๋จ ํ ์คํธ)
- ReviewMapper.xml ์ ์ถ๊ฐํ๋ ์ฟผ๋ฆฌ๋ฌธ์์๋ emojiMap ๋ฐ์ดํฐ ์ ์ฒด SELECT ์ฟผ๋ฆฌ , Service ๊ณ์ธต์์ ๋ฆฌ๋ทฐ ๋ณธ๋ฌธ๊ณผ emojiMap ํ ์ด๋ธ์ keyward ์ปฌ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํด์ ์ผ์นํ๋ emoji ์ปฌ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ ํ ๋ชจ๋ธ์ ์ ์ฅํ๋ ์์ ์ ์ํ.
- โผ๊ฒฐ๊ณผโผ ๋ฆฌ๋ทฐ ์์ฑ form (insertReview) ์์ ๋ฆฌ๋ทฐ ๋ณธ๋ฌธ์ ๋ชจ๋ ์ ๋ ฅ ํ๊ณ , ์ด๋ชจํฐ์ฝ ์กฐํ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ajax๋ก ๋ฆฌ๋ทฐ ํ๋จ div์ ์ถ์ถ๋ ์ด๋ชจํฐ์ฝ์ด ์ถ๋ ฅ๋๋ ๋ฐฉ์์ผ๋ก ๋น๋๊ธฐ์ฒ๋ฆฌ ์ด๋ชจํฐ์ฝ ์กฐํ ๊ธฐ๋ฅ์ ๊ตฌํ.
- ์ ์ ๊ฐ ์ํฉ์ ๋ง๊ฒ ์ด์ฉํ ์ ์๋๋ก ๊ฒ์ํ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ถํ , ๊ฐ ๊ฒ์ํ๋ณ CRUD ๊ธฐ๋ฅ ์ถ๊ฐ. ๊ฒ์๋ฌผ insert ๊ธฐ๋ฅ์ ํ์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์์ฑ ๋ฒํผ์ user_id ์ธ์ ์ด ์กํ์๋ ๊ฒฝ์ฐ์๋ง ๋ธ๋ผ์ฐ์ ์ ์ถ๋ ฅ๋๋๋ก ์ฝ๋ ์์ฑ, ๋ค๋น๊ฒ์ด์ ๋ฐ๋ฅผ ํตํด ๋ก๊ทธ์์ํ๊ณ ๋ธ๋ผ์ฐ์ ๋ค๋ก๊ฐ๊ธฐ๋ก ๊ฒ์๋ฌผ ์์ฑ ํ์ด์ง์ ์ ๊ทผํ์ ๋ alert ์ฐฝ ์ถ๋ ฅ ํ ๊ฒ์๋ฌผ ๋ชฉ๋ก ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ ๋ ์ ์๋๋ก ์์ธ์ฒ๋ฆฌ ์งํ.
- ์๋์ ์ผ๋ก ๊ธฐ๋ฅ์ด ๊ฐ๋จํ ์์ ๊ฒ์ํ์ Service ๊ณ์ธต์ ๋๋์ง ์์๊ณ , ์์ ๊ฒ์ํ ๊ธฐ๋ฅ ๊ตฌํ ์๋ฃ ํ ๋ฆฌ๋ทฐ๊ฒ์ํ๊ณผ ์ฌ์ง๊ฒ์ํ์ Service ๊ณ์ธต์ ๋๋์ด ๊ธฐ๋ฅ ์ถ๊ฐ.
- ๊ฒ์ํ๋ณ ์ ๋ชฉ search form ์ถ๊ฐํ์ฌ ํน์ ํค์๋๋ฅผ ๊ฒ์ํ ์ ์ ๋ชฉ์ ํด๋น ํค์๋๊ฐ ํฌํจ๋์ด ์๋ ๊ฒ์๋ฌผ list๋ฅผ ajax ๋น๋๊ธฐ์ฒ๋ฆฌ๋ก ๋ธ๋ผ์ฐ์ ์ ์ถ๋ ฅ.
- ๊ฒ์ํ์ ํ์ํ ์กฐํ์ ์ฆ๊ฐ / ๋๊ธ ์์ฑ ๊ธฐ๋ฅ ๊ฐ ์ธ๋ถ ์นดํ ๊ณ ๋ฆฌ ๊ฒ์ํ์ ์ถ๊ฐ.
- ๊ฒ์๋ฌผ insert ๊ธฐ๋ฅ์ ํ์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ์ธ์
- โผ๊ฒฐ๊ณผโผ ๊ฐ ์ธ๋ถ ์นดํ ๊ณ ๋ฆฌ ๊ฒ์ํ์ ๊ธฐ๋ณธ CRUD, ๋๊ธ insert ๊ธฐ๋ฅ์ ๊ตฌํ ์๋ฃ.
โฝ ํธ๋ฌ๋ธ ์ํ
- ๋ฆฌ๋ทฐ ๋ฑ๋ก ์, ๋จผ์ ์์์ฆ ๋ฑ๋ก ์ ๋ณด๋ฅผ writeReview.jsp ๋ก ํ์ด์ง ์ด๋ํ์ฌ ์ถ๋ ฅํด์ผ๋๋๋ฐ, receiptList (์์์ฆ์ ๋ฆฌ์คํธ) ์ ๋ชจ๋ ์์๊ฐ null๋ก ์ถ๋ ฅ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํจ. ๋๋ฒ๊น ํ๋๋ receiptList์ size (๋ฆฌ๋ทฐํ ์์์ฆ์ ๊ฐฏ์) ๋ ์ ์์ ์ผ๋ก ์ฝ์์ฐฝ์ ์ถ๋ ฅ๋๊ณ ์์.
๐ ๋ฌธ์ ๊ฐ ์๋ ์ฟผ๋ฆฌ ํ์ธ
<!-- ์์์ฆ ๋ฑ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค์ -->
<select id="getReceiptWithRestaurant" parameterType="String" resultType="MZRegisterReceiptDTO">
SELECT r.*, m.*
FROM mzRegisterInfo m
JOIN restaurant r ON m.storePhoneNumber = r.tel
WHERE m.userID = #{user_id}
AND m.no NOT IN
(SELECT receipt_id FROM MAT_ZIP.cs_review)
</select>- 1๏ธโฃ ์ฒซ ๋ฒ์งธ ์๋ : ์ฟผ๋ฆฌ ์์ฑ์์ ์คํ๋ ์๋ชป ์์ฑ๋ ๋ถ๋ถ์ด ์์ ์๋ ์์ด์, getReceiptWithRestaurant ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋๋ก MySQL ์คํฌ๋ฆฝํธ์์ ์คํํจ. -> ์ฟผ๋ฆฌ์ ๋ฌธ์ ์์. ์ ์์ ์ผ๋ก mzregisterinfo ํ ์ด๋ธ๊ณผ restaurant ํ ์ด๋ธ์ join ํ๊ณ , ๋๋ฏธ๋ฐ์ดํฐ๋ก ์ถ๊ฐํด๋ cs_review ํ ์ด๋ธ์ receipt_id๋ ์ ์์ ์ผ๋ก ์ ์ธํ์ฌ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํ ๋ฐ์ดํฐ๋ง select ํ๋ ๊ฒ์ ํ์ธ.
- 2๏ธโฃ ๋ ๋ฒ์งธ ์๋ : MZRegisterReceiptDTO ์ ์ถ๊ฐํ MZRegisterInfoVO์ RestaurantVO์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ๋งคํ๋์ง ๋ชปํ์ ์๋ ์์. -> ReviewMapper.xml ์ ์ถ๊ฐํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ๊ฐ ์ด์ด MZRegisterInfoVO์ RestaurantVO์ ํ๋์ ์ผ์นํ๋ ๊ฒ์ ํ์ธํจ.
- 3๏ธโฃ ์ธ ๋ฒ์งธ ์๋ : MZRegisterReceiptDTO ํด๋์ค์ toString() ๋ฉ์๋๊ฐ MZRegisterInfoVO์ RestaurantVO์ toString() ๋ฉ์๋๋ฅผ ํธ์ถํ๋์ง ํ์ธ -> MZRegisterReceiptDTO, MZRegisterInfoVO, RestaurantVO ํด๋์ค์ toString() ๋ฉ์๋๋ ๋ฑํ ๋ฌธ์ ์์ด ์ ์์ฑ๋์์์ ํ์ธํจ.
- โผ์์ธโผ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋งคํ ๋ฌธ์ ์์ ํ์ธํจ.
-
4๏ธโฃ ๋ค ๋ฒ์งธ ์๋ : ๋ ์ ํํ ๋งคํ์ ์ํด MyBatis์ resultMap์ ์ด์ฉํด์ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ MZRegisterReceiptDTO ๊ฐ์ฒด์ ๋งคํ ์๋
- ์ด์ ์ฟผ๋ฆฌ๋ฌธ์์๋ resultType="MZRegisterReceiptDTO" ์ ํตํด DTO์ ๋งคํ์ ํ์ง๋ง, MyBatis์ resultMap์ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋๋ฉ์ธ ๋ชจ๋ธ ๋๋ DTO ๊ฐ์ฒด์ ๋งคํํ๋ ์ญํ ์ ํ๋ค๊ณ ํจ.
- MyBatis์ resultMap์ ์ผ๋ฐ์ ์ธ resultType ๋งคํ๋ณด๋ค ๋ ์ธ๋ฐํ๊ฒ ์ปจํธ๋กค ํ ์ ์๋๋ฐ, ๋์ฒ๋ผ ์ฟผ๋ฆฌ๊ฐ DB์์๋ ์ ์๋ํ๋๋ก ์์ฑํ๋๋ฐ๋ ๋งคํ์ ํ์ง ๋ชปํด ์๋ฌ๊ฐ ๋ฐ์ํ ๋๋ resultMap์ผ๋ก ์ธ๋ฐํ๊ฒ ๋งคํ์ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ํ์ฌ ์ ์ฉํด๋ณด๊ธฐ๋ก ํจ.
<!-- resultMap ๋งคํ ์์ ์ฟผ๋ฆฌ --> <resultMap id="yourResultMap" type="com.yourpackage.YourDTO"> <result property="propertyOfYourDTO" column="columnOfYourSQLResult"/> <!-- more result mappings... --> </resultMap>
- ๋๋ ํญ์ resultType์ผ๋ก ๋๋ฉ์ธ ๋ชจ๋ธ (VO) ์ ๋งคํ์ ํ๋๋ฐ, ์ด๋ฒ์ resultMap์ ๋ํด์ ์๊ฒ ๋จ. ๋ณดํต resultMap์ ์ด๋ฐ ๊ตฌ์กฐ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์์. ์ฌ๊ธฐ์ id๋ resultMap์ ๊ณ ์ ์๋ณ์, type์ ๊ฒฐ๊ณผ๋ฅผ ๋งคํํ DTO์ ํ ํด๋์ค ์ด๋ฆ์ด๊ณ , result ์์๋ SQL ๊ฒฐ๊ณผ์ ์ด(column)๊ณผ DTO์ ์์ฑ(property)์ ๋งคํํจ.
- ๋จ์ํ DTO์ ์์ฑ ์ด๋ฆ์ด SQL ๊ฒฐ๊ณผ์ ์ด ์ด๋ฆ๊ณผ ์ ํํ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ๋๋ ๋ณต์กํ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง DTO์ ๊ฒฐ๊ณผ๋ฅผ ๋งคํํด์ผ ํ๋ ๊ฒฝ์ฐ์ resultMap์ ์ฌ์ฉํ๋ฉด ์ ์ฉํ๋ค๊ณ ํจ. ๋ ๋ค์ ๋ณต์กํ DTO (๋ชจ๋ธ 2๊ฐ๋ฅผ ํฉ์ณ์ DTO๋ฅผ ๋ง๋ค์์) ๋ฅผ ์ฌ์ฉํ๊ธฐ๋๋ฌธ์ ํ์์ธ ๊ฒ์ผ๋ก ์ถ์ .
-
โผ๊ฒฐ๊ณผโผ MyBatis์ resultMap์ผ๋ก ์ฟผ๋ฆฌ ๋งคํ์ ์ฑ๊ณตํจ! DTO์ ์ฃผ์ ํ๋ mzRegisterInfoVO ์ restaurantVO ์ ํ๋๋ฅผ mzregisterinfo ํ ์ด๋ธ๊ณผ restaurant ํ ์ด๋ธ์ ์ปฌ๋ผ์ ํ๋ํ๋ ์๋ ๋งคํํด์ค. ์๋ ๋งคํ ํ ์ฟผ๋ฆฌ๋ฅผ ์ข ๋ ์์ธํ๊ฒ ์์ฑํ์ฌ ๋ฆฌ๋ทฐ ์์ฑ ์ ์์์ฆ list๋ฅผ ์ถ๋ ฅํ๋์ง ํ ์คํธํ ๊ฒฐ๊ณผ, ์ํ๋๋๋ก ์ํธ๋ช ๊ณผ ์ฃผ์ ์ ๋ณด๊ฐ ์ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํจ.
๐ ์์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ฟผ๋ฆฌ ํ์ธ
<!-- ์์์ฆ ๋ฑ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค์ -->
<resultMap id="MZRegisterReceiptDTOMap" type="com.mat.zip.board.MZRegisterReceiptDTO">
<association property="mzRegisterInfoVO" javaType="com.mat.zip.registerAndSearch.model.MZRegisterInfoVO">
<result property="no" column="m_no" />
<result property="userId" column="m_userId" />
<result property="storeAddress" column="m_storeAddress" />
<result property="storePhoneNumber" column="m_storePhoneNumber" />
<result property="buyTime" column="m_buyTime" />
</association>
<association property="restaurantVO" javaType="com.mat.zip.registerAndSearch.model.RestaurantVO">
<result property="no" column="r_no" />
<result property="landNumAddress" column="r_landNumAddress" />
<result property="roadNameAddress" column="r_roadNameAddress" />
<result property="name" column="r_name" />
<result property="status" column="r_status" />
<result property="tel" column="r_tel" />
<result property="food" column="r_food" />
</association>
</resultMap>
<select id="getReceiptWithRestaurant" parameterType="String" resultMap="MZRegisterReceiptDTOMap">
SELECT r.no as r_no, r.landNumAddress as r_landNumAddress, r.roadNameAddress as r_roadNameAddress,
r.name as r_name, r.status as r_status, r.tel as r_tel, r.food as r_food,
m.no as m_no, m.userId as m_userId, m.storeAddress as m_storeAddress,
m.storePhoneNumber as m_storePhoneNumber, m.buyTime as m_buyTime
FROM mzRegisterInfo m
JOIN restaurant r ON m.storePhoneNumber = r.tel
WHERE m.userID = #{user_id}
AND m.no NOT IN
(SELECT receipt_id FROM cs_review)
</select>- โผํด์โผ MZRegisterInfoVO์ RestaurantVO์ ๊ฐ ํ๋์ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ด์ ๋งคํํ๊ธฐ ์ํด resultMap์ ์ฌ์ฉํจ. resultMap ๋ด์์ association ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณตํฉ DTO ๋ด์ ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌ ์งํํ๊ณ , ๋ํ SQL ์ฟผ๋ฆฌ์์๋ ๊ฐ ํ๋์ ๋ณ์นญ(alias)์ ์ฌ์ฉํ์ฌ resultMap์์ ์ฐธ์กฐํ ์ ์๋๋ก ํ๊ณ , ๋ณ์นญ์ ์ฌ์ฉํ์ฌ SQL ๊ฒฐ๊ณผ์ ์ด๊ณผ DTO์ ์์ฑ์ ์ฐ๊ฒฐํจ
- ๐ก ์ถ๊ฐ โบ ์ ๋ฐ์ดํธํ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ฉด, cs_review (๋ฆฌ๋ทฐ๊ฒ์๊ธ ์ ์ฅ ํ ์ด๋ธ) ์ IN ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, IN ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ถํ์ ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๋ ๊ฒฝ์ฐ์ ์ฑ๋ฅ ์ด์๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค๋ ๋ฌธ์ ์ ์ด ์๋ ์ฟผ๋ฆฌ์. ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์์๊ฑฐ๋ฉด ๋ญ ๊ณ ์น์ง ์์๋ ์๊ด์ ์์ง๋ง, ์ฟผ๋ฆฌ ์ฑ๋ฅ ํฅ์์ ์ํด JOIN ์ ์ ํ๋ ๋ ์ฌ์ฉํด์ ์ฟผ๋ฆฌ ์ ๋ฐ์ดํธ๋ฅผ ์งํํจ.
๐ ์ฑ๋ฅ์ ์ ๋ฐ์ดํธํ ์ฟผ๋ฆฌ ํ์ธ
<!-- ์์์ฆ ๋ฑ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค์ -->
<resultMap id="MZRegisterReceiptDTOMap" type="com.mat.zip.board.MZRegisterReceiptDTO">
<association property="mzRegisterInfoVO" javaType="com.mat.zip.registerAndSearch.model.MZRegisterInfoVO">
<result property="no" column="m_no" />
<result property="userId" column="m_userId" />
<result property="storeAddress" column="m_storeAddress" />
<result property="storePhoneNumber" column="m_storePhoneNumber" />
<result property="buyTime" column="m_buyTime" />
</association>
<association property="restaurantVO" javaType="com.mat.zip.registerAndSearch.model.RestaurantVO">
<result property="no" column="r_no" />
<result property="landNumAddress" column="r_landNumAddress" />
<result property="roadNameAddress" column="r_roadNameAddress" />
<result property="name" column="r_name" />
<result property="status" column="r_status" />
<result property="tel" column="r_tel" />
<result property="food" column="r_food" />
</association>
</resultMap>
<select id="getReceiptWithRestaurant" parameterType="String" resultMap="MZRegisterReceiptDTOMap">
SELECT
r.no as r_no, r.landNumAddress as r_landNumAddress,
r.roadNameAddress as r_roadNameAddress, r.name as r_name,
r.status as r_status, r.tel as r_tel, r.food as r_food,
m.no as m_no, m.userId as m_userId, m.storeAddress as m_storeAddress,
m.storePhoneNumber as m_storePhoneNumber, m.buyTime as m_buyTime
FROM
mzRegisterInfo m
JOIN
restaurant r ON m.storePhoneNumber = r.tel
LEFT JOIN
cs_review cr ON m.no = cr.receipt_id
WHERE
m.userID = #{user_id}
AND cr.receipt_id IS NULL;
</select>-
โผํด์โผ MZRegisterInfoVO์ RestaurantVO์ ๊ฐ ํ๋์ SQL ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ด์ ๋งคํํ๊ธฐ ์ํด resultMap์ ์ฌ์ฉํ ๊ฒ์ ๋์ผํจ. ์์์ฆ๋ณ 1๊ฐ์ ๋ฆฌ๋ทฐ๋ง ์์ฑ ํ๊ธฐ ์ํด (์ค๋ณต๋ฆฌ๋ทฐ, ๋๋ฐฐ๋ฆฌ๋ทฐ ๋ฐฉ์ง) ์ฌ์ฉํ๋ cs_review ํ ์ด๋ธ์ IN ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์จ ๊ฒ์ LEFT JOIN ํ์ฌ, m.no์ cr.receipt_id๊ฐ ์ผ์นํ๋ ํญ๋ชฉ์ ์ฐพ๋ ์ฟผ๋ฆฌ์. ๊ทธ๋ฐ ๋ค์ cr.receipt_id๊ฐ NULL์ธ ํญ๋ชฉ, ์ฆ cs_review ํ ์ด๋ธ์ ํด๋น ์์์ฆ์ด ์๋ ํญ๋ชฉ๋ง์ ์ ํํฉ๋๋ค. ๊ฒฐ๋ก ์ ์ด์ ์ฟผ๋ฆฌ๋ ์คํ์ํค๋ ๊ธฐ๋ฅ์ ๋๊ฐ๊ณ , ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์ํฉ์์ ์ข ๋ ํจ์จ์ ์ธ ์ฑ๋ฅ์ ๋ฐํ์ํค๊ธฐ ์ํด IN ์๋ธ์ฟผ๋ฆฌ ์ฌ์ฉ ๋ถ๋ถ์ JOIN์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํจ.
-
โผ๊ฒฐ๋ก โผ ๋ณดํต์ resultType ์ ์ด์ฉํ๋ฉด ์ ์์ ์ผ๋ก ๋ชจ๋ธ๊ณผ ๋งคํํ ์ ์์ง๋ง, ๋๊ฐ ์ด์ ๋ชจ๋ธ์ด๋ ๋ค์ ๋ณต์กํ DTO์ ๋งคํ์ ์งํํ ๋๋ resultMap์ผ๋ก ์ธ๋ฐํ ์ปจํธ๋กค์ ํ์! ๋ผ๋ ๊ฒ์ ํ์ต.
