diff --git a/keyword/chapter01/keyword.md b/keyword/chapter01/keyword.md index 923c998..4965221 100644 --- a/keyword/chapter01/keyword.md +++ b/keyword/chapter01/keyword.md @@ -1,29 +1,42 @@ ## ๐ŸŽฏํ•ต์‹ฌ ํ‚ค์›Œ๋“œ --- + ***1. ์™ธ๋ž˜ํ‚ค*** ์™ธ๋ž˜ํ‚ค : FK. ํ…Œ์ด๋ธ”๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ผ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค๋ฅผ ์ฐธ์กฐํ•ด ์™ธ๋ž˜ํ‚ค๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, ํ•œ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ํ‚ค๋Š” ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธํ‚ค์ค‘ ํ•˜๋‚˜๋‹ค. + ์‚ฌ์‹ค ์™ธ๋ž˜ํ‚ค ์„ค์ •์„ ๋”ฐ๋กœ ํ•˜์ง€ ์•Š์•„๋„ ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ตณ์ด ํ•˜๋Š” ์ด์œ ๋Š” ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋•Œ๋ฌธ์ด๋‹ค. + ๋ฌด๊ฒฐ์„ฑ: ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ญ์ƒ ์ •ํ™•ํ•œ ๊ฐ’์„ ์œ ์ง€ํ•˜๋Š” ์„ฑ์งˆ + ๋‘ ํ…Œ์ด๋ธ”์ค‘ ์™ผ์ชฝ ํ…Œ์ด๋ธ”์—์„œ A๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”๋ฐ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ A๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์„ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ž˜ํ‚ค๊ฐ€ ์กด์žฌํ•œ๋‹ค. + --- ***2. ๊ธฐ๋ณธํ‚ค*** ๊ธฐ๋ณธํ‚ค : PK. ํ…Œ์ด๋ธ”์—์„œ ๊ฐ ํ–‰์˜ ์ •๋ณด๋“ค์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. -PK๋Š” ํ…Œ์ด๋ธ” ํ–‰์˜ ์—ฌ๋Ÿฌ ์ •๋ณด๋“ค ์ค‘ ํ–‰์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๋•Œ๋ฌธ์— ๋น„์–ด์žˆ์œผ๋ฉด ์•ˆ๋˜๊ณ (NOT NULL) ์ค‘๋ณต๋˜์–ด์„œ๋„ ์•ˆ๋œ๋‹ค(Unique). ๊ทธ๋ฆฌ๊ณ  ์‹๋ณ„์„ ํ•  ๋•Œ ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋ฅผ ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐ„๋‹จํ•œ ์ •๋ณด์ผ ์ˆ˜๋ก ์ข‹๋‹ค. + +PK๋Š” ํ…Œ์ด๋ธ” ํ–‰์˜ ์—ฌ๋Ÿฌ ์ •๋ณด๋“ค ์ค‘ ํ–‰์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๋•Œ๋ฌธ์— ๋น„์–ด์žˆ์œผ๋ฉด ์•ˆ๋˜๊ณ (NOT NULL) ์ค‘๋ณต๋˜์–ด์„œ๋„ ์•ˆ๋œ๋‹ค(Unique). +๊ทธ๋ฆฌ๊ณ  ์‹๋ณ„์„ ํ•  ๋•Œ ํ…Œ์ด๋ธ”์˜ ์ •๋ณด๋ฅผ ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๊ฐ„๋‹จํ•œ ์ •๋ณด์ผ ์ˆ˜๋ก ์ข‹๋‹ค. + --- ***3. ER ๋‹ค์ด์–ด๊ทธ๋žจ*** ER ๋‹ค์ด์–ด๊ทธ๋žจ : ERD. ๊ฐœ์ฒด ๊ด€๊ณ„ ๋ชจ๋ธ๋ง, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์„ค๊ณ„๋ฅผ ์œ„ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์„ ๋งํ•œ๋‹ค. + ์ฆ‰ ๊ฐœ์ฒด-๊ด€๊ณ„ ๋ชจ๋ธ, ํ…Œ์ด๋ธ”๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•ด์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” DB์˜ ๊ตฌ์กฐ๋ฅผ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. + API๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋ฝ‘์•„๋‚ด๊ธฐ ์œ„ํ•œ ๋ชจ๋ธ ๊ตฌ์กฐ๋„๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. + ์ง์‚ฌ๊ฐํ˜•, ๋‹ค์ด์•„๋ชฌ๋“œ, ํƒ€์›ํ˜• ๋ฐ ์—ฐ๊ฒฐ์„ ๊ณผ ๊ฐ™์€ ์ •์˜๋œ ๊ธฐํ˜ธ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ Entity, Relationships ๋ฐ ํ•ด๋‹น ์†์„ฑ์˜ ์ƒํ˜ธ ์—ฐ๊ฒฐ์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. + ๊ฐœ์ฒด๋ฅผ ๋ช…์‚ฌ๋กœ, ๊ด€๊ณ„๋ฅผ ๋™์‚ฌ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ๋ฒ• ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•œ๋‹ค. + --- @@ -31,8 +44,10 @@ API๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋ฝ‘์•„๋‚ด๊ธฐ ์œ„ํ•œ ๋ชจ๋ธ ๊ตฌ์กฐ๋„๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ***4. ๋ณตํ•ฉ ํ‚ค*** ๋ณตํ•ฉ ํ‚ค : ๋‘๊ฐœ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์„ ๋ฌถ์–ด์„œ ํ•˜๋‚˜์˜ ๊ธฐ๋ณธํ‚ค๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. + ์ด๋•Œ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ ๊ธฐ๋ณธํ‚ค๋Š” ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์— ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋˜ํ•œ ๊ธฐ๋ณธํ‚ค๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ๊ธฐ๋ณธํ‚ค๊ฐ€ ๋งŒ์•ฝ ๋ณตํ•ฉํ‚ค๋ผ๋ฉด, ๋ณตํ•ฉํ‚ค ๋˜ํ•œ ๋‹น์—ฐํžˆ ์œ ์ผ์„ฑ๊ณผ ์ตœ์†Œ์„ฑ์„ ๋งŒ์กฑํ•ด์•ผํ•œ๋‹ค. + --- diff --git a/keyword/chapter07/keyword.md b/keyword/chapter07/keyword.md index 800c7d9..cb2acac 100644 --- a/keyword/chapter07/keyword.md +++ b/keyword/chapter07/keyword.md @@ -6,17 +6,20 @@ - @RestControllerAdvice๋Š” REST API ์ „์šฉ์œผ๋กœ ์˜ˆ์™ธ๋ฅผ ์ „์—ญ์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๋•๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์Šคํ”„๋ง์—์„œ ์˜ˆ์™ธ๋ฅผ ๋‹ค๋ฃจ๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ์‹ ์ค‘ @RestControllerAdvice๋Š” API์˜ ์ „๋ฐ˜์ ์ธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๊ณณ์—์„œ ๋‹ด๋‹นํ•˜์—ฌ, ์ผ๊ด€๋œ ์‘๋‹ต ๊ตฌ์กฐ๋กœ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. -- @RestControllerAdvice์˜ ์ฃผ์š” ๊ธฐ๋Šฅ ๋ฐ ์žฅ์  + +- @RestControllerAdvice์˜ ์ฃผ์š” ๊ธฐ๋Šฅ - ์ „์—ญ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ: ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ์— ์ข…์†๋˜์ง€ ์•Š๊ณ , ๋ชจ๋“  @RestController์˜ ์˜ˆ์™ธ๋ฅผ ํฌ๊ด„์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. - ์ผ๊ด€๋œ JSON ์‘๋‹ต: ์‘๋‹ต ํ˜•์‹์ด JSON์œผ๋กœ ๊ณ ์ •๋˜๋ฏ€๋กœ RESTful ์„œ๋น„์Šค์— ์ ํ•ฉํ•˜๋ฉฐ, API ์‚ฌ์šฉ์ž์—๊ฒŒ ์ผ๊ด€๋œ ์—๋Ÿฌ ํ˜•์‹์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. - ํ•ธ๋“ค๋Ÿฌ ๋ฉ”์„œ๋“œ: @ExceptionHandler๋ฅผ ํ†ตํ•ด ์˜ˆ์™ธ ์œ ํ˜•๋ณ„๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ, ์ƒํ™ฉ์— ๋งž๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์™€ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. + - @RestControllerAdvice ํ™œ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ - ํด๋ž˜์Šค ๋ถ„๋ฆฌ: ์˜ˆ์™ธ์˜ ๋ณต์žก์„ฑ์ด ์ปค์งˆ ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ @RestControllerAdvice ํด๋ž˜์Šค๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. - ์‘๋‹ต ํ˜•์‹ ํ†ต์ผ: ์—๋Ÿฌ ์‘๋‹ต์˜ ํฌ๋งท์„ ์ •ํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ผ๊ด€๋œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. - ์ตœ์ƒ์œ„ ํ•ธ๋“ค๋Ÿฌ ์„ค์ •: ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ์˜ˆ์™ธ์— ๋Œ€๋น„ํ•ด ์ตœ์ƒ์œ„ ์˜ˆ์™ธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ •์˜ํ•˜์—ฌ, ๋ชจ๋“  ์—๋Ÿฌ๊ฐ€ ์ ์ ˆํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋กœ ์‘๋‹ต๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. - - ExceptionHandler ์‚ฌ์šฉ ์˜ˆ์‹œ + +- ExceptionHandler ์‚ฌ์šฉ ์˜ˆ์‹œ @RestControllerAdvice public class GlobalExceptionHandler { @@ -45,12 +48,14 @@ public class GlobalExceptionHandler { - Lombok์€ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ ์š”์†Œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜๋Š” ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๋‹ค์–‘ํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ณตํ•˜์—ฌ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ณ  ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. + - Lombok์˜ ์ฃผ์š” ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ ๊ธฐ๋Šฅ - @Getter, @Setter: ํด๋ž˜์Šค๋‚˜ ํ•„๋“œ์— ์ ์šฉํ•˜์—ฌ getter, setter ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค. - @AllArgsConstructor / @NoArgsConstructor: ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž๋‚˜ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค. - @Builder: ๋นŒ๋” ํŒจํ„ด์„ ์ ์šฉํ•ด ๊ฐ์ฒด ์ƒ์„ฑ ์‹œ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. - @ToString: toString() ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ( ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋‚˜์˜ฌ ๋ฉ”์„ธ์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ) + @Getter @Setter @AllArgsConstructor @@ -62,6 +67,7 @@ public class User { private String email; } + - Lombok ์‚ฌ์šฉ ์‹œ ์œ ์˜์  - ๋””๋ฒ„๊น…์˜ ์–ด๋ ค์›€: ์ž๋™ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ๋ณด์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น… ์‹œ ์ƒ์„ฑ๋œ ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ ํ๋ฆ„์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. - ์˜์กด์„ฑ: Lombok์€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋™์ž‘ํ•˜๋ฏ€๋กœ, ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ ๋„๊ตฌ์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ์— ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. diff --git a/keyword/chapter10/keyword.md b/keyword/chapter10/keyword.md new file mode 100644 index 0000000..124b5b1 --- /dev/null +++ b/keyword/chapter10/keyword.md @@ -0,0 +1,75 @@ +## ๐ŸŽฏํ•ต์‹ฌ ํ‚ค์›Œ๋“œ + +--- + +***1. Spring Security*** + +- ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ(Spring Security)๋Š” ์Šคํ”„๋ง ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ์„ ๋‹ด๋‹นํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์ธ์ฆ(Authentication), ์ธ๊ฐ€(Authorization), ๊ถŒํ•œ ๊ด€๋ฆฌ ๋“ฑ ๋ณด์•ˆ ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์Šคํ”„๋ง ํ•˜์œ„ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์ด๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ์˜ ์ทจ์•ฝ์ ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์•ˆ์ „ํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ด๋‹ค. ํŠนํžˆ, ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ์Šคํ”„๋ง MVC์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ํ•„ํ„ฐ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ๋‹ค. + +- ํŠน์ง• + - 1. ๋‹ค์–‘ํ•œ ์ธ์ฆ(Authentication) ๋ฐฉ์‹ + - ํผ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ(Form-based Login): ์‚ฌ์šฉ์ž๊ฐ€ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋กœ๊ทธ์ธํ•œ๋‹ค. + - HTTP ๊ธฐ๋ณธ ์ธ์ฆ: HTTP ํ—ค๋”๋ฅผ ํ†ตํ•ด ์ธ์ฆ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. + - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™: ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•˜์—ฌ ์ธ์ฆํ•œ๋‹ค. + - LDAP ์ธ์ฆ: LDAP ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ†ตํ•œ ์ธ์ฆ์„ ์ง€์›ํ•œ๋‹ค. + - OAuth/OpenID/SAML: ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ ์ธ์ฆ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜์—ฌ ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. + + - 2. ๊ถŒํ•œ ๋ถ€์—ฌ(Authorization) : ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•œ๋‹ค. ํŠน์ • ์‚ฌ์šฉ์ž ๋˜๋Š” ๊ทธ๋ฃน(Role)์— ๋Œ€ํ•ด ๊ถŒํ•œ์„ ์„ค์ •ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ์„ ์ œ์–ดํ•œ๋‹ค. ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์œ„ํ•ด Role(์—ญํ• )๊ณผ Authority(๊ถŒํ•œ) ๊ฐœ๋…์„ ์‚ฌ์šฉํ•œ๋‹ค. URL ํŒจํ„ด, ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ๋“ฑ ๋‹ค์–‘ํ•œ ์ˆ˜์ค€์—์„œ ๊ถŒํ•œ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. + + - 3. ์„ธ์…˜ ๊ด€๋ฆฌ : ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ์„ธ์…˜ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. + - ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ ์„ค์ • + - ์„ธ์…˜ ๊ณ ์ • ๊ณต๊ฒฉ(Session Fixation) ๋ฐฉ์–ด + - ๋‹ค์ค‘ ๋กœ๊ทธ์ธ ์ œ์–ด(์˜ˆ: ํ•œ ๊ณ„์ •์˜ ๋™์‹œ ๋กœ๊ทธ์ธ ๋ฐฉ์ง€) + + - 4. CSRF ๋ฐฉ์–ด : CSRF(Cross-Site Request Forgery) ๊ณต๊ฒฉ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋œ ์ƒํƒœ์—์„œ ์•…์˜์ ์ธ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์œ ๋„ํ•˜๋Š” ๊ณต๊ฒฉ์ด๋‹ค. ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” CSRF ๋ฐฉ์–ด ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜์—ฌ ์ด๋ฅผ ์˜ˆ๋ฐฉํ•œ๋‹ค. + + - 5. ๋ณด์•ˆ ์ด๋ฒคํŠธ ๋กœ๊น… : ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ๋ณด์•ˆ ๊ด€๋ จ ์ด๋ฒคํŠธ๋ฅผ ๋กœ๊น…ํ•˜์—ฌ ๊ด€๋ฆฌ์ž์™€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ๊ณผ์ •์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค. + + - 6. ํ•„ํ„ฐ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ : ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” **ํ•„ํ„ฐ ์ฒด์ธ(Filter Chain)**์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์ด ์„œ๋ฒ„๋กœ ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ํ•„ํ„ฐ๋ฅผ ๊ฑฐ์ณ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. + + - 7. Spring Boot์™€ ํ†ตํ•ฉ : ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” Spring Boot์™€์˜ ๋†’์€ ํ†ตํ•ฉ์„ฑ์„ ์ž๋ž‘ํ•œ๋‹ค. Spring Boot Starter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ช‡ ์ค„์˜ ์„ค์ •๋งŒ์œผ๋กœ ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ์•ˆ์ „ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. + + - 8. ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด์•ˆ ๋กœ์ง : ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ๊ธฐ๋ณธ ์ œ๊ณต ๊ธฐ๋Šฅ ์™ธ์—๋„ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณด์•ˆ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. + + +- ํ•„ํ„ฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ/์ธ๊ฐ€ ์ฒ˜๋ฆฌ ํ๋ฆ„ + ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ์š”์ฒญ์ด ์„œ๋ฒ„์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ์—ฌ๋Ÿฌ ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ์ธ์ฆ ๋ฐ ์ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํผ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ์ธ์ฆ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. + + - 1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ํผ์— ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, HttpServletRequest์— ์ธ์ฆ ์ •๋ณด๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค. + + - 2. AuthenticationFilter๊ฐ€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ ํ›„, UsernamePasswordAuthenticationToken ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด ๊ฐ์ฒด๋Š” AuthenticationManager๋กœ ์ „๋‹ฌ๋˜๋ฉฐ, ๋‹ค์‹œ AuthenticationProvider์—์„œ ์ฒ˜๋ฆฌ๋œ๋‹ค. + + - 3. AuthenticationProvider๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ UserDetailService์— ์š”์ฒญํ•œ๋‹ค. + + - 4. UserDetailService๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜์—ฌ UserDetails ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค. + + - 5. ์ž…๋ ฅ ์ •๋ณด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๋ณด๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ธ์ฆ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. + + - 6. ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด SecurityContextHolder์— ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ , ์ธ์ฆ ์„ฑ๊ณต ํ•ธ๋“ค๋Ÿฌ(AuthenticationSuccessHandler)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์‹คํŒจ ์‹œ ์ธ์ฆ ์‹คํŒจ ํ•ธ๋“ค๋Ÿฌ(AuthenticationFailureHandler)๊ฐ€ ์‹คํ–‰๋œ๋‹ค. + + +- ์žฅ์  + - ํŽธ๋ฆฌํ•œ ๋ณด์•ˆ ๊ตฌํ˜„ : ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ๊ด€๋ จ ๋กœ์ง์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. + - ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ์˜ต์…˜ : CSRF ๋ฐฉ์–ด, ์„ธ์…˜ ๊ด€๋ฆฌ, ํด๋ฆญ์žฌํ‚น ๋ฐฉ์–ด ๋“ฑ ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค. + - ํ™•์žฅ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ : ์‚ฌ์šฉ์ž ์ •์˜ ํ•„ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋ณด์•ˆ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ๋‹ค. + - ๋น ๋ฅธ ๊ฐœ๋ฐœ ์ง€์› : Spring Boot์™€์˜ ํ†ตํ•ฉ์œผ๋กœ ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ ์„ค์ •์„ ๋น ๋ฅด๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + - ๋ณด์•ˆ ํ‘œ์ค€ ์ค€์ˆ˜ : OAuth, OpenID Connect, SAML ๋“ฑ ๋‹ค์–‘ํ•œ ์ธ์ฆ ํ‘œ์ค€์„ ์ง€์›ํ•˜์—ฌ ์ตœ์‹  ๋ณด์•ˆ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•œ๋‹ค. + + + + +--- + + +***2. ์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ€(Authorization)*** + +- ์ธ์ฆ(Authentication): +์ธ์ฆ์€ ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋กœ๊ทธ์ธํ•  ๋•Œ ์ž…๋ ฅํ•œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๋Š” ์ž‘์—…์ด ์ธ์ฆ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. + +- ์ธ๊ฐ€(Authorization): +์ธ๊ฐ€๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ด€๋ฆฌ์ž ๊ณ„์ •์€ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ์ ‘๊ทผ์ด ์ œํ•œ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๊ถŒํ•œ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. + +- ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ธ์ฆ ๋ฐ ์ธ๊ฐ€ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋ณต์žกํ•œ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ ๋กœ์ง์„ ์ง์ ‘ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. + + +--- diff --git a/mission/chapter06/mission.md b/mission/chapter06/mission.md new file mode 100644 index 0000000..82c349b --- /dev/null +++ b/mission/chapter06/mission.md @@ -0,0 +1,91 @@ +## ๐Ÿ”ฅย ๋ฏธ์…˜ + +--- + +- 2์ฃผ์ฐจ ๋ฏธ์…˜ ๋•Œ ํ–ˆ๋˜ ํ•ด๋‹น ํ™”๋ฉด๋“ค์— ๋Œ€ํ•ด ์ž‘์„ฑํ–ˆ๋˜ ์ฟผ๋ฆฌ๋ฅผ QueryDSL๋กœ ์ž‘์„ฑํ•˜์—ฌ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ + + +***1. ๋‚ด๊ฐ€ ์ง„ํ–‰ ์ค‘, ์ง„ํ–‰ ์™„๋ฃŒํ•œ ๋ฏธ์…˜์„ ๋ชจ์•„์„œ ๋ณด๋Š” ์ฟผ๋ฆฌ*** + +QํšŒ์› h = QํšŒ์›.ํšŒ์›; +Q์„ ํ˜ธ์Œ์‹์นดํ…Œ๊ณ ๋ฆฌ c = Q์„ ํ˜ธ์Œ์‹์นดํ…Œ๊ณ ๋ฆฌ.์„ ํ˜ธ์Œ์‹์นดํ…Œ๊ณ ๋ฆฌ; +Q๋ฏธ์…˜ m = Q๋ฏธ์…˜.๋ฏธ์…˜; + +List results = queryFactory + .select(h.name, m.mission_num, m.rest_name, m.request) + .from(h) + .join(c).on(h.email.eq(c.email)) + .leftJoin(m).on(c.email.eq(m.email)) + .where(h.email.eq("ํšŒ์›์ด๋ฉ”์ผ")) + .orderBy(m.datetime.desc()) + .fetch(); + +--- + + +***2. ๋ฆฌ๋ทฐ ์ž‘์„ฑํ•˜๋Š” ์ฟผ๋ฆฌ*** + +Q๋ฆฌ๋ทฐ review = Q๋ฆฌ๋ทฐ.๋ฆฌ๋ทฐ; + +long insertedCount = queryFactory.insert(review) + .set(review.mission_num, 1234) + .set(review.email, "ํšŒ์›์ด๋ฉ”์ผ") + .set(review.star, 4.5) + .set(review.content, "์ข‹์€์Œ์‹์ด์—ˆ์–ด์š”~:)") + .set(review.datetime, LocalDateTime.now()) + .execute(); + +--- + + +***3. ํ™ˆ ํ™”๋ฉด ์ฟผ๋ฆฌ *** + +- ์ง€์—ญ๋‚ด์—์„œ ์„ฑ๊ณตํ•œ ๋ฏธ์…˜๋“ค +Q๋ฏธ์…˜ m = Q๋ฏธ์…˜.๋ฏธ์…˜; +Q์ ํ‘œ j = Q์ ํ‘œ.์ ํ‘œ; +Q์ง€์—ญ r = Q์ง€์—ญ.์ง€์—ญ; + +long successCount = queryFactory + .select(m.count()) + .from(m) + .join(j).on(m.mission_num.eq(j.mission_num)) + .join(r).on(j.์ง€์—ญ_id.eq(r.์ง€์—ญ_id)) + .where( + j.request.eq(1), + j.email.eq("ํšŒ์›์ด๋ฉ”์ผ"), + j.์ง€์—ญ_id.eq("์„ ํƒ์ง€์—ญid") + ) + .orderBy(m.datetime.desc()) + .limit(10) + .offset(0) + .fetchCount(); + +- ์ง€์—ญ๋‚ด์—์„œ ๋„์ „๊ฐ€๋Šฅ ๋ฏธ์…˜๋“ค +List availableMissions = queryFactory + .select(m.rest_name, m.price, m.datetime) + .from(m) + .join(j).on(m.mission_num.eq(j.mission_num)) + .join(r).on(j.์ง€์—ญ_id.eq(r.์ง€์—ญ_id)) + .where( + j.request.eq(0), + j.email.eq("ํšŒ์›์ด๋ฉ”์ผ"), + j.์ง€์—ญ_id.eq("์„ ํƒ์ง€์—ญid") + ) + .orderBy(m.datetime.desc()) + .fetch(); + +--- + + +***4. ๋งˆ์ด ํŽ˜์ด์ง€ ํ™”๋ฉด ์ฟผ๋ฆฌ*** + +QํšŒ์› h = QํšŒ์›.ํšŒ์›; + +Tuple myPageInfo = queryFactory + .select(h.name, h.email, h.address) + .from(h) + .where(h.email.eq("ํšŒ์›์ด๋ฉ”์ผ")) + .fetchOne(); + + +