์‹ ์ž… ๊ฐœ๋ฐœ์ž ๊ธฐ์ˆ ๋ฉด์ ‘ ์งˆ๋ฌธ ์ •๋ฆฌ - ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ณตํ†ต/๊ธฐํƒ€

๋ชฉ์ฐจ

๐Ÿ’ก Restful API์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

Restful API๋Š” HTTP ํ†ต์‹ ์„ Rest ์„ค๊ณ„ ๊ทœ์น™์„ ์ž˜ ์ง€์ผœ์„œ ๊ฐœ๋ฐœํ•œ API๋ฅผ Restfulํ•œ API๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Rest ์„ค๊ณ„ ๊ทœ์น™์€ URI๋Š” ์ •๋ณด์˜ ์ž์›๋งŒ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๋ฉฐ, ์ž์›์˜ ์ƒํƒœ์™€ ํ–‰์œ„๋Š” HTTP Method์— ๋ช…์‹œํ•˜๋Š”๊ฑธ ๋งํ•ฉ๋‹ˆ๋‹ค.
REST๋ž€? REST API ์™€ RESTful API์˜ ์ฐจ์ด์ ?


๐Ÿ’ก ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

์ด ๋‘˜์˜ ์ฐจ์ด์ ์€ ์ œ์–ด ํ๋ฆ„์— ๋Œ€ํ•œ ์ฃผ๋„๊ถŒ์ด ๋ˆ„๊ตฌ์—๊ฒŒ/์–ด๋””์— ์žˆ๋Š”๊ฐ€์— ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ „์ฒด์ ์ธ ํ๋ฆ„์„ ์ฅ๊ณ  ์žˆ๊ณ , ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ ์•ˆ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ํ๋ฆ„์„ ์ฅ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ๊ฐœ๋ฐœ์ž์˜ ์ œ์–ด๊ถŒ์„ ํ”„๋ ˆ์ž„์›Œํฌ์—๊ฒŒ ๋„˜๊น€์œผ๋กœ์จ ์‹ ๊ฒฝ์จ์•ผํ•  ๊ฒƒ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ,
์ด๋ฅผ ์ œ์–ด์˜ ์—ญ์ „(Inversion of Control)์ด๋ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’ก Call By Value์™€ Call By Reference์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • Call By Value(๊ฐ’์— ์˜ํ•œ ํ˜ธ์ถœ) - ์ธ์ž๋กœ ๋ฐ›์€ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. 
    • ์žฅ์  - ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›๋ž˜์˜ ๊ฐ’์ด ๋ณด์กด๋œ๋‹ค.
    • ๋‹จ์  - ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•œ๋‹ค.
  • Call By Reference(์ฐธ์กฐ์— ์˜ํ•œ ํ˜ธ์ถœ) - ์ธ์ž๋กœ ๋ฐ›์€ ๊ฐ’์˜ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์ง์ ‘ ์ €์žฅํ•ด ๊ฐ’์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. 
    • ์žฅ์  - ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ์ฐธ์กฐํ•˜๊ธฐ์— ๋น ๋ฅด๋‹ค.
    • ๋‹จ์  - ์ง์ ‘ ์ฐธ์กฐ๋ฅผ ํ•˜๊ธฐ์— ์›๋ž˜์˜ ๊ฐ’์ด ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

๐Ÿ’ก ๊ทธ๋Ÿผ Java์—์„œ ์–ด๋А ๋ถ€๋ถ„์ด call by value์ด๊ณ  ์–ด๋А ๋ถ€๋ถ„์ด call by reference์— ํ•ด๋‹นํ•˜๋‚˜์š”?

๋”๋ณด๊ธฐ

Java๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ์ „๋‹ฌ ๋ฐฉ์‹์ด Call by Value ์ž…๋‹ˆ๋‹ค.

์ฐธ์กฐํ˜•์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด์˜ '์ฃผ์†Œ๊ฐ’'์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋‹ˆ call by reference๊ฐ€ ์•„๋‹ˆ๋ƒ๋Š” ์˜๋ฌธ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ,

์ •ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด '์ฃผ์†Œ๊ฐ’'์ด ์•„๋‹ˆ๋ผ, '์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๊ฐ’'์ด๋‹ค.

๋˜ํ•œ, ์ฃผ์†Œ๊ฐ’ ์ž์ฒด๋ฅผ '๋ณต์‚ฌ ์—†์ด' ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ž๊ธฐ ์ž์‹ ์ด ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์ „๋‹ฌํ•œ๋‹ค.

๊ฒฐ๊ตญ ๊ธฐ๋ณธํ˜• ๋ณ€์ˆ˜๋‚˜ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜ ๋ชจ๋‘ ์ž๊ธฐ ์ž์‹ ์ด ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์ „๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— Call by value์ด๋‹ค.


๐Ÿ’ก CORS(๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ , Cross-Origin Resource Sharing)์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

CORS๋ž€ ๋„๋ฉ”์ธ์ด ์„œ๋กœ๋‹ค๋ฅธ 2๊ฐœ์˜ ์‚ฌ์ดํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด domain-a.com โ†” domain-b.com์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„์‹œ ๋”ฐ๋กœ ์„ค์ • ํ•˜์ง€ ์•Š์œผ๋ฉด CORS ์—๋Ÿฌ๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

โ€ป ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ณด์•ˆ ์ƒ์˜ ์ด์œ ๋กœ, ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹œ์ž‘ํ•œ ๊ต์ฐจ ์ถœ์ฒ˜ HTTP ์š”์ฒญ์„ ์ œํ•œํ•œ๋‹ค.


๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์„œ๋ฒ„์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๊ทธ ์ถœ์ฒ˜์—์„œ CORS์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ Response์˜ ํ—ค๋”์— ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Access-Control-Allow-Orgin : ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํŽ˜์ด์ง€์˜ ์ถœ์ฒ˜ [ *, ๋„๋ฉ”์ธ ]
  • Access-Control-Allow-Methods : ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฉ”์†Œ๋“œ. Default : GET, POST
  • Access-Control-Max-Age : ํด๋ผ์ด์–ธํŠธ์—์„œ preflight ์š”์ฒญ (์„œ๋ฒ„์˜ ์‘๋‹ต ๊ฐ€๋Šฅ์—ฌ๋ถ€์— ๋Œ€ํ•œ ํ™•์ธ) ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ์‹œ๊ฐ„
  • Access-Control-Allow-Headers : ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋Š” ํ—ค๋”

๐Ÿ’ก ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • ๋ฌผ์ด ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฅด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ˆœ์ฐจ์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์ค‘์š”์‹œํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค.
    • ๋Œ€ํ‘œ์ ์ธ ์–ธ์–ด๋กœ C์–ธ์–ด๊ฐ€ ์žˆ๋‹ค.
    • ์ปดํ“จํ„ฐ์˜ ์ฒ˜๋ฆฌ๊ตฌ์กฐ์™€ ์œ ์‚ฌํ•ด ์‹คํ–‰์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.
    • ์ฝ”๋“œ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • ์‹ค์ œ ์„ธ๊ณ„์˜ ์‚ฌ๋ฌผ๋“ค์„ ๊ฐ์ฒด๋กœ ๋ชจ๋ธ๋งํ•˜์—ฌ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค.
    • ๋Œ€ํ‘œ์ ์ธ ์–ธ์–ด๋กœ Java๊ฐ€ ์žˆ๋‹ค.
    • ์บก์Аํ™”, ์ƒ์†, ๋‹คํ˜•์„ฑ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ธฐ๋ฒ•์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ ˆ์ฐจ์ง€ํ–ฅ ์–ธ์–ด๋ณด๋‹ค ์‹คํ–‰์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค.

์ ˆ์ฐจ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ธฐ๋Šฅ์ค‘์‹ฌ์œผ๋กœ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœ "๋ฌด์—‡์„ ์–ด๋–ค ์ ˆ์ฐจ๋กœ ํ•  ๊ฒƒ์ธ๊ฐ€?"๊ฐ€ ํ•ต์‹ฌ์ด ๋˜๋ฉฐ,

์–ด๋–ค ๊ธฐ๋Šฅ์„ ์–ด๋–ค ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฐ€์— ๋Œ€ํ•ด ์ดˆ์ ์„ ๋งž์ถ”๊ณ , 

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ธฐ๋Šฅ์ด ์•„๋‹Œ ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœ "๋ˆ„๊ฐ€ ์–ด๋–ค ์ผ์„ ํ•  ๊ฒƒ์ธ๊ฐ€?"๊ฐ€ ํ•ต์‹ฌ์ด๋ฉฐ,

๊ฐ์ฒด๋ฅผ ๋„์ถœํ•˜๊ณ  ๊ฐ๊ฐ์˜ ์—ญํ• ์„ ์ •์˜ํ•ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋‘”๋‹ค.


๐Ÿ’ก OAuth 2.0์˜ ํ๋ฆ„์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

etc-image-0
  1. ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ผ์ด์–ธํŠธ(์ดํ•˜ ํด๋ผ)์—๊ฒŒ ์‚ฌ์šฉ ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  2. ํด๋ผ๋Š” ๊ถŒํ•œ ์„œ๋ฒ„์— ๊ถŒํ•œ ๋ถ€์—ฌ ์Šน์ธ ์ฝ”๋“œ ์š”์ฒญ(response_type=code๋กœ ์ง€์ •ํ•˜์—ฌ ์š”์ฒญ)์„ ๋ณด๋‚ธ๋‹ค.
  3. ์ดํ›„ ํด๋ผ๋Š” ๊ถŒํ•œ ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๋„์›Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค.
  4. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ํ•˜๋ฉด ๊ถŒํ•œ ์„œ๋ฒ„๋Š” (2)๊ถŒํ•œ ๋ถ€์—ฌ ์Šน์ธ ์ฝ”๋“œ ์š”์ฒญ์— ์ „๋‹ฌ๋ฐ›์€ redirect_url๋กœ Authorization Code๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  5. Authorization Code๋Š” ๊ถŒํ•œ ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ํ†ตํ•ด Access Token์œผ๋กœ ๊ตํ™˜๋œ๋‹ค.

๐Ÿ’ก ๋™์  ์ฟผ๋ฆฌ๋ž€ ๋ฌด์—‡์ด๊ณ  ์–ธ์ œ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜์š”?

๋™์  ์ฟผ๋ฆฌ๋ž€ ์‹คํ–‰์‹œ์— ํŠน์ • ์กฐ๊ฑด์ด๋‚˜ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ฟผ๋ฆฌ ๋ฌธ์žฅ์ด ๋ณ€๊ฒฝ๋˜์–ด ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ์‹œ์— SQL ๋ฌธ์žฅ์„ ํ™•์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์‹œ์ ์— ๋”ฐ๋ผ where์ ˆ์— ์กฐ๊ฑด์ด ๋‹ฌ๋ผ์งˆ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ๋ฌธ์ด ๋ณ€ํ•˜๋ƒ ๋ณ€ํ•˜์ง€ ์•Š๋А๋ƒ์— ๋”ฐ๋ผ ์ •์ ์ฟผ๋ฆฌ/๋™์ ์ฟผ๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ’ก CSRF(Cross-site request forgery)์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ณ , ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

์‚ฌ์ดํŠธ ๊ฐ„ ์š”์ฒญ ์œ„์กฐ์˜ ์•ฝ์ž๋กœ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ทจ์•ฝ์  ์ค‘ ํ•˜๋‚˜๋กœ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ๋Œ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ํ–‰๋™ํ•˜๊ฒŒ ํ•˜์—ฌ ํŠน์ • ์›นํŽ˜์ด์ง€๋ฅผ ๋ณด์•ˆ์— ์ทจ์•ฝํ•˜๊ฒŒ ํ•œ๋‹ค๊ฑฐ๋‚˜ ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์˜ ์ž‘์—…์„ ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ณต๊ฒฉ ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

1. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— referrer๋ฅผ ํ™•์ธํ•˜์—ฌ ๋„๋ฉ”์ธ์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณต๊ฒฉ์„ ๋ฐฉ์–ด

โ€ป ์š”์ฒญ ํ—ค๋”(request header)์—์„œ referrer ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ
โ€ป ๊ฐ™์€ ๋„๋ฉ”์ธ์—์„œ ๋“ค์–ด์˜ค๋Š” ์ ‘์†์€ ํ—ˆ์šฉํ•˜๋‚˜ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์—์„œ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ์ฐจ๋‹จํ•˜๋Š” ๊ฐœ๋…


2. ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋Š” POST, PUT ๋“ฑ์˜ ์š”์ฒญ์— ๋Œ€ํ•ด csrf ํ† ํฐ์ด ํฌํ•จ๋˜์–ด์•ผ๋งŒ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ณต๊ฒฉ์„ ๋ฐฉ์–ด

CSRF ๊ณต๊ฒฉ๊ณผ์ •

- 2008๋…„๋„์— ์žˆ์—ˆ๋˜ ์˜ฅ์…˜ ํ•ดํ‚น ์‚ฌ๊ณ ๋„ CSRF ๊ณต๊ฒฉ์„ ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.
(ํ•ด์ปค๊ฐ€ ์˜ฅ์…˜ ์šด์˜์ž์—๊ฒŒ CSRF ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋œ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด์„œ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ์–ป์–ด๋ƒˆ๋‹ค)

 
...
 
<img src="http://auction.com/changeUserAcoount?id=admin&password=admin" width="0" height="0">
 
...

1. ์˜ฅ์…˜ ๊ด€๋ฆฌ์ž ์ค‘ ํ•œ ๋ช…์ด ๊ถŒํ•œ์„ ๊ฐ€์ง„์ฑ„ ํšŒ์‚ฌ ๋‚ด์—์„œ ์ž‘์—…์„ ํ•˜๋˜ ์ค‘ ๋ฉ”์ผ์„ ์กฐํšŒํ•œ๋‹ค. (๋กœ๊ทธ์ธ์ด ๋˜์–ด์žˆ์œผ๋‹ˆ ๊ด€๋ฆฌ์ž๋กœ์„œ์˜ ์œ ํšจํ•œ ์ฟ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ)
2. ํ•ด์ปค๋Š” ์œ„์™€ ๊ฐ™์ด ํƒœ๊ทธ๊ฐ€ ๋“ค์–ด๊ฐ„ ์ฝ”๋“œ๊ฐ€ ๋‹ด๊ธด ์ด๋ฉ”์ผ์„ ๋ณด๋‚ธ๋‹ค.
3. ๊ด€๋ฆฌ์ž๊ฐ€ ์ด๋ฉ”์ผ์„ ์—ด์–ด๋ณผ ๋•Œ, ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด ์œ„ URL์ด ์—ด๋ฆฐ๋‹ค.
4. ํ•ด์ปค๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ๊ด€๋ฆฌ์ž ๊ณ„์ • id์™€ pw๊ฐ€ admin์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.


๐Ÿ’ก ๋Œ€์นญํ‚ค, ๋น„๋Œ€์นญํ‚ค ์•”ํ˜ธํ™” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋Œ€์นญํ‚ค์™€ ๋น„๋Œ€์นญํ‚ค๋Š” ์–‘๋ฐฉํ–ฅ ์•”ํ˜ธํ™” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๋Œ€์นญํ‚ค๋Š” ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”์— ๊ฐ™์€ ์•”ํ˜ธ ํ‚ค๋ฅผ ์“ฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
์ด๋Š” ์ค‘๊ฐ„์— ๋ˆ„๊ตฐ๊ฐ€ ์•”ํ˜ธํ‚ค๋ฅผ ๊ฐ€๋กœ์ฑ„๋ฉด ์ •๋ณด๊ฐ€ ์œ ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋Š”๋ฐ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ ๋ฐฉ์‹์ด ๋ฐ”๋กœ ๋น„๋Œ€์นญํ‚ค ์ž…๋‹ˆ๋‹ค.

๋น„๋Œ€์นญํ‚ค๋Š” ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”ํ•  ๋•Œ ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๋ฅผ ์“ฐ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
ํƒ€์ธ์—๊ฒŒ ์ ˆ๋Œ€ ๋…ธ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ๋˜๋Š” ๊ฐœ์ธํ‚ค์™€ ๊ณต๊ฐœ์ ์œผ๋กœ ๊ฐœ๋ฐฉ๋˜์–ด ์žˆ๋Š” ๊ณต๊ฐœํ‚ค๋ฅผ ์Œ์œผ๋กœ ์ด๋ฃฌ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.


๐Ÿ’ก TDD(Test-Driven-Development)์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

TDD๋ž€ ์ž‘์€ ๋‹จ์œ„์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ทธ์— ๋งž๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•œ ํ›„์—
์ƒํ™ฉ์— ๋งž๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฐ˜๋ณต์ ์ธ ๋‹จ๊ณ„๊ฐ€ ์ง„ํ–‰๋˜๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ๊ฐ€ ์ค„์–ด๋“ค๊ณ , ์ฝ”๋“œ๋Š” ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

TDD๋Š” ๋ ˆ๋“œ ๊ทธ๋ฆฐ ์‚ฌ์ดํด์ด๋ผ๋Š” 3๊ฐ€์ง€ ๊ณผ์ •์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

  1. Red : ์–ด๋– ํ•œ ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์‹ค์ œ๋กœ ์‹คํŒจํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  2. Green : ์–ด๋– ํ•œ ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ํ†ต๊ณผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์‹ค์ œ๋กœ ์„ฑ๊ณตํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  3. Refactor : ์•ž์— ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ์™€ ์„ฑ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ๊ฒ€์ฆํ–ˆ๋‹ค๋ฉด, ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๊นจ๋—ํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ๊ณ ์นœ๋‹ค.
  4. Repeat : ์ด ์„ธ ๊ฐ€์ง€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์™„์„ฑํ•œ๋‹ค.

๐Ÿ’ก ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ํ•ด์•ผํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

1. ๊ธฐ๋Šฅ์˜ ์ถ”๊ฐ€, ๋ณ€๊ฒฝ, ์‚ญ์ œ๋กœ ์ธํ•œ ์˜ํ–ฅ๋„๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•… ๊ฐ€๋Šฅ

2. ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์œ„ํ•ด

3. ์ข‹์€ ์„ค๊ณ„๋กœ ์ž‘์„ฑ๋˜๊ฒŒ๋” ์ฝ”๋“œ๋ฅผ ์œ ๋„

4. ๊ธฐ๋Šฅ ์ •์˜์˜ ๋ฌธ์„œ์˜ ์—ญํ• 

5. ์‹ค์ˆ˜๋ฅผ ์ค„์—ฌ์ค€๋‹ค.


๐Ÿ’ก DDD(Domain-Driven-Design)์—์„œ ์–˜๊ธฐํ•˜๋Š” ๊ณ„์ธต๊ณผ ๊ฐ๊ฐ์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.

  • ํ‘œํ˜„ ๊ณ„์ธต(Presentation layer) : ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋Œ€ํ•ด ํ•ด์„ํ•˜๊ณ  ์‘๋‹ตํ•˜๋Š” ์ผ์„ ์ฑ…์ž„์ง€๋Š” ๊ณ„์ธต (Controller)
    • Client๋กœ๋ถ€ํ„ฐ request๋ฅผ ๋ฐ›๊ณ  response๋ฅผ return ํ•˜๋Š” API ์ •์˜
  • ์‘์šฉ ๊ณ„์ธต(Application layer) : ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ •์˜ํ•˜๊ณ  ์ •์ƒ์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋„๋ฉ”์ธ ๊ณ„์ธต๊ณผ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ณ„์ธต (Service)
    • transaction ๊ด€๋ฆฌ, DTO ๋ณ€ํ™˜, ๋ชจ๋“ˆ๊ฐ„์˜ ์—ฐ๊ณ„๋ฅผ ์ง„ํ–‰
  • ๋„๋ฉ”์ธ ๊ณ„์ธต(Domain layer) : ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™, ์ •๋ณด์— ๋Œ€ํ•œ ์‹ค์งˆ์ ์ธ ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ด ๋ชจ๋“ ๊ฒƒ์„ ์ฑ…์ž„์ง€๋Š” ๊ณ„์ธต (Entity)
    • Entity๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„๋ฉ”์ธ ๋กœ์ง์ด ์ง„ํ–‰๋œ๋‹ค.
    • ์—…๋ฌด ์ƒํ™ฉ์„ ๋ฐ˜์˜ํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์ œ์–ดํ•˜๋Š” ์—ญํ• ์— ์ง‘์ค‘ํ•˜๋Š” ๊ณ„์ธต
  • ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜ ๊ณ„์ธต(Infrastructure layer) : ์™ธ๋ถ€์™€์˜ ํ†ต์‹ (ORM, DB, NoSQL)์„ ๋‹ด๋‹นํ•˜๋Š” ๊ณ„์ธต (Repository)
    • ํ•ด๋‹น ๊ณ„์ธต์—์„œ ์–ป์–ด์˜จ ์ •๋ณด๋ฅผ ์‘์šฉ ๊ณ„์ธต ๋˜๋Š” ๋„๋ฉ”์ธ ๊ณ„์ธต์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ์ฃผ ์—ญํ• ๋กœ ๋‹ด๋‹น

DDD(Domain-Driven-Design) ๊ณ„์ธต๊ตฌ์กฐ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ


๐Ÿ’ก MSA(Microservice Architecture)๊ฐ€ ๋ญ”์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

MSA๋Š” 1๊ฐœ์˜ ์‹œ์Šคํ…œ์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๋Š” API๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉฐ 1๊ฐœ์˜ ํฐ ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ํ•œ ํ”„๋กœ์ ํŠธ์— ํ†ตํ•ฉ๋˜์–ด ์žˆ๋Š” Monolithic Architecture(๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ณ)์˜ ํ•œ๊ณ„์ ์„ ๊ทน๋ณตํ•˜๊ณ ์ž ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

etc-image-1
https://mangkyu.tistory.com/88
  • ์žฅ์ 
    • ์ผ๋ถ€ ์„œ๋น„์Šค์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ „์ฒด ์„œ๋น„์Šค์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค.
    • ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค๋“ค์€ ์„œ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด์™€ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.
    • ์„œ๋น„์Šค์˜ ํ™•์žฅ์ด ์šฉ์ดํ•˜๋‹ค.
  • ๋‹จ์ 
    • ์„œ๋น„์Šค๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด ํ…Œ์ŠคํŠธ๋‚˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋“ฑ์ด ์–ด๋ ต๋‹ค.
    • ์„œ๋น„์Šค ๊ฐ„์— API๋กœ ํ†ต์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ์— ๋Œ€ํ•œ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.
    • ์„œ๋น„์Šค ๊ฐ„์˜ ํ˜ธ์ถœ์ด ์—ฐ์†์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น… ๋ฐ ์—๋Ÿฌ ํŠธ๋ ˆ์ด์‹ฑ์ด ์–ด๋ ต๋‹ค.

 

 

์ถœ์ฒ˜: https://dev-coco.tistory.com/164 [์Šฌ๊ธฐ๋กœ์šด ๊ฐœ๋ฐœ์ƒํ™œ:ํ‹ฐ์Šคํ† ๋ฆฌ]