Java ๋ฌธ๋ฒ• ๊นŒ๋จน์„ ๋ฒ•ํ•œ๊ฑฐ ๋ฉ”๋ชจ.
ยท
๊ธฐ์ˆ  ๋ฆฌ๋งˆ์ธ๋“œ
์‚ผํ•ญ ์—ฐ์‚ฐ์ž (์‹) ? ์ฐธ์ผ๋•Œ : ๊ฑฐ์ง“์ผ๋•Œ ๋Œ€๋ฌธ์ž, ์†Œ๋ฌธ์žto.UpperCase();toLowerCase(); ์ˆซ์ž -> ๋ฌธ์ž์—ดString.valueOf(); ๋ฌธ์ž์—ด -> ์ˆซ์žpareseIt
JWT ์ธ์ฆ ๋ฐฉ์‹
ยท
ํ”„๋กœ์ ํŠธ/CrewPlanner
1. ์ „์ฒด ํ๋ฆ„ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ ๋กœ๊ทธ์ธ ์š”์ฒญ ↓[ํ”„๋ก ํŠธ] → POST /api/auth/login (email + password) ↓[๋ฐฑ์—”๋“œ] → ์„ฑ๊ณต ์‹œ JSON ์‘๋‹ต{ "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxx", // 15~60๋ถ„ "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.yyyy" // 7~30์ผ} ↓[ํ”„๋ก ํŠธ] → localStorage์— ๋‘˜ ๋‹ค ์ €์žฅ ↓์ดํ›„ ๋ชจ๋“  API ์š”์ฒญ → ํ—ค๋”์— Authorization: Bearer {accessToken} ๋ถ™์—ฌ์„œ ์ „์†ก ↓accessToken ๋งŒ๋ฃŒ (401) → ์ €์žฅ๋œ refreshToken์œผ๋กœ ..
CORS ์˜ค๋ฅ˜
ยท
ํ”„๋กœ์ ํŠธ/CrewPlanner
1. ๋ฌธ์ œ ์ƒํ™ฉ๋กœ์ปฌ์—์„œ ํ”„๋ก ํŠธ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œํ”„๋ก ํŠธ ์„œ๋ฒ„์—์„œ๋Š” Fetch ๋ฅผ ๋ณด๋ƒˆ์œผ๋‚˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ 500 Error ๋ฅผ ๋ฐ›๊ณ  ์žˆ๊ณ  ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ๋Š” Security ์„ค์ •์œผ๋กœ ์ธํ•ด ์ปจํŠธ๋กค๋Ÿฌ ์กฐ์ฐจ ์ง„์ž… ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค.์ •์ƒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์ปจํŠธ๋กค๋Ÿฌ์— ์žˆ๋Š” info ๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค. ( ์•„๋ž˜์˜ ๋กœ๊ทธ ! )2. ๋ฌธ์ œ ๋ถ„์„์ปจํŠธ๋กค๋Ÿฌ ์•ž๋‹จ์—์„œ ์ฐํžˆ๋Š” ๊ฒƒ.์ด๋Ÿฐ ๊ฑด Cors ๋ฌธ์ œ์ธ๋ฐ, ํ•ด๋‹น Cors ๋ฅผ ์—ด์–ด์ฃผ๋Š” Security Config ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.httpSecurity // ์ด ๋ถ€๋ถ„์ด Cors ์„ค์ • ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„ ! .cors(cors -> cors.configurationSource(corsConfigurationSource())) .csrf(csrf..
[CrewProject] ํŒจํ‚ค์ง€ ๊ตฌ์กฐ
ยท
ํ”„๋กœ์ ํŠธ/CrewPlanner
ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๊ฐ€ ํ—ท๊ฐˆ๋ฆด ๋•Œ๋งˆ๋‹ค ์ฐธ๊ณ ํ•˜๊ธฐ ์œ„ํ•ด ํฌ์ŠคํŒ…์„ ํ•œ๋‹ค ! com.example.shiftmate โ”œโ”€ domain โ”‚ โ”œโ”€ business โ”‚ โ”œโ”€ employee โ”‚ โ”œโ”€ schedule โ”‚ โ””โ”€ ... โ”‚ โ”œโ”€ application โ”‚ โ”œโ”€ business โ”‚ โ”œโ”€ employee โ”‚ โ”œโ”€ schedule โ”‚ โ””โ”€ ... โ”‚ โ”œโ”€ infra โ”‚ โ”œโ”€ jpa โ”‚ โ”‚ โ”œโ”€ business โ”‚ โ”‚ โ”œโ”€ employee โ”‚ โ”‚ โ”œโ”€ schedule โ”‚ โ”‚ โ””โ”€ ... โ”‚ โ””โ”€ config โ”‚ โ””โ”€ presentation โ”œโ”€ web // Mustache Controlle..
[CrewPlanner] ํ”„๋กœ์ ํŠธ ๊ธฐํš
ยท
ํ”„๋กœ์ ํŠธ/CrewPlanner
1. ํ”„๋กœ์ ํŠธ ๊ฐœ์š”ํ”„๋กœ์ ํŠธ ๋ช… : CrewPlannerํ•œ์ค„์†Œ๊ฐœ : ์ž์˜์—…์ž๋ฅผ ์œ„ํ•œ ๊ทผ๋ฌด์ผ์ •·์‹œ๊ธ‰·๊ทผ๋ฌด์‹œ๊ฐ„ ํ†ตํ•ฉ ๊ด€๋ฆฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ชฉ์  : " ์ž์˜์—…์ž๋“ค์ด ์•Œ๋ฐ” ๋ฐ ์ผ์šฉ์ง์„ ๊ณ ์šฉํ•  ๋•Œ, ์‰ฌ์šด ์Šค์ผ€์ค„๋ง์„ ์œ„ํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋ณด๊ณ ์ž ํ•จ. "ํ•ต์‹ฌ๊ฐ€์น˜ : " ํ˜„์žฅ, ์ผํ•œ ๋‚ด์šฉ, ์ผ๊ธ‰ ๋ฐ ์‹œ๊ธ‰, ์ผํ•œ ์‹œ๊ฐ„ ๋“ฑ์„ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ์Œ "์ธ์› ๊ตฌ์„ฑ : ํ˜ผ์ž ^ใ…ก^ . ์ผ๋‹จ์€ ๋ฐฑ + ํ”„๋ก ํŠธ ๊ฐ™์ดํ•  ์˜ˆ์ • 2. ๊ธฐํš๋ชฉํ‘œ| ๊ฐ€์กฑ์ด ์ž์˜์—…์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋งค๋ฒˆ ์ผ์šฉ์ง๊ด€๋ฆฌ์—์„œ ๋ถˆํŽธํ•จ์„ ๊ฒช๊ณ  ์žˆ์Œ. => ์œ ๋ฃŒ์•ฑ์ด ์žˆ์œผ๋‚˜, ๋‚˜๋„ ๊ฐ€์กฑ์ผ์„ ๋•๋‹ค๋ณด๋‹ˆ ์ด๋Ÿฌํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋ณด๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ฒŒ ๋จ.- ํ˜„์žฅ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•จ. ํ˜„์žฅ์—์„œ ํ–ˆ๋˜ ์ผ์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•˜๋ฉฐ, ์žฅ๋น„ ๋“ฑ๋ก๊ฐ™์€๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ข‹์„ ๊ฑฐ ๊ฐ™์Œ...
Solid ์ •์ฑ…
ยท
๊ธฐ์ˆ  ๋ฆฌ๋งˆ์ธ๋“œ
2025.06.13 - [๋ฐฑ์—”๋“œ ๋ถ€ํŠธ์บ ํ”„/TIL] - [๋‚ด์ผ๋ฐฐ์›€์บ ํ”„Spring-80์ผ์ฐจ] SOLID ์›์น™1. Solid ์ •์ฑ…์ด ๋ญ”๊ฐ€์š” ? ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(OOP)์—์„œ ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ, ํ™•์žฅ์„ฑ, ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ 5๊ฐ€์ง€ ์„ค๊ณ„ ์›์น™์˜ ์•ฝ์ž์ด๋‹ค.์‹ค์ œ ์ฝ”๋“œ์—์„œ SOLID๋ฅผ ์ ์šฉํ•˜๋ฉด ๋ฒ„๊ทธ๊ฐ€ ์ ๊ณ , ๋ณ€๊ฒฝ์ด ์‰ฌ์šด ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š”๋ฐ, ํ•œ๋ฒˆ ๋ฆฌ๋งˆ์ธ๋“œ ํ•ด๋ณด์ž ^ใ…ก^ 2. SRP : Single Responsibility Principle ๋‹จ์ผ ์ฑ…์ž„ ์›์น™- " ํ•œ ํด๋ž˜์Šค๋‚˜ ๋ชจ๋“ˆ์€ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. " => ๋ณ€๊ฒฝ ์ด์œ ๊ฐ€ ํ•˜๋‚˜ 3. OCP : Open Closed Principle ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™- " ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๊ณ , ์ˆ˜์ •์—๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค. " = ๊ธฐ์กด์ฝ”๋“œ๋ฅผ ๋ฐ”๊ตฌ์ง€ ์•Š๊ณ  ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ..
Redis
ยท
๊ธฐ์ˆ  ๋ฆฌ๋งˆ์ธ๋“œ
1๏ธโƒฃ What — ๊ฐœ๋…Redis ๋Š” Key-value (ํ‚ค์™€๊ฐ’) ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์ด๋‹ค.์ดˆ๊ณ ์† ์ฝ๊ธฐ/์“ฐ๊ธฐ์™€ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•˜๋Š” NoSQL ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์ด๋‹ค. Ram (์ธ๋ฉ”๋ชจ๋ฆฌ) ๊ณผ Disk ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์•Œ๊ณ  ๊ฐ€์•ผํ•œ๋‹ค.Ram ์˜ ๊ฒฝ์šฐ์—๋Š” ๋น ๋ฅด์ง€๋งŒ, ๋น„์‹ธ๊ณ , ๊บผ์ง€๋ฉด ๋‚ ์•„๊ฐ€๊ณ , ์šฉ๋Ÿ‰์ด ์ž‘๋‹ค. Disk ์˜ ๊ฒฝ์šฐ์—๋Š” ๋А๋ฆฌ์ง€๋งŒ, Ram ์— ๋น„ํ•ด ์ €๋ ดํ•˜๋ฉฐ, ๊บผ์ ธ๋„ ๋‚ ์•„๊ฐ€์ง€ ์•Š๊ณ  ์šฉ๋Ÿ‰์ด ํฌ๋‹ค.Disk ์—์„œ๋„ HDD ์™€ SSD ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, HDD ๋Š” ์ €๋ ด, ๋А๋ฆผ, ์šฉ๋Ÿ‰์ด ํผ์ด๊ณ  SSD ๋Š” ๋น„์Œˆ, ๋น ๋ฆ„, ์šฉ๋Ÿ‰ ์ž‘์Œ ์ด๋‹ค. RamSSD - ์ „์ž์‹ ํ”Œ๋ž˜์‹œ๋ฉ”๋ชจ๋ฆฌ HDD - ๊ธฐ๊ณ„์‹ ์ž์„ ๋””์Šคํฌ์ €์žฅ ์œ„์น˜๋ฉ”์ธ๋ณด๋“œM.2 / SATA3.5์ธ์น˜์†๋„ (์ฝ๊ธฐ)100,000 MB/s7,000 MB..
JWT Token ์ธ์ฆ ๋ฐฉ์‹์ผ ๋•Œ, Security Context ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋„์ž…ํ•˜๊ธฐ !
ยท
ํ”„๋กœ์ ํŠธ/์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ
1. Spring Security ์ธ์ฆ๋ฐฉ์‹ ๊ฐœ์š”- ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์‚ฌ์šฉ ์ค‘์ด๋‹ค. -> JWT ๊ธฐ๋ฐ˜์ด๋ฉด ์š”์ฒญ๋งˆ๋‹ค AuthenticationManager๋ฅผ ๋Œ๋ฆด ํ•„์š”๊ฐ€ ์—†๊ณ , ํ—ค๋”์˜ JWT๋ฅผ ๊ฒ€์ฆํ•ด์„œ SecurityContext์— Authentication์„ ์ง์ ‘ ์„ธํŒ…ํ•˜๋ฉด ๋ !- ๋กœ๊ทธ์ธ ์‹œ, AccessToken ๊ณผ Refresh Token ์ด ๋ฐœ๊ธ‰๋œ๋‹ค.- ๋ชจ๋“  ์š”์ฒญ์€ Authorization: Beaer ํ—ค๋”๋ฅผ ํ†ตํ•ด์„œ ์ธ์ฆ์ด ๋œ๋‹ค.- ํ•„ํ„ฐ(JwtAuthenticationFilter)์—์„œ ํ† ํฐ์„ ํŒŒ์‹ฑํ•˜์—ฌ SecurityContext์— ์ธ์ฆ ์ •๋ณด ์ €์žฅํ•˜๋Š” ํ๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.์•„๋ž˜๋Š” ํ† ํฐ ์†์˜ ์ •๋ณด๋ฅผ ํ†ตํ•ด์„œ Authentication ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.private Auth..
Spring Security ROLE ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ ๐Ÿง
ยท
ํ”„๋กœ์ ํŠธ/์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ
JWT TOKEN + Spring Security ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ ์ธ๊ฐ€๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค.์ด์ค‘์— ๊ณ ๋ฏผ๋˜๋Š” ๊ฒƒ์ค‘ ํ•˜๋‚˜ ! ๋ฐ”๋กœ ๊ด€์Šต์„ ๋”ฐ๋ฅผ ๊ฒƒ์ธ๊ฐ€? ์•„๋‹ˆ๋ฉด ํŽธ์˜๋ฅผ ๋”ฐ๋ฅผ ๊ฒƒ์ธ๊ฐ€ ? Spring Security ๊ฐ™์€ ๊ฒฝ์šฐ ์˜ˆ์ „ ๋ถ€ํ„ฐ ๋ฌธ์„œ ์ƒ˜ํ”Œ์ฝ”๋“œ ๋Œ€๋ถ€๋ถ„์ด `hasRole` ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค.์ด๋•Œ hasRole ์€ role ์•ž์— ํ•ญ์ƒ ํ”„๋ฆฌํ”ฝ์Šค๋กœ "ROLE_" ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.์ด๋ ‡๊ฒŒ ๋˜๋ฉด, Token Provider ๊ณผ JwtFilter ์—๋‹ค๊ฐ€ ์‹ ๊ฒฝ์จ์„œ ROLE_ ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ์ง€์ผœ์ค˜์•ผ ํ•œ๋‹ค. ROLE_ ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ๊ตณ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์žˆ๋‹ค. ๋ฐ”๋กœ hasAuthority ์ด๋‹ค. ์ด๊ฑฐ๋Š” ๋”ฐ๋กœ ์ ‘๋‘์‚ฌ ๋ฐ ๋ณ€ํ™˜ ์ž‘์—…์ด ํ•„์š”์—†๋‹ค. ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด !๊ด€์Šต(hasRole)์žฅ์ Spring Security..
Jwt Filter ํ๋ฆ„ ์ˆœ์„œ
ยท
ํ”„๋กœ์ ํŠธ/์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ
Spring Security์˜ SecurityContext ์•ˆ์— "ํ˜„์žฌ ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž"๋ฅผ ์‹ฌ์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.์š”์ฒญ์ด ๋“ค์–ด์˜ดํ—ค๋”์— Authorization: Bearer ๊ฐ’์ด ์žˆ์Œ.Filter์—์„œ ํ† ํฐ ์ถ”์ถœTokenResolver ๊ฐ™์€ ๊ฑธ๋กœ token๋งŒ ๊บผ๋ƒ„.ํ† ํฐ ๊ฒ€์ฆ/ํŒŒ์‹ฑJwtTokenProvider.validate(token) → ์œ ํšจ์„ฑ ์ฒดํฌJwtTokenProvider.getClaims(token) → Claims ๊ฐ์ฒด ๊บผ๋ƒ„ (sub, roles ๋“ฑ)Authentication ๊ฐ์ฒด ์ƒ์„ฑClaims์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ๊บผ๋‚ด์„œ → UsernamePasswordAuthenticationToken ๊ฐ™์€ ๊ฑธ ๋งŒ๋“ฆ.์ด ๊ฐ์ฒด ์•ˆ์—๋Š” Principal(์œ ์ € ์ •๋ณด)์™€ Authorities(๊ถŒํ•œ ๋ชฉ๋ก)์ด ๋“ค์–ด๊ฐ.Authen..