๐งญ ๋ชฉ์ฐจ
- ๊ฐ์
- ์ธ์ด / ๊ธฐ์
- ์ญํ
- ๊ฒฐ๊ณผ๋ฌผ
- ERD
- Diagram
- Pain Point
- Retrospective ํ๊ณ
- โ 1st Refactoring : ๋ฆฌํฉํ ๋ง๊ณผ ๊ณ ๋ฏผ์ ๊ณผ์
- โ 2nd Refactoring : ๊ฒฐ์ ์ฃผ๋ฌธ ๋ํ ์ผ ์์ฑ
- โ 3rd Refactoring : ์คํ๋ง ์ํ๋ฆฌํฐ ๋์
- MoneyBug๋ ์์
์์ ์ ํํ๋
๊ฑฐ์ง๋ฐฉ
์ ์๊ฐ์ ๋ฐ์ ๋ง๋ค์ด์ง ์ปค๋ฎค๋ํฐํ ๊ฐ๊ณ๋ถ ์น์ฌ์ดํธ์ ๋๋ค. - ์ ์ ์ ์์ ๊ณผ ์ง์ถ์ ์ ๋ ฅํ๋ ๊ฐ๊ณ๋ถ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ค์ฌ์ผ๋ก
- ์ ๋ ดํ ๋๋ ํ ์ธ์ ํ๊ณผ ์ด๋ฒคํธ ์ ํ์ ํ๋งคํ์ฌ ์์ต์ฑ์ ๋๋ชจํ์์ต๋๋ค.
- ์๋ก์ ์ง์ถ ๋ด์ฉ์ ๋ํด ํจ๊ป ๊ณ ๋ฏผํ๊ณ , ๊ณต์ ํ๋ฉฐ ๊ฒ์๊ธ์ ์์ฑํ ์ ์์ต๋๋ค.
- 13ํ์ฐจ Java ๋ถํธ์บ ํ ํ์ด๋ ์ต์ฐ์์์ ์์ํ์์ต๋๋ค.
- ์ด ๋ ํฌ์งํ ๋ฆฌ๋
ํํ๋ก์ ํธ
์๋ฃ ํ ํ์ ๋ฏผ์ง์ค์ด ๊ฐ์ธ์ ์ผ๋ก ๋ฆฌํฉํ ๋งํ ๋ด์ฉ์ด ๋ด๊ฒจ์์ต๋๋ค.
ํผ์ณ์ ํ์ธ (๐ Click)
- Java 8
- Spring Framework 5.0.1, Spring MVC
- Spring Security 5
- Maven
- Mybatis
- Eclipse, Visual Studio Code, DBeaver
- HTML
- CSS
- JavaScript
- JQuery 3.7.0
- BootStrap 4.5.3
- AWS EC2, S3, RDS
- Tomcat 9.0
- MySQL 8.0
- Git, Sourcetree
- Slack
- Notion
- Loop
- Naver, Kakao, Google Social Login
- OpenAI
- Clova OCR
- I'mport
- Google chart API
ํผ์ณ์ ํ์ธ (๐ Click)
-
- ๋ค์ด๋ฒ, ๊ตฌ๊ธ ์์ ๋ก๊ทธ์ธ
- ์ํ ์ผํ๋ชฐ ๊ฒ์ํ CRUD
- ์ผํ๋ชฐ ๊ด๋ฆฌ์ํ์ด์ง
- ์ํ ๊ฒฐ์ (์์ํฌํธ)
- Frontend UI ๊ตฌํ
-
- ์ปค๋ฎค๋ํฐ ๊ฒ์ํ CRUD
- ๋๊ธ, ๋๋๊ธ CRUD
- ๊ฒ์๊ธ ๊ฒ์๊ธฐ๋ฅ, ํ์ด์ง๋ค์ด์
-
- ์๊ฐ ์์ฐ๊ณผ ๊ณ ์ ์ง์ถ ์ค์
- ์๋จ์ ์ฌ์ฉํ ๋ด์ญ ํ์ ๋ณด๊ณ ์ ์ฐ์ถ
- ๋ณด๊ณ ์ ํ์ผ ๋ค์ด๋ก๋, ์ด๋ฉ์ผ ์ ์ก
-
- ์์์ฆ OCR
- ์ค์๊ฐ ์ฑํ
- ์ฑ๋ด, ๋งํฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-
- ์นด์นด์ค ์์ ๋ก๊ทธ์ธ, ๋ง์ดํ์ด์ง
- ์ผํ๋ชฐ ์ฅ๋ฐ๊ตฌ๋
- ์ํ๊ด๋ฆฌ์ ๋ฐฐ์ก๊ด๋ฆฌ
-
- ์๊ฐ ์์ฐ๊ณผ ๊ณ ์ ์ง์ถ ์ค์
- ์๋จ์ ์ฌ์ฉํ ๋ด์ญ ํ์ ๋ณด๊ณ ์ ์ฐ์ถ
- ๋ณด๊ณ ์ ํ์ผ ๋ค์ด๋ก๋, ์ด๋ฉ์ผ ์ ์ก
๋ก๊ทธ์ธ, ๋ง์ดํ์ด์ง |
---|
๊ตฟ์ฆ ์ผํ๋ชฐ |
์ปค๋ฎค๋ํฐ ๊ฒ์ํ |
๊ฐ๊ณ๋ถ |
๊ฒฐ์ |
๊ด๋ฆฌ์ ํ์ด์ง |
์์ ๋ก๊ทธ์ธ ๋ฃจํธ ํต์ผํ์ฌ ๋ค์ํ API ๋ฐ๊ธฐ
์ด๋ฒ ํ๋ก์ ํธ์์๋ ์๋ ๋จ์ผ ์์
๋ก๊ทธ์ธ๋ง ๊ธฐํํ์์ต๋๋ค.
๊ทธ๋ฌ๋ค ๋ชจ๋ ๋ก๊ทธ์ธ ๋ฃจํธ๋ฅผ ํต์ผํ๊ณ ๊ณผ์ ์ ์ผ์ํํ์ฌ 3๊ฐ์ง ์์
๋ก๊ทธ์ธ API๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๊ณ ,
ํธ๋ฆฌ์ฑ์ ๋๋ชจํ ์ ์์์ต๋๋ค.
๋ค์ด๋ฒ, ์นด์นด์ค์ ๊ฒฝ์ฐ ์ฝ๋ฐฑํ์ด์ง๋ฅผ ๊ตฌ์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ต๋๋ค.
๊ตฌ๊ธ ๋ก๊ทธ์ธ์ ๊ฒฝ์ฐ JWT๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ์์ต๋๋ค.
๊ฐ API์ ์์ฒดํจ์๋ค์ ์๋ก ๋ณ์๋ช
๋ ๋ค๋ฅด๊ณ , ์ค๋ น ๊ฐ์ ๋ณ์๋ช
์ด์ด๋ ์๋ฏธ๊ฐ ๋ฌ๋์ต๋๋ค.
๋จผ์ ๋ก๊ทธ์ธ์ ํ์ํ ๊ฐ๊ฐ์ ๋ณ์๋ฅผ ์ฐพ์ ์ 3์ ๊ฐ์ฒด๋ก ์นํํ์๊ณ ,
๊ทธ ๊ณผ์ ์ AJAX
๋ฅผ ํตํด ๋์ผํ ๋ฉ์๋๋ก ์ ๋ํ์์ต๋๋ค.
์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋ฌด์ํ ๋ง์ ๋ค์ํ ์์
๋ก๊ทธ์ธ API๋ฅผ ์ถ๊ฐํ ์ ์์ ๊ฒ์
๋๋ค.
๋ณ๋์ ์์ฒด ํ์DB๋ฅผ ์ด์ํ์ง ์๊ธฐ ๋๋ฌธ์ Social ID (JWT) ๊ฐ์ ์ธ์
์ผ๋ก ์ค์ ํ์์ต๋๋ค.
์ฒซ ๋ก๊ทธ์ธ์, ์ค๋ณต์ ๊ฒ์ํ์ฌ ์ฒซ๋ฐฉ๋ฌธ์ ํฌ์ธํธ 1,000์ + ํ์ ๋๋ค์ ์ค์ ์ผ๋ก ์ก์์ต๋๋ค.
ํ์์ธ ์ ๋ฏผ์ง์ค๋ง์ ๊ฐ์ธ์ ์ธ ์๊ฒฌ์ ๋ด์์ต๋๋ค.
ํผ์ณ์ ํ์ธ (๐ Click)
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ํ๋์ ์๋น์ค, ์น์ฌ์ดํธ๊ฐ ๋ง๋ค์ด์ง๊ธฐ๊น์ง ์๋ง์ ์ฌ๋๋ค์ ๊ณ ๋ฏผ์ด ์์ฌ์ผํ๋ค๋ ๊ฒ์ ์๊ฒ๋์์ต๋๋ค. ๊ทธ๋งํผ ์ด ๋ชจ๋ ํ์๋ค์ ์์ด๋์ด๊ฐ ๋ชจ์ฌ ์์ ํ ์๋ก์ด ๊ฒฝ์ฐ์ ์๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์์ต๋๋ค. ์ ๊ฐ๋ฐ์๋ก ํ์ฌ๊ธ ์ปค๋ฎค๋์ผ์ด์ ์ด ๊ทธํ ๋ก ์ค์ํ ์ญ๋์ด๋ผ๊ณ ํ๋ ๊ฒ์ธ์ง ์๊ฒ๋๋ ์๊ฐ์ด์์ต๋๋ค.
๊ธฐ์ ๋ ๊ธฐ์ ์ด์ง๋ง, ์ด๋ค ๊ธฐ์ ์ ์ด๋ค ์ง์ ์์ ์ด๋ป๊ฒ ๋์ ํ๊ณ ์ปค์คํฐ๋ง์ด์งํ๋ ๊ฒ์ธ์ง๋ ์์ ํ ๊ฐ๋ฐ์์ ์ญ๋๊ณผ ์๊ฐ์ ๋ฐ๋ฅธ ๊ฒ์ ๋๋ค. ์ด ์ธ์์ ์์ ํ ๋๊ฐ์ ์๋น์ค๋ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ์ด์ฉํ๋ ์ฌ๋๋ค๊ณผ ๊ทธ๊ฒ์ ์๋ขฐํ๊ณ ๋ง๋ ์ฌ๋๋ค, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์๋น์ค์ ์๊ฐ์ ์ฐจ์์ด ์์ ํ ๋์ผํ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๋ ์ ์ฐํด์ผํ ๊ฒ์ ๋๋ค. ๋ชจ๋ ์ํฉ๊ณผ ์กฐ๊ฑด์ ๋ฅ๋์ ์ผ๋ก ๋์ฒํ๊ณ ๋์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฅ๋ ฅ์ ๊ฐ์ ธ์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๊ฐ๊ณ๋ถ ์ปค๋ฎค๋ํฐ๋ ์ฌ์ค ์์ฆ ์ ํํ๋ '๊ฑฐ์ง๋ฐฉ' ์ปค๋ฎค๋ํฐ์์ ์ฐฉ์ํ์ฌ ๋ง๋ค์ด์ง ์ ๋จธ๋ฌ์คํ๊ณ ์ฌ๋ฏธ๋ ์๋น์ค์
๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋๊ตฌ๋ณด๋ค ์ ์ ์ ์ฐธ์ฌ๊ฐ ๋๋ฒ๋ ์น๊ตฌ๋ค
์ฌ์ดํธ๋ฅผ ๋์ฑ '๋๋ฒ๋ '๋ต๊ฒ ๋ง๋ค์ด์ค๋๋ค. ํ์ง๋ง ๊ทธ ํต์ฌ ํฌ๋ฌ์ปจํ
์ธ ๊ฐ ๋ ์ ์๋ ์ด๊น?๋ง๊น?
๊ฒ์ํ์ด ํด๋น ๊ฒ์ํ์ ๋ด๋นํ๋ ๋ฉค๋ฒ์ ์ดํ๋ก ์ธํด ์์ฑ๋์ง ๋ชปํ์ต๋๋ค. ์ค๋ ์ดํ๋ก ์ธํด ์ต์ข
ํํ๋ก์ ํธ์์ ์ ์ธํ๊ฒ ๋์๊ณ ์ด๋ ์๋นํ ์์ฌ์ด ๊ฒฐ๊ณผ๊ฐ ๋์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ชจ๋ ํ๋์ ํ๋ก์ ํธ๋ฅผ ํฅํด ๋ฌ๋ ค๊ฐ๋ ๋ฐ์ ์์ด์์ ์ ์ ๋ ๋ง๊ฐ์ ์งํค๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ ์ธ ๋ชฉํ๊ฐ ๋์ด์ผํ ๊ฒ์ ๋๋ค. ํ๋ก์ ํธ ์ดํ ์๊ฐ์ด ํ๋ฝํ๋ ํ ํด๋น ๊ฒ์ํ์ ์ ๊ฐ ์ค์ค๋ก ๋ง๋ค์ด๋ด์ผ๊ฒ ๋ค๋ ๊ณํ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ ๋ฐ์ ์ธ UI์ CSS ๊ด๋ จํ์ฌ ์๊ฒฌ ์ถฉ๋๋ก ์ธํด ํ๋ก์ ํธ ์ค๋์ ์ ๋ถ ๊น ์ถฉ๋์ด ๋๋ ๋ฑ ์ฌ๋ฌ ํ๋ ์ ์ด ์์์ต๋๋ค. ๋ชจ๋๊ฐ ๋ฐฑ์๋ ๊ฐ๋ฐ์์ด๋ค๋ณด๋ ์์ ์ ๊ธฐ๋ฅ ๊ตฌํ์๋ง ๊ด์ฌ์ด ํฐ ๊ฒ์ ์์ง๋ง, ์ด์ฐ๋์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋๋ ๋ฐ ์์ด์ CSS์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฐ๋์ ๊ฑฐ์ณ๊ฐ์ผํ ์์์ ๋๋ค. ํ ์ฌ๋์ ํฌ์๋ง์ผ๋ก ์ฌ์ดํธ๊ฐ ๋ง๋ค์ด์ง๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ํ์ํฌ๊ฐ ๋์ฑ ํ์ํ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ๋๋ถ๋ถ์ UI๋ฅผ ๋ด๋นํ์๊ณ , ์ด๋ ํผ์ ํ์ตํ ์ ์๋ ๊ธฐํ๋ก ์๊ฐํ์์ต๋๋ค.
๋ํ ์์ ์ด ์ฒ์ ๊ธฐํํ์ง ์์ ์๋๋ฐฉ์ ์ฝ๋๋ฅผ ์์๋ก ์์ ํ์ง ์๊ณ ๋ฐ๋์ ๊ทธ ๊ฐ๋ฐ์์ ์ฒ์ ์๋์ ๋ชฉ์ ์ ์ดํดํด์ผํ ๊ฒ์ ๋๋ค. ์ฝ๋ ์ปจ๋ฒค์ ์ ์งํค๋ ๊ฒ์ ๋ฌผ๋ก ์ด๋ฉฐ, ๋ํ ์ผํ ์ฃผ์์ ํตํด ์ฝ๋์ ๋ฐฉํฅ์ฑ์ด ํํธ๋ฌ์ง์ง ์์์ผ ํฉ๋๋ค. ์๋๋ฐฉ์ ์ฝ๋์ ๋ํ ์กด์ค์ด ๋ฐ๋์ ํ์ํ ์์ ์์ ๋๊ผ์ต๋๋ค.
ํ๋ก์ ํธ๊ฐ ๋๋ ํ, ํ์ ๋ฏผ์ง์ค ๊ฐ์ธ์ ๋ฆฌํฉํ ๋ง์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์๋กญ๊ฒ ๋น๋ํ ๊ณผ์ ์ ๊ธฐ์ ํ์์ต๋๋ค.
๊ธฐ์กด์ ๊ฒฐ์ ๊ณผ์ ์์๋ ์ฃผ๋ฌธํ ์ํ๋ค์ ์ฒซ๋ฒ์งธ ์ํ์ ๋ํ์ํ์ผ๋ก ๊ฐ์ ์ ์ฅํ์์ต๋๋ค.
์ด๋ ์ฅ๋ฐ๊ตฌ๋๋ฅผ ์ฃผ๋ฌธ์ผ๋ก ๋ถ๋ฌ๋ค์ผ ๋ ์ด๋ ์ด ๊ฐ์ผ๋ก ์ ์กํ๋ ๊ฐ์ด ์ง์ ์ด ์ ๋๋ก ๋์ง ์์ ์ฒซ๋ฒ์งธ ๊ฐ๋ง ์ฝ์ด๋ค์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ํ์ ์ธ๋ถ์ ํํ๋ ๊ณผ์ ์ด 2์ฐจ๋ก ๋ค์ด๊ฐ๋ค๋ณด๋, ๋ณต์กํ ๋ฆฌ์คํธ์ ํํ๊ฐ ๋ ๊ฒ์ด ๋ฌธ์ ์์ต๋๋ค.
์์ปจ๋, 10๊ฐ์ ์ํ ์ค 5๊ฐ๋ฅผ ์ฅ๋ฐ๊ตฌ๋์ ๋ฃ๊ณ , ์ ์ ๋ ์ฅ๋ฐ๊ตฌ๋์์๋ ์ํ์ 3๊ฐ๋ง ์ ํํ์ฌ ์ฃผ๋ฌธํ ์ ์์ต๋๋ค.
JSON ๋ฐฐ์ด๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ์ฌ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ด ๋์์ ๋์ด๊ฐ ์ ์๋๋ก ํ์์ต๋๋ค.
์ฅ๋ฐ๊ตฌ๋์์ ์ํ์ ํ์ ๋ฌผ๋ก ์๋์ ์ต์ข ํ์ ํ ์ ์๊ธฐ ๋๋ฌธ์, ํ์์ ์ผ๋ก ๋ฆฌ์คํธ์ ํํ๋ก ์ ํ์๋ง๋ค ์ ๋ฐ์ดํธ๋ฅผ ํด์ฃผ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฆฌ์คํธ๋ฅผ ์ฃผ๋ฌธ์์ View์์ ๋ค์ ๋ถํดํ์ฌ ํด๋น ์์๋ค์ ๋ชจ๋ ๋์ดํ ๋ค, ๋ค์ ๊ฒฐ์ ์ ํ์ํ ์์๋ค๋ง ์ถ๋ ค JSON ๋ฐฐ์ด๋ก ์๋ฒ์ ์ ๋ฌํ๋ ๊ฒ์ ๋๋ค.
View์์ ์ ์ด์ฟผ๋ฆฌ๋ฅผ ํตํด ์ด์ค ์ด๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ์์๋ก ์ํํ๋ฉฐ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ์ฌ ์๋ฒ๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก ๋ง๋ค์์ต๋๋ค.
$(function() {
$('#payOrder').click(function() {
let IMP = window.IMP; // ์๋ต ๊ฐ๋ฅ
IMP.init('iamport'); // 'iamport' ๋์ ์ ๊ณต๋ "์ ํด์ฌ ์๋ณ์ฝ๋" ์ฌ์ฉ
let orderItems = [
<c:forEach items="${newBasketList}" var="newBasket" varStatus="status">
<c:forEach items="${newProductList}" var="product">
<c:if test="${newBasket.productId eq product.productId}">
{
"basketSeq": "${newBasket.seq}",
"userId": "${newBasket.userId}",
"userName": "${memberDTO.userName}",
"address": $('#address-1').val() + " " + $('#address-2').val(),
"tel": $('#tel').val(),
"productPrice": "${product.productPrice}",
"discountPrice": $('#discountPrice').val(),
"point": $('#point').val(),
"totalPrice": $('#totalPrice').val()
}<c:if test="${!status.last}">,</c:if>
</c:if>
</c:forEach>
</c:forEach>
];
์ฒซ ๋ฒ์งธ ๋ฆฌํฉํ ๋ง์ ์ด๋ ๊ฒ JSON๋ฐฐ์ด ๊ฐ์ฒด
์์ฑ์ ํตํ ๋ฐ์ดํฐ ๊ตฌํ์ ๋ชฉํ๋ฅผ ๋์์ต๋๋ค.
๋ฆฌํฉํ ๋ง์ ์งํํ๋ฉฐ ๋ฐ๊ฒฌํ ์ฌํญ์, ์ฌ๋ฌ ์ฌ๋์ด ์ฝ๋๋ฆฌ๋ทฐ์ ์ค๋ฅ์ ์ ์ ๋์์ ์ฐธ์ฌํ๋ค๋ณด๋ ์ฒ์ ์ฝ๋ ์์ฑ์์ ์๋๋๋ก ๋ณ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํ์ฉํ์ง ์์๋ค๋ ๊ฒ์
๋๋ค.
ํ์ด์ง๋ง๋ค ์ค๊ตฌ๋๋ฐฉ์ผ๋ก ๋ณ์๋ช ์ด ์ค๋จ์ฉ๋๊ณ ์์๊ณ , ๋ฐ์ดํฐ๊ฐ ๋ฐ์์์ง์ง ์์ ๊ฒฝ์ฐ ๋ ๋ค๋ฅธ ๋ณ์๋ฅผ ๋ง๋ค์ด๋ด๋ ๋ฑ ๋นํจ์จ์ ์ธ ์ฝ๋์ํ์์ต๋๋ค. ์ด๋ฅผ ํ๋๋ก ํต์ผํ๊ณ ๋ถํ์ํ ๋ณ์๋ ์ญ์ ํ๋ ๋ฑ์ ์์ ์ ํ์์ต๋๋ค.
๋ค์ด๋ฐ ๊ด๋ จํด์๋ ์ฝ๊ฒ ์์๋ณผ ์ ์๋๋ก ๋ณ์๋ช
์ newProductList
, usedBasketSeq
, memberOrderInfo
๋ฑ์ผ๋ก ์ฌ์ ๋ฆฝํ์ฌ ์ ์ง๋ณด์์ ํธ๋ฆฌ์ฑ์ ๋๋ชจํ์์ต๋๋ค.
@PostMapping("product/orderlist")
public String submitOrder(
@RequestParam("totalAmount") String totalAmount,
@RequestParam("selectedId") List<String> selectedIdsStr,
@RequestParam("seletedSeq") List<String> selectedSeqsStr,
...(์ค๋ต)...
Model model,
HttpSession session) {
...(์ค๋ต)...
List<BasketDTO> newBasketList = basketService.getOrderlists(selectedSeqs);
List<ProductDTO> newProductList = productService.getProductsByIds(selectedIds);
String userNickname = (String) session.getAttribute("userNickname");
...(์ค๋ต)...
model.addAttribute("newBasketList", newBasketList);
model.addAttribute("newProductList", newProductList);
๊ฒฐ์ ํ์ ๊ณ ๊ฐ์ ์ฃผ๋ฌธ๋ด์ญ์ ์ ์ฅํ๊ธฐ ์ํด์, ๊ฒฐ์ ๊ณผ์ ์์ ์ด 3๋ฒ์ ์ ์ฐจ๋ฅผ ๋ง๋ค์์ต๋๋ค. ๊ธฐ์กด์๋ memberDTO
, basketDTO
,productDTO
๋ชจ๋๋ฅผ ์ฃผ๋ฌธ์๋ก ๋๊ฒจ ๊ทธ ๋ฐ์ดํฐ๋ค์ orderlist
๋ก ๋ง๋๋ ๊ฒ์ด์์ต๋๋ค. ํ์ง๋ง View ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ฃผ๋ฌธ๋ด์ญ์ ์ ์ฅ์ด ๋์ด์ผํ๋ ์์๋ค๋ง ์ถ๋ ค ๋ฐฐ์ด ํ์์ JSON์ ๋ง๋ค์๊ณ , ์ด๋ฅผ OrderListDTO
๋ผ๋ ์ด๋ฆ์ผ๋ก ๋๊ฒจ์ฃผ์์ต๋๋ค.
request๋ฅผ ์ง์ ํธ๋ค๋ง ํ์ง ์๊ณ , JSON
์ผ๋ก ๋์ด์จ ์ ๋ณด๋ค์ Jackson
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ DTO์ ๋ฃ์์ต๋๋ค.
ํนํ, ์ฅ๋ฐ๊ตฌ๋์์๋ถํฐ ๋์ด์จ ์ ํํ ์ํ๋ค์ ๋ณต์๊ฐ๋ก์จ ์ด๋ฅผ ๋ฆฌ์คํธ๋ก ํํํ๋ฉด ๋ฆฌ์คํธ ์์ ๋ฐฐ์ด์ด n๊ฐ ์๋ ์ํ์
๋๋ค. ์ฆ basketDTO
์ productDTO
๋ ๋ฆฌ์คํธ๋ก ์ค๊ณ , memberDTO
๋ 1๋ช
์ ์ ์ ์ ๋ณด๊ฐ ๋ฐฐ์ด๋ก ๋ค์ด์์ต๋๋ค. ์ฌ๋ฌ๊ฐ์ ๋ฆฌ์คํธ๊ฐ ์์ด๋ค๋ณด๋ ์๋ฒ๋จ์์ memberOrderInfo
๋ฅผ ํตํด ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ค์ด ์ฌ์ฉ์์ ์ ๋ณด๋ง์ ์ถ์ถํ์ฌ ๊ฒฐ์ ๋ด์ญ ์ ์ฅ์ ์ด์ฉํ์์ต๋๋ค.
@PostMapping("product/paySuccess")
@ResponseBody
public int payOrder(@RequestBody List<OrderListDTO> orderItems, HttpSession session){
/* ๊ฒฐ์ ๋ด์ญ ์ค ์ฌ์ฉ์์ ๊ดํ ์ ๋ณด๋ฅผ ์ถ์ถ */
List<String> memberOrderInfo = new ArrayList<>();
if (!orderItems.isEmpty()) {
OrderListDTO userInfo = orderItems.get(0);
String infos = String.format(
"userId=%s, userName=%s, address=%s, tel=%s, discountPrice=%s, totalPrice=%s",
userInfo.getUserId(), userInfo.getUserName(), userInfo.getAddress(),
userInfo.getTel(), userInfo.getDiscountPrice(), userInfo.getTotalPrice()
);
memberOrderInfo.add(infos);
}
int result = productService.payOrder(orderItems);
๋ ๋ฒ์งธ ๋ฆฌํฉํ ๋ง์ ์ ๋ฐ์ ์ธ ์ผํ๋ชฐ ๊ธฐ๋ฅ์ ์์ ์
๋๋ค.
๊ทธ ์ด์ ๋ ๊ธฐ์กด์ ๊ตฌ์กฐ๊ฐ ํ์ค์ ์ธ ์ผํ๋ชฐ ๊ฒฐ์ ๋ฐฉ์์ ๋ฐ๋ฅด์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์๋ ๊ทธ๋ฆผ์์ ๋ณด์ค ์ ์๋ฏ, ๊ธฐ์กด ์ผํ๋ชฐ ์ฃผ๋ฌธ๋ด์ญ์ ๊ณ ๊ฐ์ผ๋ก ํ์ฌ๊ธ ์๋ฏธ์๋ ๋ฐฑ์๋์ ์ํ์ค ๋๋ฒ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์๊ณ , ๊ฐ ์ํ๋ณ ํ ์ธ์ก์ ๋์ถํ์ง ์๊ณ ์์์ต๋๋ค.
์ ๋ ์ด์ ์ปค๋ฆฌ์ด๋ก ๋ค์ด๋ฒ D2C๋ชฐ์(๊ท๋ชจ ์ 10์ต์ด์) ์ง์ ์ด์ํด๋ดค๊ณ ERP์ ์ด์ปค๋จธ์ค ๋ก์ง์ ๋์
ํ ๊ฒฝํ๋ ์๊ณ , ์นดํ24๋ฅผ ํตํด ๋ธ๋๋๋ชฐ์ ์ ์ํ ๊ฒฝํ๋ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝํ์ผ๋ก ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ ์ฅ๋ฐ๊ตฌ๋ ๋ฒํธ์ ํ ์ธ๊ธ์ก์ด 1๊ฐ์ ์ฃผ๋ฌธ๋ชฉ๋ก์ ๋์ด๋๋ ๊ฒ์ ์ด์ํ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐ์ด ๋ค์์ต๋๋ค. ์ค์ ์ผํ๋ชฐ์์๋ ํ ์ธ
์ ๊ธฐ์ค์ผ๋ก ๊ธฐ๋ฅ์ ์ธ๋ถํํด์ผ๋ง ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ฅผ๋ค์ด ์ต์ด์ฃผ๋ฌธ๊ธ์ก
์ ์ ๊ฐ์์ ๊ฐ๋ณ์ํํ ์ธ
๊ธ์ก์ ๋นผ๊ณ ๋ฐฐ์ก๋น๋ฅผ ๋ํ ๊ธ์ก์ด ๋ฉ๋๋ค. ์ด๋ ๊ณ ๊ฐ์ด ์ ํํ์ง์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ์ ๋ถ๊ณผ๋๋ ๊ธฐ๋ณธ ํ ์ธ์ด๋ฉฐ productDTO
์ ํฌํจ๋ ๊ฒ์
๋๋ค.
๋ค๋ง, ์ ๋ฆฝ๊ธ
์ด๋ผ๋ ๊ฒ์ ํฌ์ธํธ
,๋ง์ผ๋ฆฌ์ง
์ ๊ฐ๋
์ผ๋ก ํ๋งค์ฅ๋ ค๊ธ์ ํด๋นํ์ฌ ๋ถ๊ฐ๊ฐ์น์ธ ๊ณผ์ธํ์ค์ ๋์์ด ๋๋ฉฐ, ๋ฐ๋ผ์ ์ฃผ๋ฌธ๋ชฉ๋ก์๋ ์ ์ฒด ์ํ์ ํ ์ธ์ผ๋ก ๋ณ๋ ๊ณ์ฐ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์์์ฆ์์๋ ๊ฐ๋ณ ๊ธ์ก์ ํ ์ธ์ผ๋ก ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ฌ์
์ฅ๋ณ๋ก ๊ทธ ์ ๋ฅ ์ ์ ํด์ผํฉ๋๋ค.
์ ๋ ๋์ค์ ์ผ๋ก ์ต์ํ ๋ค์ด๋ฒ ์ผํ
์ ํ์ค๋ฐฉ์์ ๋ฐ๋ผ ์ ์ฒดํ ์ธ
์ญ์ ๊ทธ ๋น์จ๋ก ํ ์ธ์ ๋งค๊ธฐ๋ ๊ธฐ๋ฅ์ ๋์
ํ์์ต๋๋ค.
์ด๋ฅผ ์ํด์๋ ์ ๋ฐ์ ์ธ ํ์ด์ง์ ์ปจํธ๋กค๋ฌ๋ณ ์ฝ๋ ํ๋ฆ์ด ๋ณ๊ฒฝ๋์ด์ผ ํฉ๋๋ค.
- ์ ๊ฐ: PRODUCT_ORIPRICE
- ๊ฐ๋ณ ์ํํ ์ธ: INDIV_DISCOUNT
- ์ต์ด ์ฃผ๋ฌธ๊ธ์ก: PRODUCT_PRICE
- ์ ๋ฆฝ๊ธ ์ฌ์ฉ: POINT_TOUSE
- ๊ฐ๋ณ ํ ์ธํ์ฐ: INDIV_DISCOUNT
- ์์ ๊ธ์ก๊ณ์ฐ: PRODUCT_CALPRICE
์ด๋ ๊ฒ ์์๊ธ์ก์ ์ ํ๊ฒ ๋ ์ด์ ๋,
์ฃผ๋ฌธ ๋จ๊ณ์์ ๊ฐ ์ํ์ ํ ์ธ ๊ธ์ก์ด ๋ง์ผ๋ฆฌ์ง(ํฌ์ธํธ) ์ฌ์ฉ์ ๋ฐ๋ผ ๋์ ์ผ๋ก
๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
โ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ํ์ ํ๋งค์๊ฐ 1์ฐจ ํ ์ธํ์ฌ ์ํ๋ชฉ๋ก์ ๊ฒ์๋๋ค. (์ต์ด ์ฃผ๋ฌธ ๊ธ์ก)
โก ๊ณ ๊ฐ์ด n๊ฐ์ ์ํ์ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ณ ์ถ์ ๊ฒ๋ง ๋ด์ผ๋ฉด ์ฃผ๋ฌธ๋ฒํธ null๋ก ํด์ ์ฅ๋ฐ๊ตฌ๋๊ฐ ์๊ธด๋ค.
์ด๋ 1์ฐจ ์ ํ์ด ์ด๋ฃจ์ด์ง๋ฉฐ, ์ํ๊ณผ ์ฅ๋ฐ๊ตฌ๋๋ ์ผ๋์ผ ๊ด๊ณ์ผ ๊ฒ์ด๋ค.
โข ์ฅ๋ฐ๊ตฌ๋์์ ๋ค์ n๊ฐ์ ์ํ๋ค์ ์ ํ(2์ฐจ ์ ํ)ํด์ ์ฃผ๋ฌธ์๋ก ์ด๋
โฃ ์ฃผ๋ฌธ์์์ ์์ ์ ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ 2์ฐจ ํ ์ธ์ ๋ฐ๊ฒ ๋๋ค.
โค ์ ์ฒด ๊ธ์ก์์ ํฌ์ธํธ๋งํผ ํ ์ธ๋ ๊ธ์ก์ด ๊ฒฐ์ ๋๋ค.
โฅ ๊ฒฐ์ ์๋ฃ์ ์ฅ๋ฐ๊ตฌ๋ ํ
์ด๋ธ์ ํด๋น ์ฅ๋ฐ๊ตฌ๋ ๋ฒํธ๋ค์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ค์๋ ์ฃผ๋ฌธ๋ฒํธ๊ฐ ์๊ธฐ๊ณ ๋์์ ์๋ณด์ด๊ฒ ์ฒ๋ฆฌ๋๋ค.
โฆ ์ฃผ๋ฌธํ
์ด๋ธ์๋ ์ฃผ๋ฌธ๋ฒํธ๊ฐ ์๊ธด ๋ฐ์ดํฐ๋ค์ ํ์ด ์๊ธด๋ค.
โง ์์ ์ ์ ์์๊ธ์ก ๊ณ์ฐ ํจ์์ ๋ฐ๋ผ ๊ฐ ์ํ๊ธ์ก์ ์ค์ ํ ์ธ์ ์ฉ๋ ๊ธ์ก์ด ์ฃผ๋ฌธ ํ์คํ ๋ฆฌ์ ์ ์ฅ๋๋ค.
๊ฒฐ์ ์ ๋์์ ๋ชจ๋ ๊ฒ๋ค์ด ์ฒ๋ฆฌ๋๋ ๊ตฌ์กฐ์ ์ด๋ฅผ ํธ๋์ญ์
์ผ๋ก ์ค์ ํ์ฌ
์ฃผ๋ฌธ ์ ๊ท ์ฟผ๋ฆฌ ์ฒ๋ฆฌ์, ๋ง์ผ๋ฆฌ์ง ์ฐจ๊ฐ, ์ฅ๋ฐ๊ตฌ๋ ์ฒ๋ฆฌ, ์์๊ธ์ก ํจ์๊ณ์ฐ์ ๋์์ ์งํํ์์ต๋๋ค.
์ ๊ท ์ฟผ๋ฆฌ์ ๋ํ ๋ถ๋ด๊ณผ ๋ฒ๊ฑฐ๋ก์์ ์ค์ด๊ธฐ ์ํด,
๊ฐ๋ณ ๋ฆฌ์คํธ๋ก insert
ํ ์ ์ฒด ๊ณ์ฐ ๊ธ์ก์ insert
ํ๋ ๋ฐฉ์์์ ๋ฒ์ด๋
๋ฆฌ์คํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๊ฑฐ๊ธฐ์ ์ ์ฒด ๊ณ์ฐ ๊ธ์ก์ add
ํ๊ณ ,
๊ฐ๋ณ ๊ฐ์ฒด๋ง ๋ถ๋ฌ์ ์์๊ณ์ฐ ํจ์๋ก ํ์ฐํ ๋ค
๋ค์ ๊ฐ๋ณ ๋ฐฐ์ด์ add
ํ์ฌ ํ๋ฒ์ insert
ํ๋ ๋ฐฉ์์ผ๋ก ๋ง๋ค์์ต๋๋ค.
๊ด๋ฆฌ์ ํ์ด์ง์ Spring Security
๋ฅผ ๋์
ํ์ฌ ๋ณด์์ ๊ฐํํ์์ต๋๋ค.
ํ์ ์์
๋ก๊ทธ์ธ ๊ฐ์ ๊ฒฝ์ฐ๋ ์นํ์ด์ง ์์ฒด ํ์DB๊ฐ ์์ ์๊ณ ,
DB๋ด์ ์์
token
์ธ์๋ ๋ณด์ ํ๋ ํ์ ๊ฐ์ธ์ ๋ณด๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ณ๋๋ก ์ค์ ํ์ง ์์์ต๋๋ค.
๋ค๋ง ๊ธฐ์กด ๊ด๋ฆฌ์ ๋ก๊ทธ์ธ์ ๋จ์ ๋น๋ฐ๋ฒํธ ์ผ์น์ฌ๋ถ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ํ์ธํ๋ ์์ค์ด์๊ธฐ์
๋ค์ค ๋ก๊ทธ์ธ์ด ๊ฐ๋ฅํ๋๋ก DB๋ฅผ ๋ง๋ จํ์์ต๋๋ค.
@Service
public class ManagerService {
@Autowired
BCryptPasswordEncoder passwordEncoder;
public boolean managerLogin(ManagerDTO managerDTO) {
String getPw = managerDAO.managerLogin(managerDTO);
if(passwordEncoder.matches(managerDTO.getManagerPassword(), getPw)) {
return true;
}
return false;
}
๊ด๋ฆฌ์์ ์ํ๋ฆฌํฐ๋ฅผ ๋์
ํ๊ธฐ ์ํด ๋ณ๋์ table์ ๋ง๋ค์๊ณ , MVC๋ฅผ ์๋ก ์์ฑํ์์ต๋๋ค.
BCryptPasswordEncoder
๋ฅผ ํตํด ํจ์ค์๋ salt
์ํธํ ํ์์ต๋๋ค.
์ฌ๋ฌ ๋ช
์ ๊ด๋ฆฌ์๋ฅผ ๋์์ ๋ฑ๋กํ๊ณ ๋ก๊ทธ์ธํ ์ ์๋ ํ์ด์ง๋ฅผ ๋ง๋ค์ด ์ด์ํ๊ฒ ๋ฉ๋๋ค.