Skip to content

Latest commit

ย 

History

History
297 lines (225 loc) ยท 15.7 KB

File metadata and controls

297 lines (225 loc) ยท 15.7 KB

Devstore

๐Ÿ’ป ์„œ๋น„์Šค ์†Œ๊ฐœ

  • ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ•„์š”ํ•œ ์žฅ๋น„๋ฅผ ํŒ๋งคํ•˜๋Š” ์‡ผํ•‘๋ชฐ
  • ๋ฒ ์ŠคํŠธ ์•„์ดํ…œ, ๋ฆฌ๋ทฐ, ์ƒํ’ˆ๋ฌธ์˜ ๋“ฑ ์†Œ๋น„์ž๋ฅผ ์œ„ํ•œ ์„œ๋น„์Šค ์ œ๊ณต

๐Ÿ“Ž ๊ด€๋ จ ๋งํฌ


๐Ÿง‘๐Ÿปโ€๐Ÿ’ป ํŒ€์› ์†Œ๊ฐœ

ํ”„๋ก ํŠธ์—”๋“œ

๊น€์šฉํฌ(ํŒ€์žฅ)


์ด์Šน๋ฏธ


์ตœ์˜์›…


๊น€ํ˜„์ง€

๋ฐฑ์—”๋“œ

์ดํ˜œ์ธ(ํŒ€์žฅ)


์ด๊ธฐํ˜ธ


๐Ÿ“† ์ง„ํ–‰ ๊ธฐ๊ฐ„

2023.05.30 ~ 2023.09.13


โš™๏ธ ์‚ฌ์šฉ ๊ธฐ์ˆ 

[ FRONT-END ]

[ BACK-END ]


๐Ÿ“ ๊ด€๋ จ ๋ฌธ์„œ


Swagger ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • Login ์ด ํ›„ Authoriztion header์— ์žˆ๋Š” token key ๊ฐ’์„ ์•„๋ž˜์˜ ํ™”๋ฉด์— ์ž…๋ ฅ (์ž๋ฌผ์‡  ๋ชจ์–‘)
image
  • ์ƒํ’ˆ ๋“ฑ๋ก ๊ด€๋ จ ์‚ญ์ œํ•  ์ด๋ฏธ์ง€ 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๋กœ ์ „๋‹ฌํ•ด ์ฃผ์‹œ๋ฉด ๋ฉใ„ด๋””ใ….

์ž‘์—… ๋‚ด์šฉ (๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž - ์ด๊ธฐํ˜ธ)

AWS ๋ฐฐํฌ

๋ฐฐํฌ

์‚ฌ์ง„์€ ์ •์  ๋ฐ์ดํ„ฐ๊ธฐ ๋•Œ๋ฌธ์— S3 ์ €์žฅ์†Œ์— ์ €์žฅ, ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ ๊ฒฝ์šฐ๋Š” EC2๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ ์ง„ํ–‰, DB๋Š” AWS์—์„œ ์ œ๊ณตํ•˜๋Š” RDS์˜ MYSQL DB๋ฅผ ํ™œ์šฉํ•ด ๊ตฌํ˜„

  • RDS์˜ ๋ณด์•ˆ์„ ์œ„ํ•ด EC2์™€ ๊ฐ€ํŠผ VPC์— ์†ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด EC2์—์„œ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •, ์ด๋ฅผ ํ†ตํ•ด RDS์˜ ๋ณด์•ˆ ์ƒ์Šน
  • AWS ์ ‘๊ทผ ์‹œ ๊ฐ๊ฐ์˜ IAM์˜ ๋ฐœ๊ธ‰์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๊ถŒํ•œ๋งŒ์„ ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ ๋ฐฑ์—”๋“œ์— ์ œ๊ณต

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

image

ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ

Request -> Controller -> Service (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์‹คํ–‰, Response Data ๋ณ€๊ฒฝ) -> Controller -> response ์˜ ํ๋ฆ„์œผ๋กœ ๋ฐ์ดํ„ฐ ์š”์ฒญ

์ด ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€์˜ ๋ฌธ์ œ ๋ฐœ์ƒ

  1. ๊ฐ ๊ณ„์ธต์ด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ์ด ๋˜์–ด์žˆ๋‹ค.
  2. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ ์ •ํ™•ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
    • patch ์š”์ฒญ์„ ๋ฐ›์„ ๊ฒฝ์šฐ response๋กœ id๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋–„๋ฌธ์— service์—์„œ๋„ id๋งŒ์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด test ์‹œ id๋งŒ์„ ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ ๋‹ค์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด ํ…Œ์ŠคํŠธ ์ง„ํ–‰
    • ๊ทธ ๊ฒฐ๊ณผ ํ…Œ์ŠคํŠธ ์‹œ ๋ฌธ์ œ ๋ฐœ์ƒ

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋ณ€๊ฒฝ

Request -> Controller -> Mapper(Entity ๋ณ€๊ฒฝ) -> Service(๋กœ์ง ์‹คํ–‰, Entity ๋ฐ˜ํ™˜) -> Mapper(Dto ๋ณ€ํ™˜) -> response ์˜ ํ๋ฆ„์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ

  1. ๊ณ„์ธต ๊ฐ„์˜ ์ด๋™์„ Entity๋ฅผ ํ†ตํ•ด ์ง„ํ–‰
    • ๊ณ„์ธต๊ฐ„์˜ ๊ฒฐํ•ฉ ์•ฝํ™” ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•, Service๋‹จ์˜ ์—ญํ•  ๊ณผ๋ถ€ํ™” ๋ฐฉ์ง€

๊ฒฐ๊ณผ

  1. DTO -> Entity , Entity -> DTO ๋ณ€ํ™˜ ๊ณผ์ • ์ถ”๊ฐ€ ๋ฐœ์ƒ
  2. ๊ณ„์ธต ๊ฐ„ ๊ฒฐํ•ฉ๋„ ์•ฝํ™”
  3. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ง„ํ–‰ ๊ฐ€๋Šฅ

ํ•™์Šต

  • Mapper๋ฅผ ํ™œ์šฉํ•œ Class ๋ณ€๊ฒฝ ์‹œ ํšจ์œจ์ ์ธ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์ƒ์„ฑ์ž ์„ ํƒ ํšŒ๊ณ 
  • ๊ณ„์ธต๊ฐ„์˜ ์ด๋™ ์‹œ Entity ๋ฐ DTO ์„ ํƒ
  • Repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ํ”„๋ ˆ์ž„ ์›Œํฌ ์˜์กด์„ฑ ์•ฝํ™”(ํ”„๋ ˆ์ž„์›Œํฌ ์˜์กด์„ฑ ์•ฝํ™”)

ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 80% ๋‹ฌ์„ฑ์„ ํ†ตํ•œ ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ์ฝ”๋“œ ์ž‘์„ฑ

  • ํ”„๋ก ํŠธ์—”๋“œ์™€์˜ ๋ฐฐํฌ ํ…Œ์ŠคํŠธ ์ค‘ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๊ฐ€ ์ •์ƒ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ, ๋ฌธ์ œ ํ•ด๊ฒฐํ•œ ๋’ค ๋‹ค์‹œ ๋ฐฐํฌํ•ด์„œ ํ˜‘์—… ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

  • ์ฝ”๋“œ์˜ ์‹ ๋ขฐ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ง€ํ–‰
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ, ์„ฑ๊ณต์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ง„ํ–‰
  • ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ๋ชจ๋“ˆ์˜ ์‹ ๋ขฐ์„ฑ ์ƒ์Šน
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋งŒ์œผ๋กœ๋Š” ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ๋“ค์ด ํ•ฉ์ณ์กŒ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ง„ํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•ด ์™„๋ฒฝํ•˜๊ฒŒ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋ผ ํŒ๋‹จ(Mock ๊ฐ์ฒด ์‚ฌ์šฉ)
  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ง„ํ–‰์˜ ํ•„์š”์„ฑ์„ ๋А๋‚Œ

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๊ฐ ๋ชจ๋“ˆ์„ ๊ฒฐํ•ฉํ•œ ํ…Œ์ŠคํŠธ ์ง„ํ–‰
  • ์ด ๊ณผ์ •์—์„œ TestRestTemplate, MockMvc๋ฅผ ํ™œ์šฉํ•œ ํ†ตํ•ฉํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๊ตฌํ˜„ ํ•™์Šต
  • ํ†ตํ•ฉํ…Œ์ŠคํŠธ์˜ ๋ชฉ์ ์— ๋”ฐ๋ผ TestRestTemplate ๊ณผ MockMvc ์ค‘ ํƒ 1 ํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ง„ํ–‰
    1. ์‹ค์ œ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๊ฒƒ์„ ํ…Œ์ŠคํŠธ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด TestRestTemplate์„ ํ™œ์šฉ
    • ๋กค๋ฐฑ์ด ๋ถˆ๊ฐ€๋Šฅ
    1. ๊ฐ๊ฐ์˜ ๋ชจ๋“ˆ์˜ ํ†ตํ•ฉ์ ์ธ ํ…Œ์ŠคํŠธ์— ์ดˆ์ ์„ ๋งž์ถฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด MockMvc๋ฅผ ํ™œ์šฉ

ํ…Œ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ

๋„์ž… ๋ฐฐ๊ฒฝ

  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ TestRestTemplate์œผ๋กœ ์ง„ํ–‰ํ•  ๊ฒฝ์šฐ ๊ฐ™์€ ํ…Œ์ŠคํŠธ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์ง„ํ–‰ํ•  ๋•Œ, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ๋‹ค๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
    • ๋กค๋ฐฑ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ

    • ํ…Œ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™œ์šฉํ•ด ์–ธ์ œ ์–ด๋””์„œ ๋ˆ„๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋”๋ผ๋„ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋„๋ก ํ…Œ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ ๊ตฌํ˜„

ํ…Œ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ ์žฅ์ 

  1. ๋„์ปค๋งŒ ์„ค์น˜ ๋˜์–ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ ์–ด๋””์„œ๋‚˜ ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ์˜ ์ง„ํ–‰์ด ๊ฐ€๋Šฅ
  2. InMemory DB๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” DB ๋ชจ๋ธ์„ ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐํฌํ™˜๊ฒฝ๊ณผ ๋™์ผํ•œ DB ํ™˜๊ฒฝ ๊ตฌ์ถ• ๊ฐ€๋Šฅ 3.** ํ…Œ์ŠคํŠธ ์‹œ์—๋งŒ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ**ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค. - ํ…Œ์ŠคํŠธ ์‹œ Docker์—์„œ DB๊ฐ€ ์˜ฌ๋ผ๊ฐ€๊ณ , ํ…Œ์ŠคํŠธ ์™„๋ฃŒ ์‹œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค.

ํ…Œ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ ๋‹จ์ 

  1. ํ…Œ์ŠคํŠธ ์‹œ ๋„์ปค๊ฐ€ ์˜ฌ๋ผ๊ฐ€๊ณ  DB์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๋Š” ์‹œ๊ฐ„์ด ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐœ์ƒ

ํ…Œ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ ๋„์ž… ์˜์‚ฌ ๊ฒฐ์ •

  • ํ…Œ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ ์‹œ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„์ด ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์ง€๋งŒ 1๋ฒˆ์˜ ์„ค์ •์„ ํ†ตํ•ด ์–ธ์ œ ์–ด๋””์„œ๋‚˜ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์–ด ํ†ตํ•ฉํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•œ๋‹ค๋Š” ์žฅ์ ์œผ๋กœ ์ธํ•ด ํ…Œ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ ๋„์ž…

๊ฒฐ๊ณผ

  1. ์ž‘์—… ํ™˜๊ฒฝ๊ณผ ๋™์ผํ•œ DB ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ ์ง„ํ–‰ ๊ฐ€๋Šฅ
  2. ์–ธ์ œ ์–ด๋””์„œ๋‚˜ ๋™์ผํ•œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์ถœ๋ ฅ ๊ฐ€๋Šฅ
  3. TestDB ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„ ๋ฐฉ์ง€
  4. ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์‹œ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋Š” ์ถ”๊ฐ€ ์‹œ๊ฐ„ ๋ฐœ์ƒ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ฐ•์ œํ™”๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ์‹ ๋ขฐ์„ฑ ์ƒ์Šน

image

  1. Build ์‹œ Test๊ฒฐ๊ณผ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด Build๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก Build ์ œํ•œ, ์ด๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์˜ ๊ฐ•์ œํ™” ๋„์ž…

ํ•™์Šต

  • Multipartform์˜ MockMvc, RestTemplate์„ ํ™œ์šฉํ•œ ํ…Œ์ŠคํŠธ
  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ RestTemplate, MockMvc๋ฅผ ํ™œ์šฉํ•œ ํ…Œ์ŠคํŠธ ๋ฐ ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์  ํ•™์Šต
  • ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 70% ์ด์ƒ ๋‹ฌ์„ฑ์„ ์œ„ํ•ด ์•ฝ 300๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ง„ํ–‰ ๋ฐ ์ด๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ์™€ ๋ถˆํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์„ ๋ณ„ํ•˜๋Š” ๊ธฐ์ค€์— ๋Œ€ํ•œ ํ•™์Šต

์ •์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ ์‚ฌ์šฉ์„ ํ†ตํ•œ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ 

  • jacoco + sornaqube ํ™œ์šฉ

๋„์ž… ๋ฐฐ๊ฒฝ

  • ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ง์— ๋”ฐ๋ผ code smell ๋ฐ ๋ณด์•ˆ์ƒ์˜ ์˜ค๋ฅ˜๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌํ•„์š”
  • ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€์˜ ์‹œ๊ฐ์ ์ธ ํ‘œํ˜„ ํ•„์š”

๋„์ž… ํšจ๊ณผ

  1. ํ…Œ์ŠคํŠธ ๋ฏธ์ง„ํ–‰ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋น ๋ฅธ ํ™•์ธ์ด ๊ฐ€๋Šฅ
  2. code smell์˜ ๋น ๋ฅธ ํŒŒ์•…์ด ๊ฐ€๋Šฅ ๋ฐ ์ œ๊ฑฐ ๊ฐ€๋Šฅ
  3. ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ํŠน์ • ์ˆ˜์น˜ ์ดํ•˜์ผ ๊ฒฝ์šฐ Build๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋„๋กํ•ด ํ…Œ์ŠคํŠธ ๊ฐ•์ œํ™” ๊ฐ€๋Šฅ

### ๊ฒฐ๊ณผ 1. ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ œ๊ฑฐ 2. ๋ณด์•ˆ์ƒ์˜ ์ด์Šˆ๊ฐ€ Security Hotspots ์ œ๊ฑฐ 3. ์ฝ”๋“œ ํ’ˆ์ง• ์ƒ์Šน ํšจ๊ณผ ๋ฐœ์ƒ

์ •์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ์˜ ์‚ฌ์šฉ์„ ํ†ตํ•ด ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ์˜ ํ™•์ธ ๋ฐ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ปค๋ฒ„๋ฆฌ์ง€์˜ ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•ด ๋ถ€์กฑํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค sonarqube์˜ ๊ฒฝ์šฐ๋Š” ํ”„๋ฆฌํ‹ฐ์–ด ํ™˜๊ฒฝ์—์„œ EC2์— ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์€ ๋ฌด๋ฆฌ๋ผ๊ณ  ํŒ๋‹จํ•˜์—ฌ LOCAL PC์—์„œ DOCKER๋ฅผ ํ†ตํ•ด ๊ธฐ๋™


Filter๋ฅผ ํ™œ์šฉํ•œ Logging์„ ํ†ตํ•ด Controller์— ์ง„์ž…ํ•˜์ง€ ๋ชปํ•˜๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ์›์ธ ํŒŒ์•…

image

Controller์— ์ง„์ž…ํ•˜์ง€ ๋ชจํ•˜๋Š” EndPoint์— ๋Œ€ํ•œ ์—๋Ÿฌ ์›์ธ์„ ์ฐพ๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„ ์†Œ๋ชจ ๋ฐœ์ƒ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Request์š”์ฒญ์ด Controller์— ์ง„์ž…ํ•˜์ง€ ์•Š์•„๋„ ๋ฌด์กฐ๊ฑด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์— Logging ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ํ•„์š” (AOP ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ) ์ด๋ฅผ ์œ„ํ•ด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” Filter๋ฅผ ํ™œ์šฉํ•ด Logging ์ž‘์—… ๊ตฌํ˜„

๊ฒฐ๊ณผ

EndPoint ์˜คํƒ€๋กœ ์ธํ•œ ์—๋Ÿฌ์˜ ์›์ธ ๋น ๋ฅธ ํŒŒ์•… ๊ฐ€๋Šฅํ•ด ๋งŽ์€ ์ž‘์—… ์‹œ๊ฐ„ ๋‹จ์ถ• ๊ฐ€๋Šฅ

ํ•™์Šต

Filter ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ํ•™์Šต ์ธํ„ฐ์…‰ํ„ฐ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ํ•™์Šต

์„œ๋น„์Šค ๋กœ์ง์— ๋Œ€ํ•œ ๊ตฌํ˜„ ์„ค๋ช…


์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘์— ์˜ํ•œ DB ๋ฐ์ดํ„ฐ ์‚ญ์ œ ์—๋Ÿฌ ํ•ด๊ฒฐ

๋ฌธ์ œ ์›์ธ

ํŠน์ • ํ…Œ์ด๋ธ”์˜ row๋ฅผ ์‚ญ์ œํ•˜๋ ค๊ณ ํ•  ๋•Œ ์™ธ๋ž˜ํ‚ค ์ฐธ์กฐ๋กœ ์ธํ•ด ํ•ด๋‹น row๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋Š” ์—๋Ÿฌ ๋ฐœ์ƒ(์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€๋ฅผ ์œ„ํ•œ ์ฐธ์กฐ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์‚ญ์ œ ๋ถˆ๊ฐ€)

ํ•ด๊ฒฐ

  1. DB์—์„œ ์™ธ๋ž˜ํ‚ค๋ฅผ ์ฒดํฌํ•˜๋Š” ์˜ต์…˜ ์ƒ๋žต
    • ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ
  2. ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋ฏธ๋ฆฌ ๋Š์–ด ์ค€ ๋’ค ์ œ๊ฑฐ (์„ ํƒํ•œ ๋ฐฉ๋ฒ•)

๋ฌธ์ œ ํ•ด๊ฒฐ ๋ธ”๋กœ๊น…

SpringSecurity๋ฅผ ํ†ตํ•œ ์ธ์ฆ ์ธ๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฏธ Google OAuth2 ์ธ์ฆ ๊ตฌํ˜„


HashMap์˜ ํŠน์„ฑ์„ ํ™œ์šฉํ•œ ์„ฑ๋Šฅ ๊ฐœ์„  O(m*n) -> O(n+m)


ํ•™์Šต

  • Controller๋กœ JSON ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด ์–ด๋–ป๊ฒŒ Class๋กœ ๋งคํ•‘์ด ๋˜๋Š”์ง€ ํ•™์Šต(์™œ Dto๋“ค์€ ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•œ๊ฐ€)