
๋ค์ด๊ฐ๊ธฐ์ ์. 2023.11.07 - [Spring๐ธ๏ธ] - [Spring Security] ์คํ๋ง ์ํ๋ฆฌํฐ ๊ธฐ๋ณธ - 1 ์ด์ ์ Security ๊ธฐ๋ณธ์ ํตํด์ ์ด๋ ํ ๋ฐฉ์์ผ๋ก ๋ณด์์์ ์ฒ๋ฆฌํ๋์ง ์์๋ณด์๋ค. ํ์ง๋ง ๋ด๋ถ์์ ์ด๋ค ์์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๋๋์ง๋ ์์ธํ๊ฒ ์์๋ณด์ง ๋ชปํ๋ค. ๊ทธ๋ผ ๋ด๋ถ์ ํ๋ฆ์ ํ๋ฒ ์์๋ณด์. ์ธ์ฆ vs ์ธ๊ฐ ์ธ์ฆ(Authentication) ์ฌ์ดํธ์ ์ ๊ทผํ๋ ์ฌ๋์ด ๋๊ตฌ์ธ์ง ์์คํ ์ด ์์์ผ ํ๋ค. ์ต๋ช ์ฌ์ฉ์(anonymous user)๋ฅผ ํ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ง๋ง, ํน์ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ฑฐ๋ ๊ฐ์ธํ๋ ์ฌ์ฉ์ฑ์ ๋ณด์ฅ ๋ฐ๊ธฐ ์ํด์๋ ๋ฐ๋์ ๋ก๊ทธ์ธํ๋ ๊ณผ์ ์ด ํ์ํ๋ค. ๋ก๊ทธ์ธ์ ๋ณดํต username / password ๋ฅผ ์ ๋ ฅํ๊ณ ๋ก๊ทธ์ธํ๋ ๊ฒฝ์ฐ์ sns ์ฌ์ดํธ๋ฅผ ํตํด ์ธ์ฆ์ ๋๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ..

๋ค์ด๊ฐ๊ธฐ ์ ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ API๋ฌธ์๋ฅผ REST Docs๋ฅผ ์ฌ์ฉํด ๋ง๋ค๊ธฐ๋ก ํ์๋ค. API ๋ช ์ธ์๋ฅผ REST Docs๋ฅผ ์ฌ์ฉํด์ ์์ฑํ๋๊ฑด ์ฒ์์ด์ฌ์ ํ๋ก์ ํธ๋ฅผ ์์ํ๊ธฐ์ ์ ์ด๋ฐ์ ๋ฐ ํ ์คํธ๋ฅผ ์งํํด ๋ณด์๋ค. ๊ทธ๋ผ ์ง๊ธ๋ถํฐ ์์๋ณด์! REST Docs? Spring REST Docs๋ ์ ํํ๊ณ ๊ฐ๋ ์ฑ ์ข์ REST ๋ฌธ์๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ํ๋ก์ ํธ์ด๋ค. Asciidoctor๋ฅผ ํ์ฉํด์ ํ ์คํธ์ฝ๋๋ฅผ adoc์ผ๋ก ๋ณํํ HTML๋ก ๋ณํ์์ผ์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ๋์์ผ๋ก Markdown์ ์ฌ์ฉํ ์๋ ์๋ค. Adoc? adoc์ ๋ฌธ์๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฒฝ๋ํ ๋งํฌ์ ์ธ์ด์ด๋ค. asciidoctor๋ฅผ ํตํด html์ด๋ pdf๋ฑ์ ํํ๋ก ๋ณํํ์ฌ ํ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋จผ์ Spring MVC์ test์์ ์ ๊ณต..
ํ๊ฒฝ๋ถ๋ฆฌ์ ํ์์ฑ ์ค์ ๋ฐฐํฌํ ์๋น์ค๋ผ๋ฉด, ๊ฐ๋ฐ ์๋ฒ์ ์ด์ ์๋ฒ๋ฅผ ๋๋ ์ ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค. ์ถ๊ฐ์ ์ผ๋ก ํ ์คํธ ํ๊ฒฝ๋ ๋ถ๋ฆฌํด์ฃผ๋ฉด ์ข๊ณ , JPA๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ddl-auto: create ๋ฅผ ์ฌ์ฉํ๋ ์ด๊ธฐ ํ๊ฒฝ์ธํ ๋ ๋ถ๋ฆฌํด๋๋ฉด ์ด์ ์๋ฒ์์ create๊ฐ ์คํ๋๋ ๋์ฐธ์ฌ๋ฅผ ์๋ฐฉ๊ฐ๋ฅํ๋ค. ํ๊ฒฝ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ ํ๊ฒฝ๋ถ๋ฆฌ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๋ ํฌ๊ฒ ๋ ๊ฐ์ง์ด๋ค. 1. yml ํ์ผ ๋๋๊ธฐ 2. ํ๋์ yml ํ์ผ ์์์ ๋๋๊ธฐ ๊ธฐ๋ณธ ํ๊ฒฝ ์ธํ JPA์ ์คํ๋ง๋ถํธ2.7.1๋ก ๊ธฐ๋ณธ ํ๊ฒฝ์ ๊ตฌ์ฑ Entity๋ ๊ฐ๋จํ๊ฒ User ๋ฅผ ๋ง๋ค์ด๋๊ณ , ์คํํด๋ณด๋ ํฌํธ 8080์ผ๋ก ์ ์คํ๋๊ณ , ddl-auto: create ์ค์ ์ ๋ง๊ฒ ํ ์ด๋ธ์ด ์์ฑ๋๋ค. db์๋ ์ ์์ฑ์ด ๋๋ค. ์ด์ ํ๊ฒฝ์ ๋ถ๋ฆฌํด๋ณด์. yml ํ์ผ ๋๋๊ธฐ app..

๋ค์ด๊ฐ๊ธฐ์ ์ ์ด๋ฒ ํ๋ก์ ํธ์์ ๋ฉค๋ฒ ๋ถ๋ถ์ ๊ตฌํํ๊ฒ ๋์๋ค. ๊ทธ์ ์ ์คํ๋ง ์ํ๋ฆฌํฐ์ ๋ํด์ ์์ธํ๊ฒ ํ์ตํ๊ณ ๊ฐ๋ณด์! Spring Security๋? ์คํ๋ง ์ํ๋ฆฌํฐ๊ฐ ์ ์ฉ๋์ง ์์์์์ ๋ฌธ์ ์ ์ ๋จผ์ ์์๋ณด์. 1. ๋ก๊ทธ์ธ๊ธฐ๋ฅ์ Authentication(์ธ์ฆ) ์ด ์์. 2. API์ ๋ํ ๊ถํ ๋ถ์ฌ Authirization(์ธ๊ฐ) ๊ธฐ๋ฅ์ด ์์. 3. ์น ๋ณด์ ์ทจ์ฝ์ ์ ๋ํ ๋๋น(CSRF, ํด๋ฆญ์ ํน ๋ฑ)๊ฐ ์์. ๊ทธ๋ผ ์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ์ ์ฉํ๋ฉด ์ด๋ค์ ์ด ๋ฌ๋ผ์ง๊น? ๋ค์ํ ์ ํ(ํผ ๋ก๊ทธ์ธ ์ธ์ฆ, ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ, OAuth 2 ๊ธฐ๋ฐ ์ธ์ฆ, LDAP ์ธ์ฆ)์ ์ฌ์ฉ์ ์ธ์ฆ ๊ธฐ๋ฅ ์ ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ฉ์์ ์ญํ (Role)์ ๋ฐ๋ฅธ ๊ถํ ๋ ๋ฒจ ์ ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๊ณตํ๋ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ ์ ์ด ๋ฏผ๊ฐํ ์ ๋ณด..

H2 DB H2 DB๋ ์๋ฐ ๊ธฐ๋ฐ์ ์คํ์์ค ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ ์ด๋ค. ๋ณดํต ํ ์คํธ ๋จ๊ณ๋ ์์ ๋จ๊ณ์์ ์ฌ์ฉ์ด ๋๋ฉฐ, Gradle์ด๋ Maven์ ์์กด์ฑ๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋น ๋ฅด๊ฒ ์ด์ฉ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ฌํ H2 DB ๋ 3๊ฐ์ง ๋ชจ๋๋ก ์ง์๋๋ค. In-memory Embedded Mode Server Mode Inmemory mode WAS ๊ตฌ๋์์ H2 DB์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. WAS๊ฐ ์ข ๋ฃ๋๋ฉด, ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ์๋ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ํ๋ฐ์ฑ์ผ๋ก ์ฌ๋ผ์ง๋ค. ์ฆ ์ด๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํ๋ฐ์ฑ์ผ๋ก ํ ์คํธ๋ฑ์ ์ฌ์ฉํ๊ธฐ ์ ํฉํ๋ค. Embedded Mode WAS ๊ตฌ๋์์ H2 DB๋ฅผ PC์ ๋์คํฌ์ ์ ์ฅํ์ฌ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. In-memory์ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง์ง ์๋ ๋นํ๋ฐ์ฑ๋ชจ๋์ด๊ธฐ ..

์ด๋ฒ์ ์งํํ๋ 2๊ฐ์ง ํ๋ก์ ํธ์์ ์น์์ผ์ ์ด์ฉํด์ ์ฑํ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผํ๋ค. ๊ทธ์ ์ ์น์์ผ์ด ๋ญ์ง ์์๋ณด๋๋ก ํ์! ์น์์ผ(Web Socket)? ์น์์ผ ํ๋กํ ์ฝ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ฅผ ์ฐ๊ฒฐํ๊ณ , ์ค์๊ฐ์ผ๋ก ํต์ ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ ํ๋กํ ์ฝ์ด๋ค. ์ฌ๊ธฐ์ ์ฃผ๋ชฉํด์ผํ ์ ์ ์ค์๊ฐ์ด๋ผ๋ ์ ์ด๋ค. HTTP ํต์ ์ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒฝ์ฐ์๋ง ์๋ฒ๊ฐ ์๋ตํ๋ ๋จ๋ฐฉํฅ ํต์ ์ด์ง๋ง, ์น์์ผ์ ์๋ฐฉํฅ, ์ค์๊ฐ ํต์ ์ ํ๋ค. ๋ํ ์น์์ผ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต์์ ๋์ํ๋ฉฐ HTTP์ ๋ค๋ฅด๊ฒ ์ํ(Stateful) ํ๋กํ ์ฝ์ด๋ค. ์ฐ๊ฒฐ์ ๋งบ๊ธฐ์ํด ํ๋ฒ์ ํธ๋์ ฐ์ดํฌ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ณ , ์ดํ์ ์ง์์ ์ผ๋ก ์ฐ๊ฒฐ์ ๋ณด์ฅํ๋ค. ์ด๋ ๋งค๋ฒ ๋งค์ธ์ง ์ ์ก์ ์๋ก์ด ์ฐ๊ฒฐ์ ๋งบ์ ํ์๊ฐ ์์ด ํจ์จ์ ์ด๋ค. ์ฆ, ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ํ๋ฒ์ ์ฐ๊ฒฐ์ ..
JPA์ postgreSQL ์ฐ๋ ๋ฐฉ๋ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น JPA์ postGreSQL ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ค. implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.postgresql:postgresql' application.yml ์ค์ spring: datasource: url: jdbc:postgresql://localhost:5432/ username: password: driver-class-name: org.postgresql.Driver jpa: show-sql: true database: postgresql hibernate: ddl-auto: update ์ด๋ ๊ฒ ์ค์ ์ ๋ง์น๋ฉด ์ฌ์ฉ์ด ..
Builder Pattern ์๋ฐ์์ ๊ฐ์ฒด๋ฅผ ์ ์ํ์ฌ ์์ฑํ ๋ ๋ณดํต ์์ฑ์๋ฅผ ํตํด ๊ฐ์ ์ฃผ์ ํ์ฌ ์์ฑํ๋ค. Person hae = new Person("ํด์", 27, "๊ฐ๋ฐ์"); ์ด๋ ๊ฒ ์์ฑ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋จ์ ์ด ์๋ค. 1. ๊ฐ์ ์ค์ ์์๊ฐ ์๋ค. ์์ฑ์์ ๊ฒฝ์ฐ์๋ ์ ํด์ง ํ๋ผ๋ฏธํฐ์ ์์๋๋ก ๊ฐ์ ๋ฃ์ด์ค์ผํ๋ค. ์์๋ฅผ ๋ฌด์ํ๊ณ ๋ฃ๊ฒ๋๋ฉด ๋ค๋ฅธ ๋ณ์์ ๋ค๋ฅธ ๊ฐ์ด ํ ๋น๋๋ ๋ญํจ๊ฐ ์๊ธด๋ค. ์ด์๋ฐํด ๋น๋ํจํด์์๋ ํ๋ ์ด๋ฆ์ผ๋ก ๊ฐ์ ์ค์ ํ์ฌ, ์์์ ์ข ์๋์ง์๋๋ค. ์ด๋ค ํ๋๋ฅผ ๋จผ์ ์ค์ ํด์ผํ๋์ง ์๊ฐํ ํ์์์ด ํธํ๊ฒ ๋์ดํ๋ฉด๋๋ค. 2. ์์ฑ์์ ํ๋ผ๋ฏธํฐ๊ฐ ๋ง์ผ๋ฉด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค. ์์์์ ์ฒ๋ผ 3๊ฐ์ง์ ํ๋ผ๋ฏธํฐ๋ง ๋ฐ๋ ๊ฒฝ์ฐ์๋ ํฌ๊ฒ ๊ฐ๋ ์ฑ์ ๋ฌธ์ ๊ฐ ์์๊ฒ์ด๋ค. ํ์ง๋ง 10๊ฐ์ง ์ ๋ณด๋ฅผ..

ํ์ด์ง๋ค์ด์ ? ํ์ด์ง์ ๊ฒ์๊ธ, ๋๊ธ ๋ฑ์ ํ์ถํ ์์ด ๋ง์์ง๋, ์์ฃผ ์ค์ํ ์ญํ ์ ํ๋ค. ํ์ด์ง์ ํตํด์ ๋ง์ ์ ๋ณด ์ฆ, ์๋ฐฑ ์์ฒ๊ฐ์ ๊ฒ์๊ธ๋ฑ์ ์ ๋ณด๋ฅผ ํ์ด์ง๋ก ๋๋ ์ ํจ๊ณผ์ ์ผ๋ก ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ฒ ํ๋ค. ์ด๋ฐ ํ์ด์ง์ ์ํด์๋ page๊ด๋ จ ์ฟผ๋ฆฌ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์์ง๋ง, Spring Data JPA์์ ํจ๊ณผ์ ์ธ ํ์ด์ง ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. JpaRepository ์ ๋ถ๋ชจ์ธํฐํ์ด์ค์ธ PagingAndSortingRepository์์ ํ์ด์ง๊ณผ Sorting ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. findAll() ๋ฉ์๋์ ๋ฐํ ํ์ ์ ์ดํด๋ณด๋ฉด, ์๋์ ๊ฐ์ ๋ฉ์๋๊ฐ ์กด์ฌํ๋ค. Pageable : ํ์ด์ง์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค Page : ํ์ด์ง์ findAll()์ ๊ธฐ๋ณธ์ ์ธ ๋ฐํ ๋ฉ์๋๋ก ์ฌ๋ฌ ๋ฐํํ์ ์ค..

MVC ํจํด MVC ํจํด์ ๋ฑ์ฅ ์ด์ ํ๋์ ์๋ธ๋ฆฟ or JSP๋ง ์ฌ์ฉํด์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ทฐ๋ฅผ ์ฒ๋ฆฌํ๋ฉด ๋๋ฌด ๋ง์ ์ญํ ์ ๋ด๋นํ๊ฒ ๋์ด ์ ์ง๋ณด์์์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค. UI์ ์์ ๊ณผ ๋น์ฆ๋์ค๋ก์ง์ ์์ ํ๋ ์ผ์ ์๋ก์๊ฒ ์ํฅ์ ์ฃผ์ง ์์์ผํ๋๋ฐ ํ๋์ ์ฝ๋๋ก ๊ด๋ฆฌํ๊ฒ ๋๋ค๋ฉด ์ด๋ ค์์ด ์๋ค. MVC ํจํด์ด๋? MVCํจํด์ Model, View, Controller ๋ผ๋ ์์ญ์ผ๋ก ์๋ก์ ์ญํ ์ ๋๋๊ฒ์ ์๋ฏธํ๋ค. ์น์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ฌํ ํจํด์ด ๋ง์ด ์ฌ์ฉ๋๋ค. ์์ ๊ทธ๋ฆผ์์ผ๋ก ์ปจํธ๋กค๋ฌ์ ๋น์ฆ๋์ค์ ๋ก์ง์ ๋ด๋๊ฒ์ผ๋ก ํํ๋์ด ์์ง๋ง, ๋น์ฆ๋์ค๋ก์ง์ Service ๊ณ์ธต์ ๋ง๋ค์ด ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค. ๊ทธ๋ฆฌ๊ณ ์ปจํธ๋กค๋ฌ๋ ์ด๋ฌํ ์๋น์ค๋ฅผ ํธ์ถํ๋ ์ญํ ์ ํ๋ค. Controller : HTTP ์์ฒญ์ ๋ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฒ..