Spring
ํ๋ก์ ํธ๋ฅผ ๋ฆฌํฉํฐ๋ง ํ๋ฉด์ ์กฐํํ๋ ๋ถ๋ถ์ ์บ์ฑ์ ์ ์ฉํ๋ ค๊ณ ํ๋ค! ์ ์บ์ฑ์ ์ ์ฉํ๋ ค๊ณ ํ๋? ! ํด๋น ์๋น์ค๋ ํ ํ๋ฉด์์ ์ง๋์์ ๋ด๊ฐ ์์ฑํ ๋ชจ๋ ๊ฒ์๊ธ ์์น๋ฅผ ํํํด ์ค๋ค. ์ค์ง์ ์ผ๋ก ๊ฒ์๊ธ ๋ฑ๋ก, ์ญ์ ๋ณด๋ค ์กฐํ์๊ฐ ํจ์ฌ ๋ง์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ , ๊ฐ์ฅ ๋ง์ด ๋
ธ์ถ๋๋ ํ ํ๋ฉด์์ ๊ณ์ ์์น ์ ๋ณด๋ฅผ ๋ถ๋ฌ์จ๋ค๋ฉด ์ฑ๋ฅ์ ์ผ๋ก ์ข์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.! ์คํ๋ง ์บ์๊ฐ ๋ฌด์์ธ์ง๋ ์๋ ๊ธ์ ์ ๋ฆฌํด๋์๋ค๐ [Spring] Spring Cache(์คํ๋ง ์บ์)๋?๐ Spring Cache๋? ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋งค๋ฒ ์์ฒญํ ๋๋ง๋ค ์์ฑํ์ฌ ์๋ตํ๋ ๊ฒ๋ณด๋ค๋ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด ๋๊ณ ๋๊ฐ์ ์์ฒญ์ด ์์ ๋ ๋ก์ง์ ๊ฑฐ์น์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด ์ฃผ์ด ๋น ๋ฅธ dahliachoi.tistory.com ๐ ์บ์ฑ..
Spring
ํ๋์ฝ๋ฉ๊ณผ ์ค๋ณต์ ์ง์ํ๊ณ ์ @PrePersist, @PreUpdate ์ฌ์ฉ์ ๋๋ฆฌ๊ณ ์๋ค. ๐ฑ @PrePersist ๋? JPA ์ํฐํฐ๊ฐ ๋น์์ ์ํ์์ ์์ ์ํ๊ฐ ๋๋ ์์ ์ ์คํ๋๋ค. ์ฆ, ์ํฐํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๊ธฐ ์ ์ JPA Provider์ ์ํด ์๋์ ์ผ๋ก ํธ์ถ๋๋ค. ๐ฑ @PreUpdate ๋? ์์ ์ํ์ ์ํฐํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ ์
๋ฐ์ดํธ๋ฅผ ์ํํ๊ธฐ ์ด์ ์ ์คํ๋๋ค. ์ฆ, ์ํฐํฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๊ธฐํ๋๊ธฐ ์ ์ JPA Provider์ ์ํด ์๋์ ์ผ๋ก ํธ์ถ๋๋ค. ๐ซง ์ฌ์ฉ ์ ์ ์ํ ์ ์ ์ ํ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํด์ผ ํ๋ค. ๋ก์ง์ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํด์ผ ํ๋ค. ๋ณต์กํ ๋ก์ง์ @PrePersist, @PreUpdate ๋ด์์ ํผํ๋ค. ์ธ๋ถ ์์คํ
๊ณผ์ ์ํธ์์ฉ์ ํผํ๋ค. ์ํฐํฐ์ ์..
Spring
๐ฑ N+1 ๋ฌธ์ ๋? JPA ์ฐ๊ด๊ด๊ณ์์ ์๊ธฐ๋ ์ด์๋ก ์ฐ๊ด ๊ด๊ณ๊ฐ ์ค์ ๋ ์ํฐํฐ๋ฅผ ์กฐํํ ๊ฒฝ์ฐ ์กฐํ๋ ๋ฐ์ดํฐ ๊ฐ์(N)๋งํผ ์ฐ๊ด ๊ด๊ณ์ ์กฐํ ์ฟผ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ๋ฐ์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ๋ฌธ์ ๋ฅผ ๋งํ๋ค. ๐ค ๊ทธ๋ผ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ ๊น? 1. Fetch Type์ Lazy๋ก ์ค์ ํ๋ค. 2. fetch join์ ์ฌ์ฉํ๋ค. 3. Batch Size๋ฅผ ์กฐ์ ํ๋ค. ์ฌ๊ธฐ์ ๋ 1, 2๋ฒ์ ๊ฐ์ง๊ณ ํด๊ฒฐํด ๋ณด์๋ค. ๐ฉ๐ป๐ป ํด๊ฒฐ ๊ณผ์ ๋ฐ ํ
์คํธ ๋๋ ์ด ํ๋ก์ ํธ์์ ๋ชจ๋ ์ ์ ๊ฐ์ฒด์ ๋ํด์ ๊ธ ์ ๋ณด์ ๊ฐ์ด ๋งคํํ๋ ์ฝ๋๋ฅผ ์์ฑํ์๋ค. Member ๊ฐ์ฒด์์ fetch type์ Lazy๋ก ์ค์ ํ์๋ค. ํ์ง๋ง ์ด๋ ๊ฒ๋ง ๋ถ์ธ๋ค๊ณ ํด์ ํด๊ฒฐ์ด ๋์ง ์๋๋ค. public ListResult testGetMembersV1() { L..
Spring
ํ๋ก์ ํธ์์ ๊ฐ๋จํ jwt๋ฅผ ์ด์ฉํ ๋ก๊ทธ์ธ์ ๊ตฌํํด ๋ดค๋ค! ๐ฑ Spring Security๋? ์ธ์ฆ(Authentication), ๊ถํ(Authorize) ๋ถ์ฌ ๋ฐ ๋ถํธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ์ด๋ค. ์ธ์ฆ vs ์ธ๊ฐ ๋ณดํต ์ธ์ฆ ์ ์ฐจ๋ฅผ ๊ฑฐ์น ํ ์ธ๊ฐ ์ ์ฐจ๋ฅผ ๊ฑฐ์น๋ค. ์ธ์ฆ ํ์ฌ ์ ์ ๊ฐ ๋๊ตฌ์ธ์ง ํ์ธํ๋ ๊ณผ์ (๋ก๊ทธ์ธ) ์ ํ๋ฆฌ์ผ์ด์
์ ์์
์ ์ํํ ์ ์๋์ง ์ฆ๋ช
์ธ๊ฐ ํ์ฌ ์ ์ ์ ๊ถํ์ ๊ฒ์ฌํ๋ ๊ณผ์ ํ์ด์ง๋ ๋ฆฌ์์ค ๋ฑ์ ์ ๊ทผํ ์ ์๋์ง ๊ฒ์ฌ Spring Security ๊ตฌ์กฐ 1. Http Request ์์ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ ์ ๋ณด์ ํจ๊ป ์ธ์ฆ ์์ฒญ์ ํ๋ค. 2. ์ ์ ์๊ฒฉ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆ ํ ํฐ ์์ฑ AuthenticationFilter๊ฐ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ , ๊ฐ๋ก์ฑ ์ ๋ณด๋ฅผ ํตํด UsernamePasswordA..
Spring
์ธํด ์ํ์ ํ๋ฉด์ @AllArgsConstructor, @RequiredArgsConstructor ์ด ๋ ์ด๋
ธํ
์ด์
์ ๋ณธ ์ ์ด ์์๋๋ฐ, ๊ทธ๋ฅ ์ฌ์ฉ์ ์ํ๋๊ฑฐ๊ตฌ๋๋ผ๊ณ ๋ง ์๊ฐํ์๋ค. ๊ทธ๋์ ์ด๋ฒ ํ๋ก์ ํธ์์๋ ์ฌ์ฉ์ ์ง์ํ๊ณ ์์๋๋ฐ ๋ฌธ๋ฉ ์ ์ง์ํ ๊น๋ผ๋ ์๋ฌธ์ด ๋ค์๋ค! ์ผ๋จ spring di๋ถํฐ ์์ฑํ์๋ฉด! Spring DI๋? DI๋ ์คํ๋ง ํต์ฌ ๊ธฐ์ ์ด๋ผ๊ณ ์๊ฐํ๋ ์์กด์ฑ ์ฃผ์
์ด๋ค. ๊ฐ์ฒด๋ค๊ฐ์ ์์กด์ฑ์ ์ค์ด๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์คํ๋ง IoC ์ปจํ
์ด๋์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ๋ฐฉ์์ ๋งํ๋ค. ์์กด์ฑ ์ฃผ์
ํ๋ ๋ฐฉ๋ฒ์๋ ์์ฑ์ ์ฃผ์
, ํ๋ ์ฃผ์
, setter ์ฃผ์
์ธ๊ฐ๊ฐ ์กด์ฌํ๋๋ฐ ๊ทธ ์ค์์ ์คํ๋ง์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๊ณ ๊ถ์ฅํ๋ ๋ฐฉ์์ ์์ฑ์ ์ฃผ์
์ด๋ค. @Service public class UserService {..
Spring
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค๊ฐ ์์ธ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ฒผ๋ค! ํด๋น ์์ธ์ ๋ํ ๊ฒฐ๊ณผ ๊ฐ๋ ๋ฐํํ์ด์ผ ํด์ try-catch๋ฅผ ์ฌ์ฉํ ๊น ํ์ง๋ง ๋ฐํํ ์์ด ๋ฌ๋ผ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ ๊น ๊ณ ๋ฏผ์ ํ๋ ์ค์ @ExceptionHandler๋ฅผ ํตํด์ ์ฒ๋ฆฌํด ์ฃผ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค! ๊ทผ๋ฐ @ExceptionHandler๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ปจํธ๋กค๋ฌ์ ๋งค๋ฒ ์ง์ ์ ํด์ฃผ๊ฒ ๋๋ฉด ์ฝ๋ ์ค๋ณต์ด ๋๋ฌด ๋ง์ด ๋ฐ์ํ๊ฒ ๋ผ์ @ControllerAdvice๋ฅผ ํตํด ์ ์ญ์ ์ผ๋ก ์์ธ๋ฅผ ํธ๋ค๋ง ํ ์ ์๊ฒ ์ฒ๋ฆฌํ๋ค. ๐ ์ฌ์ฉํ ์ฝ๋ @RestControllerAdvice public class ExceptionAdviceController { private final ResponseService responseService; public Exce..
Spring
ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ ๋ ๊ตญ์ ํ ์ ์ฉ์ ํด๋ณด์๋ค. ๐ฑ i18n ๊ฐ๋
i18n์ด๋ internationalization(i์ n์ฌ์ด 18๊ธ์)์ ์ค์ธ ๊ฒ์ผ๋ก ํ๊ตญ์ด๋ก ๋ฒ์ญํ๋ฉด '๊ตญ์ ํ'๋ผ๋ ๋ป์ด๋ค. ๊ตญ์ ํ๋ ๋ฌธํ, ์ง์ญ, ์ธ์ด๊ฐ ๋ค์ํ ๋์ ๊ณ ๊ฐ์ ์ํด ์ฝ๊ฒ ํ์งํ๋ ์ ์๋ ์ ํ, ์ ํ๋ฆฌ์ผ์ด์
๋๋ ๋ฌธ์ ์ฝํ
์ธ ๋ฅผ ์ค๊ณํ๊ณ ๊ฐ๋ฐํ๋ ๊ฒ์ด๋ค! โ๏ธ build.gradle ์ ์์กด์ฑ ์ถ๊ฐ ๋๋ ymlํ์ผ์ ํตํด ๋ฉ์์ง๋ฅผ ๊ด๋ฆฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์กด์ฑ์ ์ถ๊ฐํด์คฌ๋ค! properties๋ก ํ ๊ฑฐ๋ฉด ์ถ๊ฐ ์ ํด๋ ๋ ๊ฒ ๊ฐ๋ค! implementation 'net.rakugakibox.util:yaml-resource-bundle:1.1' โ๏ธ application.yml์ ๋ฉ์์ง ๊ฒฝ๋ก ์ค์ ๋ฐ ์ค์ ํ์ผ ..
Spring
๐ Spring Cache๋? ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋งค๋ฒ ์์ฒญํ ๋๋ง๋ค ์์ฑํ์ฌ ์๋ตํ๋ ๊ฒ๋ณด๋ค๋ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด ๋๊ณ ๋๊ฐ์ ์์ฒญ์ด ์์ ๋ ๋ก์ง์ ๊ฑฐ์น์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด ์ฃผ์ด ๋น ๋ฅธ ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋ก์ปฌ ์บ์์ด๊ธฐ ๋๋ฌธ์ application๊ฐ ๊ณต์ ๊ฐ ๋์ง ์๊ณ ์๋ฒ๋ฅผ ๋ ๋ ๋ฐ์ดํฐ๊ฐ ๋ ์๊ฐ๋ฏ๋ก ๊ณ์ ์ ์งํ๊ณ ์ถ๋ค๋ฉด redis ๊ฐ์ ์ธ๋ถ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ์ฌ์ฉํด์ผ ํ๋ ๊ณณ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ๋๋ ๊ฐ์ด ๋์ผํ ๋ ๋น๋ฒํ๊ฒ ํธ์ถ๋ ๋ ํ ๋ฒ ์ฒ๋ฆฌํ ๋ ๋ง์ ์๋ฒ ๋ฆฌ์์ค๋ฅผ ์๊ตฌํ ๋ ์ฌ์ฉํ์ง ๋ง์์ผ ํ ๊ณณ ์ค์๊ฐ์ผ๋ก ์ ํ์ฑ์ ์๊ตฌํ๋ ๊ฒฝ์ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ ์คํ๋ง ์ค์ implementation 'org.springframework.boot..
Spring
Form ์ธ์ฆ - PasswordEncoder ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ๊ฒ ์ํธํํ๋๋ก ์ ๊ณต ์์ฑ PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder() ์ฌ๋ฌ ๊ฐ์ PasswordEncoder ์ ํ์ ์ ์ธํ ๋ค, ์ํฉ์ ๋ง๊ฒ ์ ํํด์ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ Encoder์ด๋ค. ์ํธํ ํฌ๋งท {id}encodedPassword ๊ธฐ๋ณธ ํฌ๋งท์ Bcrypt : {bcrypt}$2a@10~~~ ์๊ณ ๋ฆฌ์ฆ ์ข
๋ฅ : bcrypt, noop, pbkdf2, scrypt, sha256 PasswordEncoder๋ฅผ ์ด์ฉํด ๋น๋ฐ๋ฒํธ ์ํธํ๋ฅผ ํ ๋ค ์ฌ์ฉ์๋ฅผ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด! ์๋์ ๊ฐ์ด ํ๋ฉด ๋๋ค. (ํ์ง๋ง ์๋๋ ๊ฐ์๋ฅผ..
Spring
๊ณต๊ฒฉ์ ์ํ์ฑ ํด๋น ๋ก์ง์ ํตํด์ ํด์ปค๋ค์ด ๊ณต๊ฒฉ์ ํ๋ค. ์ฌ์ฉ์๊ฐ ์ผํ๋ชฐ์ ๋ก๊ทธ์ธํ๊ณ ๋์ ์ฟ ํค๋ฅผ ๋ฐ๊ธํ๋ฉด ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค๊ฐ ์ ์ฅ๋๋ค. ๊ณต๊ฒฉ์๊ฐ ๋งํฌ๋ฅผ ์ด์ฉ์์๊ฒ ์ ๋ฌํ๊ณ ์ฌ์ฉ์๋ ๋งํฌ๋ฅผ ํด๋ฆญํด์ ๊ณต๊ฒฉ์ฉ ์นํ์ด์ง์ ์ ์ํ๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฏธ์ง ํ์ผ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ ๊ณต๊ฒฉ์ฉ url์ ์ด๊ณ ์ผํ๋ชฐ์ ํด๋น ์ฟ ํค๋ฅผ ๊ฐ์ง ๋ธ๋ผ์ฐ์ ๋ฅผ ์์ฌํ์ง ์๊ณ ์ธ์ฆ์ ํ๋ค. ์ํ๋ฆฌํฐ๋ ์ด๋ฐ ๊ณต๊ฒฉ ๋ฐฉ์์ ๋ฐฉ์ดํ๊ธฐ ์ํด์ CsrfFilter๋ฅผ ๋ง๋ค์ด์ csrf์ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ๊ณ ์๋ค. CsrfFilter ๋ชจ๋ ์์ฒญ์ ๋๋ค ํ๊ฒ ์์ฑ๋ ํ ํฐ์ HTTP ํ๋ผ๋ฏธํฐ๋ก ์๊ตฌ ์์ฒญ ์ ์ ๋ฌ๋๋ ํ ํฐ ๊ฐ๊ณผ ์๋ฒ์ ์ ์ฅ๋ ์ค์ ๊ฐ๊ณผ ๋น๊ตํ ํ ๋ง์ฝ ์ผ์นํ์ง ์์ผ๋ฉด ์์ฒญ์ ์คํจํจ HTTP ๋ฉ์๋ : PATCH, POST, PUT, DE..