- ๊ฐ๋ฐ์์๊ฒ ํ์ํ ์ฅ๋น๋ฅผ ํ๋งคํ๋ ์ผํ๋ชฐ
- ๋ฒ ์คํธ ์์ดํ
, ๋ฆฌ๋ทฐ, ์ํ๋ฌธ์ ๋ฑ ์๋น์๋ฅผ ์ํ ์๋น์ค ์ ๊ณต
- S3(ํด๋ผ์ด์ธํธ) : http://devstore-dev-deploy.s3-website.ap-northeast-2.amazonaws.com/
- EC2(์๋ฒ) : http://storedve.shop
- API ์ค์จ๊ฑฐ : API๋ฌธ์
| ํ๋ก ํธ์๋ | |||
|---|---|---|---|
๊น์ฉํฌ(ํ์ฅ) |
์ด์น๋ฏธ |
์ต์์ |
๊นํ์ง |
| ๋ฐฑ์๋ | |||
์ดํ์ธ(ํ์ฅ) |
์ด๊ธฐํธ |
||
- Login ์ด ํ Authoriztion header์ ์๋ token key ๊ฐ์ ์๋์ ํ๋ฉด์ ์ ๋ ฅ (์๋ฌผ์ ๋ชจ์)
- ์ํ ๋ฑ๋ก ๊ด๋ จ ์ญ์ ํ ์ด๋ฏธ์ง or ์ญ์ ํ option์ด ์๋ค๋ฉด ํด๋น ๋ฐฐ์ด์ ๋น ๋ฐฐ์ด๋ก ๋๊ฒจ์ค์ผํฉ๋๋ค. ์ด๋ฏธ์ง๋ฅผ ๋ฑ๋กํ ๋๋ ์ด๋ฏธ์ง์ ์์ ์ ์ด๋ฅผ ์ํด ๋ํ๊ฐ์ true, ๋๋จธ์๋ false, ์ด๋ฏธ์ง์ ์์๋ฅผ ์ ํด์ ์ ๋ฌํด ์ค์ผํฉ๋๋ค.
{
"deleteImageId": [
],
"deleteOptionId": [
],
"updateOptionList": [
{
"optionId": 1,
"optionDetail": "string",
"optionName": "string",
"itemCount": 0,
"additionalPrice": 0
}
],
"imageSortAndRepresentativeInfo": [
{
"imageId": 1,
"orderNumber": 1,
"representative": true
}
]
}์ํ ์์ ์ ์ญ์ ํ ์ด๋ฏธ์ง ๋ฐ ์ต์ ์ด ์์ผ๋ฉฐ, ์ด๋ฏธ์ง๋ฅผ ์ถ๊ฐํ ๋์ JSON id๋ค์ ๊ธฐ๋ณธ๊ฐ์ด ๋ชจ๋ 0์ผ๋ก ๋์ด ์๊ธฐ ๋๋ฌธ์ ํด๋น ๋ถ๋ถ์ ์์ ํ๊ณ ์ถ์ง ์๋ค๋ฉด ๋น ๋ฐฐ์ด๋ก ์ ๋ฌํด์ฃผ์๋ฉฐ ๋ฉ๋๋ค. ์๋์ imageSortAndRepresentativeInfo ์์ ์ด๋ฏธ ์กด์ฌํ๋ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ๋ id๊ฐ์ ์ ์ด์ฃผ๊ณ ์๋ก ์ถ๊ฐ ๋ฑ๋กํ๊ฒ ๋๋ฉด null๋ก ์ ๋ฌํด ์ฃผ์๋ฉด ๋ฉใด๋ใ .
์ฌ์ง์ ์ ์ ๋ฐ์ดํฐ๊ธฐ ๋๋ฌธ์ S3 ์ ์ฅ์์ ์ ์ฅ, ๋ฐฑ์๋ ์๋ฒ์ ๊ฒฝ์ฐ๋ EC2๋ฅผ ํตํด ๋ฐฐํฌ ์งํ, DB๋ AWS์์ ์ ๊ณตํ๋ RDS์ MYSQL DB๋ฅผ ํ์ฉํด ๊ตฌํ
- RDS์ ๋ณด์์ ์ํด EC2์ ๊ฐํผ VPC์ ์ํ๊ฒ ๋ง๋ค์ด EC2์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ์ค์ , ์ด๋ฅผ ํตํด RDS์ ๋ณด์ ์์น
- AWS ์ ๊ทผ ์ ๊ฐ๊ฐ์ IAM์ ๋ฐ๊ธ์ ํตํด ํ์ํ ๊ถํ๋ง์ ํ๋ก ํธ์๋ ๋ฐ ๋ฐฑ์๋์ ์ ๊ณต
Request -> Controller -> Service (๋น์ฆ๋์ค ๋ก์ง ์คํ, Response Data ๋ณ๊ฒฝ) -> Controller -> response ์ ํ๋ฆ์ผ๋ก ๋ฐ์ดํฐ ์์ฒญ
์ด ๋ฐฉ๋ฒ์ 2๊ฐ์ง์ ๋ฌธ์ ๋ฐ์
- ๊ฐ ๊ณ์ธต์ด ๊ฐํ๊ฒ ๊ฒฐํฉ์ด ๋์ด์๋ค.
- ํ
์คํธ ์ฝ๋ ์์ฑ ์ ์ ํํ ํ
์คํธ๋ฅผ ํ๊ธฐ ์ด๋ ต๋ค.
- patch ์์ฒญ์ ๋ฐ์ ๊ฒฝ์ฐ response๋ก id๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ service์์๋ id๋ง์ ๋ฐํํ๊ฒ ๋๋ค๋ฉด test ์ id๋ง์ ๊ฒ์ฆํ๊ฑฐ๋ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด ํ ์คํธ ์งํ
- ๊ทธ ๊ฒฐ๊ณผ ํ ์คํธ ์ ๋ฌธ์ ๋ฐ์
Request -> Controller -> Mapper(Entity ๋ณ๊ฒฝ) -> Service(๋ก์ง ์คํ, Entity ๋ฐํ) -> Mapper(Dto ๋ณํ) -> response ์ ํ๋ฆ์ผ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ
- ๊ณ์ธต ๊ฐ์ ์ด๋์ Entity๋ฅผ ํตํด ์งํ
- ๊ณ์ธต๊ฐ์ ๊ฒฐํฉ ์ฝํ ๋ฐ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถ, Service๋จ์ ์ญํ ๊ณผ๋ถํ ๋ฐฉ์ง
- DTO -> Entity , Entity -> DTO ๋ณํ ๊ณผ์ ์ถ๊ฐ ๋ฐ์
- ๊ณ์ธต ๊ฐ ๊ฒฐํฉ๋ ์ฝํ
- ํ ์คํธ ์ฝ๋๋ฅผ ํตํด ๊ฐ๋ฐ์๊ฐ ์ํ๋ ํ ์คํธ ์งํ ๊ฐ๋ฅ
- Mapper๋ฅผ ํ์ฉํ Class ๋ณ๊ฒฝ ์ ํจ์จ์ ์ธ ๊ด๋ฆฌ๋ฅผ ์ํ ์์ฑ์ ์ ํ ํ๊ณ
- ๊ณ์ธต๊ฐ์ ์ด๋ ์ Entity ๋ฐ DTO ์ ํ
- Repository ์ธํฐํ์ด์ค๋ฅผ ํตํ ํ๋ ์ ์ํฌ ์์กด์ฑ ์ฝํ(ํ๋ ์์ํฌ ์์กด์ฑ ์ฝํ)
- ํ๋ก ํธ์๋์์ ๋ฐฐํฌ ํ ์คํธ ์ค ๊ตฌํํ ์ฝ๋๊ฐ ์ ์ ์๋ํ์ง ์๋ ๋ฌธ์ ๋ฐ์, ๋ฌธ์ ํด๊ฒฐํ ๋ค ๋ค์ ๋ฐฐํฌํด์ ํ์ ํ๋ ๊ณผ์ ์์ ๋ง์ ์๊ฐ์ด ์์๋๋ค.
- ์ฝ๋์ ์ ๋ขฐ์ฑ์ ๋์ด๊ธฐ ์ํด ๋จ์ ํ ์คํธ ์งํ
- ๋จ์ ํ ์คํธ๋ฅผ ํตํด ๋ฐ์ํ ์ ์๋ ์์ธ, ์ฑ๊ณต์ ๋ํ ํ ์คํธ ์งํ
- ์ด๋ฅผ ํตํด ๊ฐ ๋ชจ๋์ ์ ๋ขฐ์ฑ ์์น
- ๋จ์ ํ ์คํธ๋ง์ผ๋ก๋ ๊ฐ๊ฐ์ ๋ชจ๋๋ค์ด ํฉ์ณ์ก์ ๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๋ํ ํ ์คํธ ์งํ์ด ๋ถ๊ฐ๋ฅํด ์๋ฒฝํ๊ฒ ์ ๋ขฐํ ์ ์์ ๊ฒ์ด๋ผ ํ๋จ(Mock ๊ฐ์ฒด ์ฌ์ฉ)
- ํตํฉ ํ ์คํธ ์งํ์ ํ์์ฑ์ ๋๋
- ํตํฉ ํ ์คํธ๋ฅผ ํตํด ๊ฐ ๋ชจ๋์ ๊ฒฐํฉํ ํ ์คํธ ์งํ
- ์ด ๊ณผ์ ์์ TestRestTemplate, MockMvc๋ฅผ ํ์ฉํ ํตํฉํ ์คํธ์ ๋ํ ๊ตฌํ ํ์ต
- ํตํฉํ
์คํธ์ ๋ชฉ์ ์ ๋ฐ๋ผ TestRestTemplate ๊ณผ MockMvc ์ค ํ 1 ํ์ฌ ํ
์คํธ ์งํ
- ์ค์ ํ๋ก ํธ์๋์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒ์ ํ ์คํธ ํ๊ณ ์ถ๋ค๋ฉด TestRestTemplate์ ํ์ฉ
- ๋กค๋ฐฑ์ด ๋ถ๊ฐ๋ฅ
- ๊ฐ๊ฐ์ ๋ชจ๋์ ํตํฉ์ ์ธ ํ ์คํธ์ ์ด์ ์ ๋ง์ถฐ ํ ์คํธ๋ฅผ ์งํํ๋ค๋ฉด MockMvc๋ฅผ ํ์ฉ
- ํตํฉ ํ
์คํธ๋ฅผ TestRestTemplate์ผ๋ก ์งํํ ๊ฒฝ์ฐ ๊ฐ์ ํ
์คํธ๋ฅผ ์ฌ๋ฌ๋ฒ ์งํํ ๋, ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ํ
์คํธ๋ฅผ ์งํํ ๋ ๋์ผํ ํ
์คํธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ์ง ์๋ ๋ค๋ ๋ฌธ์ ๋ฐ์
-
๋กค๋ฐฑ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ
-
ํ ์คํธ ์ปจํ ์ด๋๋ฅผ ํ์ฉํด ์ธ์ ์ด๋์ ๋๊ฐ ํ ์คํธ๋ฅผ ์คํํ๋๋ผ๋ ๊ฐ์ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ์ ์๋๋ก ํ ์คํธ ์ปจํ ์ด๋ ๊ตฌํ
-
- ๋์ปค๋ง ์ค์น ๋์ด ์๋ค๋ฉด ์ธ์ ์ด๋์๋ ๊ฐ์ ํ๊ฒฝ์์ ํ ์คํธ์ ์งํ์ด ๊ฐ๋ฅ
- InMemory DB๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ค์ ๋ฐฐํฌ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ DB ๋ชจ๋ธ์ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฐฐํฌํ๊ฒฝ๊ณผ ๋์ผํ DB ํ๊ฒฝ ๊ตฌ์ถ ๊ฐ๋ฅ 3.** ํ ์คํธ ์์๋ง ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉ**ํ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์์ค ๋ญ๋น๋ฅผ ๋ง์ ์ ์๋ค. - ํ ์คํธ ์ Docker์์ DB๊ฐ ์ฌ๋ผ๊ฐ๊ณ , ํ ์คํธ ์๋ฃ ์ ์ปจํ ์ด๋๊ฐ ์ ๊ฑฐ๋๋ค.
- ํ ์คํธ ์ ๋์ปค๊ฐ ์ฌ๋ผ๊ฐ๊ณ DB์ ๋ฐ์ดํฐ๊ฐ ์ด๊ธฐํ ๋๋ ์๊ฐ์ด ์ถ๊ฐ์ ์ผ๋ก ๋ฐ์
- ํ ์คํธ ์ปจํ ์ด๋ ์ฌ์ฉ ์ ํ ์คํธ ์๊ฐ์ด ์ถ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๋ค๋ ๋จ์ ์ด ์์ง๋ง 1๋ฒ์ ์ค์ ์ ํตํด ์ธ์ ์ด๋์๋ ๋์ผํ ํ ์คํธ ํ๊ฒฝ์ ๊ตฌ์ถ ํ ์ ์์ด ํตํฉํ ์คํธ์ ๋ํ ์ ๋ขฐํ ์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ๋ค๋ ์ฅ์ ์ผ๋ก ์ธํด ํ ์คํธ ์ปจํ ์ด๋ ๋์
- ์์ ํ๊ฒฝ๊ณผ ๋์ผํ DB ํ๊ฒฝ์์ ํ ์คํธ ์งํ ๊ฐ๋ฅ
- ์ธ์ ์ด๋์๋ ๋์ผํ ํ ์คํธ ๊ฒฐ๊ณผ ์ถ๋ ฅ ๊ฐ๋ฅ
- TestDB ๋ฆฌ์์ค ๋ญ๋น ๋ฐฉ์ง
- ํ ์คํธ ์คํ ์ ๋์ปค ์ปจํ ์ด๋๊ฐ ์ฌ๋ผ๊ฐ๋ ์ถ๊ฐ ์๊ฐ ๋ฐ์
- Build ์ Test๊ฒฐ๊ณผ๊ฐ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋๋ค๋ฉด Build๊ฐ ๋์ง ์๋๋ก Build ์ ํ, ์ด๋ฅผ ํตํด ํ ์คํธ ์์ฑ์ ๊ฐ์ ํ ๋์
- Multipartform์ MockMvc, RestTemplate์ ํ์ฉํ ํ ์คํธ
- ํตํฉ ํ ์คํธ๋ฅผ ๊ตฌํํ๋ ๊ณผ์ ์์ RestTemplate, MockMvc๋ฅผ ํ์ฉํ ํ ์คํธ ๋ฐ ๊ฐ๊ฐ์ ์ฅ๋จ์ ํ์ต
- ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง 70% ์ด์ ๋ฌ์ฑ์ ์ํด ์ฝ 300๊ฐ์ ํ ์คํธ ์งํ ๋ฐ ์ด๋ฅผ ํตํด ํ์ํ ํ ์คํธ์ ๋ถํ์ํ ํ ์คํธ๋ฅผ ์ ๋ณํ๋ ๊ธฐ์ค์ ๋ํ ํ์ต
- jacoco + sornaqube ํ์ฉ
- ์ฝ๋๊ฐ ๋ง์์ง์ ๋ฐ๋ผ code smell ๋ฐ ๋ณด์์์ ์ค๋ฅ๋ฅผ ํ์ ํ๊ธฐ ์ํ ๋๊ตฌํ์
- ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง์ ์๊ฐ์ ์ธ ํํ ํ์
- ํ ์คํธ ๋ฏธ์งํ ๋ถ๋ถ์ ๋ํ ๋น ๋ฅธ ํ์ธ์ด ๊ฐ๋ฅ
- code smell์ ๋น ๋ฅธ ํ์ ์ด ๊ฐ๋ฅ ๋ฐ ์ ๊ฑฐ ๊ฐ๋ฅ
- ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง ํน์ ์์น ์ดํ์ผ ๊ฒฝ์ฐ Build๊ฐ ์๋ํ์ง ์๋๋กํด ํ ์คํธ ๊ฐ์ ํ ๊ฐ๋ฅ
### ๊ฒฐ๊ณผ 1. ๋ถํ์ํ ์ฝ๋ ์ ๊ฑฐ 2. ๋ณด์์์ ์ด์๊ฐ Security Hotspots ์ ๊ฑฐ 3. ์ฝ๋ ํ์ง ์์น ํจ๊ณผ ๋ฐ์
์ ์ ํ ์คํธ ๋๊ตฌ์ ์ฌ์ฉ์ ํตํด ๋ฌธ์ ๊ฐ ์๋ ์ฝ๋์ ํ์ธ ๋ฐ ๋ณ๊ฒฝ์ ํตํด ์ฝ๋์ ํ์ง์ ์์น์ํฌ ์ ์์ผ๋ฉฐ, ์์ฑํ ํ ์คํธ ์ฝ๋์ ์ปค๋ฒ๋ฆฌ์ง์ ์๊ฐํ๋ฅผ ํตํด ๋ถ์กฑํ ํ ์คํธ๋ฅผ ํ์ ํ ์ ์๋ค sonarqube์ ๊ฒฝ์ฐ๋ ํ๋ฆฌํฐ์ด ํ๊ฒฝ์์ EC2์ ๋ฐฐํฌํ๋ ๊ฒ์ ๋ฌด๋ฆฌ๋ผ๊ณ ํ๋จํ์ฌ LOCAL PC์์ DOCKER๋ฅผ ํตํด ๊ธฐ๋
Filter๋ฅผ ํ์ฉํ Logging์ ํตํด Controller์ ์ง์ ํ์ง ๋ชปํ๋ ์์ฒญ์ ๋ํ ์์ธ ํ์
Controller์ ์ง์ ํ์ง ๋ชจํ๋ EndPoint์ ๋ํ ์๋ฌ ์์ธ์ ์ฐพ๋๋ฐ ๋ง์ ์๊ฐ ์๋ชจ ๋ฐ์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ Request์์ฒญ์ด Controller์ ์ง์ ํ์ง ์์๋ ๋ฌด์กฐ๊ฑด ํ์ธํ ์ ์๋ ๊ณณ์ Logging ๊ธฐ๋ฅ ๊ตฌํ์ด ํ์ (AOP ์ฌ์ฉ ๋ถ๊ฐ๋ฅ) ์ด๋ฅผ ์ํด ์๋ธ๋ฆฟ ์ปจํ ์ด๋์์ ์คํ๋๋ Filter๋ฅผ ํ์ฉํด Logging ์์ ๊ตฌํ
EndPoint ์คํ๋ก ์ธํ ์๋ฌ์ ์์ธ ๋น ๋ฅธ ํ์ ๊ฐ๋ฅํด ๋ง์ ์์ ์๊ฐ ๋จ์ถ ๊ฐ๋ฅ
Filter ์ฌ์ฉ ๋ฐฉ๋ฒ ํ์ต
์ธํฐ์
ํฐ ์ฌ์ฉ ๋ฐฉ๋ฒ ํ์ต
ํน์ ํ ์ด๋ธ์ row๋ฅผ ์ญ์ ํ๋ ค๊ณ ํ ๋ ์ธ๋ํค ์ฐธ์กฐ๋ก ์ธํด ํด๋น row๋ฅผ ์ญ์ ํ ์ ์๋ ์๋ฌ ๋ฐ์(์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ์ ์ง๋ฅผ ์ํ ์ฐธ์กฐ๋๋ ๋ฐ์ดํฐ์ ์ญ์ ๋ถ๊ฐ)
- DB์์ ์ธ๋ํค๋ฅผ ์ฒดํฌํ๋ ์ต์
์๋ต
- ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ ์กด์ฌ
- ์ฐ๊ด๊ด๊ณ๋ฅผ ๋ฏธ๋ฆฌ ๋์ด ์ค ๋ค ์ ๊ฑฐ (์ ํํ ๋ฐฉ๋ฒ)
- Controller๋ก JSON ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๊ฒ ๋๋ฉด ์ด๋ป๊ฒ Class๋ก ๋งคํ์ด ๋๋์ง ํ์ต(์ Dto๋ค์ ๊ธฐ๋ณธ์์ฑ์๊ฐ ํ์ํ๊ฐ)

