diff --git a/keyword/chapter09/keyword.md b/keyword/chapter09/keyword.md new file mode 100644 index 0000000..645d8a1 --- /dev/null +++ b/keyword/chapter09/keyword.md @@ -0,0 +1,151 @@ +# ๐ŸŽฏ 9์ฃผ์ฐจ ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ + + +# Spring Data JPA์˜ Paging + +> ***Paging** +์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ, ์ „์ฒด ๋ฐ์ดํ„ฐ ์ค‘ ์ผ๋ถ€๋ฅผ ์›ํ•˜๋Š” ์ •๋ ฌ ๋ฐฉ์‹์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹* +> + +**โ‡’ Spring Data JPA๋Š” ํŽ˜์ด์ง•์„ ์œ„ํ•ด Page์™€ Slice ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•จ.** + +**ํŽ˜์ด์ง• ๊ธฐ๋ฒ• ๊ตฌํ˜„์— ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค** + +- page : ํŽ˜์ด์ง• ๊ธฐ๋ฒ•์ด ์ ์šฉ๋˜์—ˆ์„ ๋•Œ, ์›ํ•˜๋Š” ํŽ˜์ด์ง€ +- size : ํ•ด๋‹น ํŽ˜์ด์ง€์— ๋‹ด์„ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜ +- sort : ๋ฐ์ดํ„ฐ ์ •๋ ฌ ๊ธฐ์ค€ + +**โ‡’ ์ด ๋ฐ์ดํ„ฐ๋“ค์€ Pageable์ด๋ผ๋Š” ๊ฐ์ฒด๋กœ Mapping๋จ.** + +**Spring Data JPA์˜ ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ํŽ˜์ด์ง•, ๋ฐ์ดํ„ฐ ์ •๋ ฌ ๊ธฐ๋Šฅ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ** + +- org.springframework.data.domain.Pageable : ํŽ˜์ด์ง• ๊ธฐ๋Šฅ ( ๋‚ด๋ถ€์ ์œผ๋กœ sort ํฌํ•จ ) +- org.springframework.data.domain.Sort : ๋ฐ์ดํ„ฐ ์ •๋ ฌ ๊ธฐ๋Šฅ + +## Pageable ์ธํ„ฐํŽ˜์ด์Šค + +> ***Pageable** +ํŽ˜์ด์ง•์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ, Pageable์„ ๊ตฌํ˜„ํ•œ PageRequest ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ๋จ.* +> + +`PageRequest pageRequest = PageRequest.of(page, size);` **PageRequest ์ƒ์„ฑ** + +- Pageable ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌํ„ด ํƒ€์ž…์€ Page์ž„. +- PageRequest ์ƒ์„ฑ์ž์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํ˜„์žฌ ํŽ˜์ด์ง€, ์กฐํšŒํ•  ๋ฐ์ดํ„ฐ ์ˆ˜, ์ •๋ ฌ ์ •๋ณด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Œ. + +# Page + +```java +public interface Page extends Slice { + /* + ๋ฉ”์†Œ๋“œ๋“ค + */ +} +``` + +- Page ์ธํ„ฐํŽ˜์ด์Šค๋Š” Slice ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜๋ฏ€๋กœ Slice ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ. +- ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ด์šฉํ•œ ์ด ํŽ˜์ด์ง€์˜ ๊ฐœ์ˆ˜์˜ ์ •๋ณด๋„ ์•Œ ์ˆ˜ ์žˆ์Œ. +- ์กฐํšŒ์ฟผ๋ฆฌ ์ดํ›„ ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ์นด์šดํŠธ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋จ. +- getTotalElements() : ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜ +- getTotalPages() : ์ „์ฒด ํŽ˜์ด์ง€ ๊ฐœ์ˆ˜ +- getContent() : ์‹ค์ œ ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ + *cf. List (์ž๋ฐ” ์ปฌ๋ ‰์…˜): ์ถ”๊ฐ€ count ์ฟผ๋ฆฌ ์—†์ด ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜* + +**โ‡’ ํŽ˜์ด์ง€ ๋„ค๋น„๊ฒŒ์ด์…˜, ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ์™€ ์ด ํŽ˜์ด์ง€์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ๋จ.** + +# Slice + +```java +public interface Slice extends Streamable { + /* + ๋ฉ”์†Œ๋“œ๋“ค + */ +} +``` + +- ๋ฐ์ดํ„ฐ์˜ ์ผ๋ถ€๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ. +- ์ „์ฒด ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ชจ๋ฅด๋ฏ€๋กœ, ์ด ํŽ˜์ด์ง€์˜ ๊ฐœ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์—†์Œ. +- ์ „์ฒด ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ์กฐํšŒํ•˜์ง€ ์•Š๊ณ  ์ด์ „ ๋˜๋Š” ๋‹ค์Œ Slice๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋งŒ ํ™•์ธํ•จ. +- hasNext() : ๋‹ค์Œ ํŽ˜์ด์ง€ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ. + +**โ‡’ ๋ฌดํ•œ ์Šคํฌ๋กค, ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ์ƒํ™ฉ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋จ.** + +# ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ + +## ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜ + +> ***ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜** +๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ง€ํ–ฅํ•˜๋Š” ๋ชฉ์ ์ด ์„œ๋กœ ๋‹ค๋ฅด๋ฏ€๋กœ ๊ธฐ๋Šฅ๊ณผ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์— ์ฐจ์ด๊ฐ€ ์žˆ์Œ. ๊ฐ์ฒด๋ฅผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ๋•Œ, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๊ฐ€์ ธ์™€ ์กฐ์ž‘ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ถฉ๋Œ์„ ๋œปํ•จ.* +> + +### ex1) ์ƒ์† + +- ๊ฐ์ฒด ๋ชจ๋ธ์€ ์ƒ์†์„ ์ง€์›ํ•˜์ง€๋งŒ, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ. + +### ex2) ์—ฐ๊ด€๊ด€๊ณ„ + +- ๊ฐ์ฒด ๋ชจ๋ธ์—์„œ๋Š” ๊ฐ์ฒด ๊ฐ„์˜ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์ง์ ‘ ์ฐธ์กฐ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ์™ธ๋ž˜ํ‚ค๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„ํ•ด์•ผ ํ•จ. + +### ex3) ๋น„๊ต + +- ๊ฐ์ฒด๋Š” ์ฐธ์กฐ์˜ ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๊ธฐ๋ณธํ‚ค๋ฅผ ์ด์šฉํ•ด ํ–‰์˜ ๋™๋“ฑ์„ฑ์„ ๋น„๊ตํ•จ. + +***๋”ฐ๋ผ์„œ, ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋กœ ์ธํ•ด ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, JPA๋ฅผ ์ด์šฉํ•จ.*** + +## ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ + +> ***์ •์˜** +๊ฐ์ฒด A๊ฐ€ ์žˆ์„ ๋•Œ, A๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์„ A๋ฅผ ํ†ตํ•ด ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ. +์ฆ‰, ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•จ.* +> +- SQL์„ ์ง์ ‘ ๋‹ค๋ฃจ๋ฉด SQL์— ๋”ฐ๋ผ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ์–ด๋””๊นŒ์ง€ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ •ํ•ด์ง. + ex) SQL์ด B์™€ C๊นŒ์ง€๋งŒ ์กฐํšŒํ•˜๋Š” SQL์ด๋ผ๋ฉด B๋‚˜ C๊นŒ์ง€๋งŒ ์ฐธ์กฐ ๊ฐ€๋Šฅ +- ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด, DAO๋ฅผ ์—ด์–ด SQL์„ ์ง์ ‘ ํ™•์ธํ•ด์•ผ ํ•จ. + โ‡’ A์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค๋‘๋Š” ๊ฒƒ์€ ๋น„ํ˜„์‹ค์ ์ด๋ฏ€๋กœ, DAO์— A๋ฅผ ์กฐํšŒํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฉ”์†Œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•จ. + +***โ‡’ JPA๋ฅผ ์ด์šฉํ•˜๋ฉด ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์ ์— ์ ์ ˆํ•œ SELECT SQL์„ ์‹คํ–‰ํ•˜๋ฏ€๋กœ, ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ์›ํ•˜๋Š” ๋งŒํผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Œ. (์ง€์—ฐ ๋กœ๋”ฉ)*** + +***๋˜ํ•œ, JPA๋Š” ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์ฆ‰์‹œ ์กฐํšŒํ• ์ง€ ์•„๋‹ˆ๋ฉด ์‹ค์ œ ์‚ฌ์šฉ๋˜๋Š” ์‹œ์ ์— ์กฐํšŒํ• ์ง€ ์„ค์ • ๊ฐ€๋Šฅํ•จ.*** + +## JPA + +> ***์ •์˜** +Java์—์„œ ๊ฐ์ฒด๋ฅผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋งคํ•‘(ORM: Object-Relational Mapping)ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค. +ex)Hibernate* +> + +### JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ? + +**<์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ>** + +- ์ง์ ‘ SQL์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, CRUD๊ฐ€ ๊ฐ„ํŽธํ•ด์ง. +- ํŠนํžˆ ์ˆ˜์ • ๋ถ€๋ถ„์€ Java ์ปฌ๋ ‰์…˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌํ•จ. + +```java +jpa.persist(user) // ์ €์žฅ +User user = jpa.find(userId) // ์กฐํšŒ +user.setName("user") // ์ˆ˜์ • +jpa.remove(user) // ์‚ญ์ œ +``` + +**<์œ ์ง€๋ณด์ˆ˜ ์šฉ์ด>** + +- SQL๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ์‹์„ ์ด์šฉํ•˜๋ฉด, ์—”ํ‹ฐํ‹ฐ์— ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค SQL ์ฟผ๋ฆฌ๋ฌธ์„ ์ˆ˜์ •ํ•ด์•ผํ•จ. +- JPA๋ฅผ ์ด์šฉํ•˜๋ฉด, ํ•„๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์„ ๋•Œ ๊ฐœ๋ฐœ์ž๋Š” ์—”ํ‹ฐํ‹ฐ์— ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ or ์‚ญ์ œ๋งŒ ํ•˜๋ฉด ๋˜๊ณ , SQL์€ JPA๊ฐ€ ์ฒ˜๋ฆฌํ•ด์คŒ. + +**<๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ>** + +**์ƒ์†** + +- JPA๋Š” ์ƒ์†๊ด€๊ณ„์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ๋•Œ ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ INSERT ๋ฌธ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•จ. +- ์ƒ์†๊ด€๊ณ„์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์กฐํšŒ ์‹œ์—๋„ ์•Œ์•„์„œ JOIN ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์คŒ. + +**์—ฐ๊ด€๊ด€๊ณ„, ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰** + +- JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ” ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋“ฏ์ด ์—ฐ๊ด€๊ด€๊ณ„์— ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ. +- ํŠน์ • ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์—ฐ๊ด€๊ด€๊ณ„๋กœ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ. + +**๋น„๊ต** + +- JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ™์€ ์กฐ๊ฑด์œผ๋กœ ๋ถˆ๋Ÿฌ์˜จ ๊ฐ์ฒด์— ๋Œ€ํ•œ == ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•จ. +- ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜์—์„œ ์กฐํšŒํ•œ ์—”ํ‹ฐํ‹ฐ๋Š” ๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ์ž„์„ ๋ณด์žฅํ•ด์คŒ. \ No newline at end of file diff --git a/keyword/chapter10/keyword.md b/keyword/chapter10/keyword.md new file mode 100644 index 0000000..a404d83 --- /dev/null +++ b/keyword/chapter10/keyword.md @@ -0,0 +1,123 @@ +# ๐ŸŽฏ10์ฃผ์ฐจ ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ + +## Spirng Security + +> *Java ๊ธฐ๋ฐ˜์˜ Spring Framework๋ฅผ ์œ„ํ•œ ๋ณด์•ˆ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ธ์ฆ(Authentication) ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ(Authorization) ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋จ. Spring ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณดํ˜ธํ•˜๊ณ , ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ํ‘œ์ค€ํ™”ํ•จ*> + +## ์ฃผ์š” ์šฉ์–ด + +### ์ธ์ฆ(Authentication) + +- ์œ ์ € ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•˜๋Š” ๊ณผ์ •์œผ๋กœ, ์‚ฌ์šฉ์ž ํ™•์ธ์„ ์œ„ํ•จ. + +### ์ธ๊ฐ€(Authorization) + +- ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•จ + +### ์ ‘๊ทผ ์ฃผ์ฒด(Principal) + +- ๋ณดํ˜ธ๋œ ๋Œ€์ƒ์— ์ ‘๊ทผํ•˜๋Š” ์œ ์ € + +### ๊ถŒํ•œ + +- ์ธ์ฆ๋œ ์ฃผ์ฒด๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ๋ฝ๋˜์—ˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋…์ด์ž, ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์˜ ๋ฒ”์œ„ + +### CSRF + +- ์‚ฌ์šฉ์ž๋ฅผ ์†์—ฌ, ์˜๋„์น˜ ์•Š์€ ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ Spring Security๋Š” CSRF ํ† ํฐ์„ ํ™œ์šฉํ•˜์—ฌ ๋ณดํ˜ธํ•จ. + +## ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ + +### AuthenticationManager + +- ์ธ์ฆ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘์•™ ๊ด€๋ฆฌ์ž ์—ญํ•  +- ์ธ์ฆ์— ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ AuthenticationProvider์— ์œ„์ž„ํ•˜์—ฌ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•จ +- ProviderManager๊ฐ€ ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋กœ ์‚ฌ์šฉ๋จ + +### AuthenticationProvider + +- ์‹ค์ œ๋กœ ์ธ์ฆ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋งํ•จ +- ํŠน์ • ์ธ์ฆ ๋ฐฉ์‹์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, AuthenticationManager์— ์˜ํ•ด ํ˜ธ์ถœ๋จ +- ๋‹ค์–‘ํ•œ ์ธ์ฆ๋ฐฉ์‹์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Œ + +### UserDetialService + +- ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค +- Spring Security์˜ AuthenticationProvider์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ๋จ +- ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์šฉ์ž ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•จ + +### SecurityContext + +- ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ๋ณด์•ˆ ์ •๋ณด๋ฅผ ์ €์žฅํ•จ +- SecurityContextHodler๋ฅผ ํ†ตํ•ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•จ +- ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์™€ ๊ถŒํ•œ์„ ํฌํ•จํ•จ +- ์ผ๋ฐ˜์ ์œผ๋กœ, ์š”์ฒญ ์‚ฌ์ด์—์„œ ์ƒํƒœ ์œ ์ง€๋ฅผ ์œ„ํ•ด ์„ธ์…˜์ด๋‚˜ ํ† ํฐ์„ ์‚ฌ์šฉํ•จ + +### SecurityContextHolder + +- ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์—ญ์—์„œ ๊ด€๋ฆฌํ•จ +- ์ธ์ฆ ์ •๋ณด๋ฅผ SecurityContext ๊ฐ์ฒด์— ์ €์žฅํ•˜๋ฉฐ, ์š”์ฒญ์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ThreadLocal์— ์ €์žฅ๋จ +- SecurityContext(ํ˜„์žฌ ์ธ์ฆ ์ •๋ณด)์™€ Authentication(์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด)์œผ๋กœ ๊ตฌ์„ฑ๋จ + +### Filter Chain + +- Spring Security๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋ฉฐ, ์š”์ฒญ์—๋Œ€ํ•œ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์ฒ˜๋ฆฌํ•จ +- ๋ชจ๋“  ์ž‘์—…์ด ํ•„ํ„ฐ ์ฒด์ธ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ์š”์ฒญ์ด ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ• ๋•Œ๋งˆ๋‹ค ๊ฐ ํ•„ํ„ฐ์—์„œ ๋ณด์•ˆ๊ฒ€์‚ฌ ์ˆ˜ํ–‰ +- ์—ญํ• 1: ์ธ์ฆ๋˜์ง€ ์•Š์€ ์š”์ฒญ์„ ๊ฐ€๋กœ ์ฑ” +- ์—ญํ• 2: ์ธ์ฆ/์ธ๊ณผ ๊ณผ์ •์„ ์‹คํ–‰ +- ์—ญํ• 3: ์š”์ฒญ์ด ์ ํ•ฉํ•œ ๊ฒฝ์šฐ, ์ปจํŠธ๋กค๋Ÿฌ์— ์ „๋‹ฌํ•จ + +**์ฃผ์š” ํ•„ํ„ฐ** + +**SecurityContextPersistenceFilter** + +- ์š”์ฒญ ๊ฐ„ SecurityContext๋ฅผ ์œ ์ง€ +- ์ƒˆ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ์ด์ „์— ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋ณต์› + +**UsernamePasswordAuthenticationFilter** + +- ํผ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ์„ ์ฒ˜๋ฆฌํ•จ +- ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์ถœํ•œ username๊ณผ password๋ฅผ ํ™•์ธํ•˜์—ฌ ์ธ์ฆ์„ ์‹œ๋„ํ•จ + +**AnonymousAuthenticationFilter** + +- ์ด์ „ ํ•„ํ„ฐ์—์„œ ์ธ์ฆ๋˜์ง€ ์•Š์€ ์š”์ฒญ์— ๋Œ€ํ•ด ์ต๋ช… ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ œ๊ณตํ•จ + +**ExceptionTranslationFilter** + +- Spring Security ์˜ˆ์™ธ๋ฅผ HTTP ์‘๋‹ต์œผ๋กœ ๋ณ€ํ™˜ํ•จ +- ์ธ์ฆ ์‹คํŒจ ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๊ฑฐ๋‚˜, ์ธ๊ฐ€ ์‹คํŒจ ์‹œ 403 ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•จ + +**FilterSecurityInterceptor** + +- ์ ‘๊ทผ ์ œ์–ด ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๋งˆ์ง€๋ง‰ ํ•„ํ„ฐ +- ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•จ + +## ์ธ์ฆ(Authentication) + +> *์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์œผ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์ •์ฒด์„ฑ์„ ์ฆ๋ช…ํ•ด์•ผํ•˜๋Š” ๋‹จ๊ณ„. +์œ ํšจํ•œ ์‚ฌ์šฉ์ž์ธ์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๊ณผ์ •์ด๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋˜๋ฉด Authentication ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ธ์ฆ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋จ.* +*> + +## ํ๋ฆ„ + +- ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด UsernamePasswordAuthenticationFilter๊ฐ€ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๊ณ  Authentication ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•จ +- AuthencationManager๊ฐ€ ์ ์ ˆํ•œ AuthenticationProvider๋ฅผ ์„ ํƒํ•ด ์ธ์ฆ์„ ์œ„์ž„ํ•จ +- ์„ ํƒ๋œ AuthenticationProvider๊ฐ€ UserDetailsServcie๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋กœ๋“œํ•จ +- ์ธ์ฆ์ด ์„ฑ๊ณตํ•˜๋ฉด Authentication ๊ฐ์ฒด๊ฐ€ SecurityContext์— ์ €์žฅ๋จ + +## ์ธ๊ฐ€(Authorization) + +> *์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ํ™•์ธํ•˜์—ฌ ํŠน์ • ๋ฆฌ์†Œ์Šค ์ž‘์—…์— ๋Œ€ํ•œ ํ—ˆ๊ฐ€/๊ฑฐ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ์‚ฌ์šฉ์ž ์ธ์ฆ ํ›„, ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค ํ•  ๋•Œ ์ˆ˜ํ–‰๋จ.* +> + +## ํ๋ฆ„ + +- ์‚ฌ์šฉ์ž์˜ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด FilterSecurityInterceptor๊ฐ€ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„ ๊ถŒํ•œ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ +- AccessDecisionManager๊ฐ€ ํ˜„์žฌ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ๊ณผ ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค์˜ ํ•„์š” ๊ถŒํ•œ์„ ๋น„๊ตํ•จ +- SecurityContext์—์„œ ํ˜„์žฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ ์ •๋ณด๋ฅผ ์กฐํšŒ +- ๊ถŒํ•œ์ด ์ถฉ๋ถ„ํ•˜๋ฉด ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜๊ณ , ๋ถ€์กฑํ•˜๋ฉด 403 Forbidden ์‘๋‹ต ๋ฐ˜ํ™˜ + +## ์ธ์ฆ๊ณผ ์ธ๊ฐ€์˜ ์ฐจ์ด + +![](https://velog.velcdn.com/images/isb040818/post/57063dbe-d3bc-4924-b32a-4148b27399eb/image.png) diff --git a/mission/chapter09/mission.md b/mission/chapter09/mission.md new file mode 100644 index 0000000..ea2eecf --- /dev/null +++ b/mission/chapter09/mission.md @@ -0,0 +1,11 @@ +**1.๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋ฆฌ๋ทฐ ๋ชฉ๋ก** +![](https://velog.velcdn.com/images/isb040818/post/913a90d1-65e0-4c9d-b192-e80fc4ac630f/image.png) + +**2.ํŠน์ • ๊ฐ€๊ฒŒ์˜ ๋ฏธ์…˜ ๋ชฉ๋ก** +![](https://velog.velcdn.com/images/isb040818/post/0ccaa48f-d6e2-486c-bf1d-d9506d5e201c/image.png) + +**3.๋‚ด๊ฐ€ ์ง„ํ–‰์ค‘์ธ ๋ฏธ์…˜ ๋ชฉ๋ก** +![](https://velog.velcdn.com/images/isb040818/post/1f16a7bf-67c7-4ad0-a262-687c52335890/image.png) + +**4. ์ง„ํ–‰์ค‘์ธ ๋ฏธ์…˜ ์ง„ํ–‰ ์™„๋ฃŒ๋กœ ๋ฐ”๊พธ๊ธฐ** +![](https://velog.velcdn.com/images/isb040818/post/95290c52-6601-4177-a29c-3abcc3ae3a14/image.png) diff --git a/mission/chapter10/mission.md b/mission/chapter10/mission.md new file mode 100644 index 0000000..b057da4 --- /dev/null +++ b/mission/chapter10/mission.md @@ -0,0 +1,62 @@ +# ๐Ÿ”ฅย 10์ฃผ์ฐจ ๋ฏธ์…˜ + +## ์‹ค์Šต 1 + +**ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€** +![](https://velog.velcdn.com/images/isb040818/post/5f9a6a02-c618-4856-a599-40e7ed4a2054/image.png) + +![](https://velog.velcdn.com/images/isb040818/post/f9e22d3a-08b5-4be0-9dab-e5392b149a9a/image.png) + + +**ํšŒ์›๊ฐ€์ž… ํ›„ DB** + +member +![](https://velog.velcdn.com/images/isb040818/post/3a79bce5-d593-4e47-9da5-369f252a622a/image.png) + +memeber_food +![](https://velog.velcdn.com/images/isb040818/post/4fd17b38-cb80-44bf-ac1b-866291b40b70/image.png) + +![](https://velog.velcdn.com/images/isb040818/post/5975d738-72d6-4b66-9b4e-b08c0e1f19f8/image.png) + + + + +**ํšŒ์›๊ฐ€์ž… ์„ฑ๊ณต ํ›„ ๋กœ๊ทธ์ธ** + +![](https://velog.velcdn.com/images/isb040818/post/34403d6f-e881-46ee-b0e4-850ac2b9d46d/image.png) + + +![](https://velog.velcdn.com/images/isb040818/post/95c24952-d4e8-42a0-a527-7146997e64ae/image.png) + +**๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€** + +์ฒ˜์Œ ์ ‘๊ทผ +![](https://velog.velcdn.com/images/isb040818/post/de803d40-0dd5-4c50-95c9-66c97028a7db/image.png) + +ADMIN์œผ๋กœ ๋ณ€๊ฒฝ ํ›„ ์ ‘๊ทผ +![](https://velog.velcdn.com/images/isb040818/post/e219ca7b-5a08-4ba9-bc46-6c2e7d52d6f1/image.png) + +![](https://velog.velcdn.com/images/isb040818/post/edf3054b-96a4-4b3e-82a0-750a18669755/image.png) + + +![](https://velog.velcdn.com/images/isb040818/post/27f47c11-3bfb-4bd3-aadc-eae1e9dd138b/image.png) + +### ๋™์ž‘ ๊ณผ์ • +- ํšŒ์›๊ฐ€์ž… ์‹œ ํผ์— ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์„ฑ๊ณต์ ์œผ๋กœ ์ €์žฅ๋จ(๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ €์žฅ) +- ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ๋กœ๊ทธ์ธ์ด ์„ฑ๊ณตํ•˜๋ฉด homeํŽ˜์ด์ง€๋กœ ์ด๋™(logout์‹œ login?logout์œผ๋กœ ์ด๋™) +- ๊ด€๋ฆฌ์ž ๊ณ„์ •์œผ๋กœ๋งŒ ๋กœ๊ทธ์ธํ•ด์•ผ, ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋กœ์˜ ์ด๋™ ๋งํฌ๊ฐ€ ๋‚˜์˜ด + +## ์‹ค์Šต2 + +๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ +![](https://velog.velcdn.com/images/isb040818/post/71d0c44f-3b10-43c7-8d05-d5c53432672c/image.png) + +![](https://velog.velcdn.com/images/isb040818/post/bad66f9e-5f30-4f4c-b436-697c76f9e603/image.png) + +![](https://velog.velcdn.com/images/isb040818/post/57b60d3d-aa78-4282-87af-d79d81fbffec/image.png) + +![](https://velog.velcdn.com/images/isb040818/post/ad82337c-bbc2-498b-ac8f-d31946fd0fe4/image.png) + +![](https://velog.velcdn.com/images/isb040818/post/ae713164-c8bd-4ae2-bff8-b105d0f36988/image.png) + +