๐ง ์๋ก ์คํ๋ง์์๋ ์ปจํธ๋กค๋ฌ์์ ๋ฐ์ํ ์์ธ๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก @ExceptionHandler ์ @ControllerAdvice๋ฅผ ์ ๊ณตํด์ค๋๋ค. ์ด ๋์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ์๋๋ผ ์ด๋ค ์์ผ๋ก ๋์ํ๋์ง์ ๋ํด์ ๋ด๋ถ ์ฝ๋๋ฅผ ์ดํด๊ฐ๋ฉฐ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๐ง ์คํ๋ง์ ์ด๊ธฐํ ๊ณผ์ ์ฐ์ ์คํ๋ง์ ์ด๊ธฐํ ๊ณผ์ ๋ถํฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค. SpringAppliction์ run ๋ฉ์๋ ๋ด๋ถ์์, refreshContext()๋ฅผ ํตํด ๋น๋ค์ ์ด๊ธฐํํ๊ณ ์์กด๊ด๊ณ๋ฅผ ์ค์ ํ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ๋ฉ์๋์ ํธ์ถ์ ๋ฐ๋ผ๊ฐ๋ค๋ณด๋ฉด AbstractApplicationContext์ refresh()๋ฅผ ํธ์ถํ๊ฒ ๋ฉ๋๋ค. ์ด๊ณณ์์๋ finishBeanFactoryInitialization() ๋ฉ์๋๋ฅผ ํตํด ์ด์ ๊ณผ์ ๋ค์์ ๋ฑ๋ก๋์ง..
๐๏ธ Spring
์ด ๋ฌธ์ ํด๊ฒฐํ๋ ค๊ณ ๊ฑฐ์ 5์๊ฐ๋์ ๋๋ฒ๊น
ํด์ ์์ธ ์ฐพ์๋๋๋ฐ, ์๊ณ ๋ณด๋๊น 1์ 26์ผ์ธ๊ฐ(๋ถ๊ณผ ํ๋ฌ ์ ) ํด๊ฒฐ๋์ด ์๋๋ผ๊ตฌ์.. ๋ค๋ง ์์ง ์คํ๋ง๋ถํธ jpa dependency ๋ฒ์ ์ ๋ฐ์์ด ์๋์ด์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋ณด๊ณ ๊ทธ๋ฅ ์ฌํผํ๋ ์ค์
๋๋ค. ์๋ง ๊ณง ํด๊ฒฐ๋ ๊ฒ ๊ฐ์๋ฐ, ํด๋น ์ค๋ฅ๋ Hibernate 6.2 ์ด์ ๋ฒ์ ์์ ๋ฐ์ํฉ๋๋ค. ๐ง ๋ฌธ์ ์ํฉ ์ฌํ ์๋์ ๊ฐ์ด 1๋ ๋ค ์ฐ๊ด๊ด๊ณ๋ฅผ ๊ฐ์ง One๊ณผ Many๋ฅผ ์ ์ํ์์ต๋๋ค. @Entity public class One { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToMany(fetch = FetchType.LAZY, orphanRemoval =..
๐ง ์ฌ๋ฌ ์ปฌ๋ผ์ ๋ํ UNIQUE ์ ์ฝ์กฐ๊ฑด ์ค์ ํ๊ธฐ @Table์ uniqueConstraints ์์ฑ์ ์ฌ์ฉํ์ฌ ์ค์ ํ ์ ์์ต๋๋ค. ์ฌ์ฉ ์์ @Table( name="ํ
์ด๋ธ ์ด๋ฆ", uniqueConstraints={ @UniqueConstraint( name = "unique ์ ์ฝ์กฐ๊ฑด ์ด๋ฆ", columnNames = { "ํฌํจํ ์ปฌ๋ผ์ด๋ฆ 1", "ํฌํจํ ์ปฌ๋ผ์ด๋ฆ 2" } ), } columnNames๋ ํ๋๊ฐ ์๋ ์ปฌ๋ผ๋ช
๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค. @Table( uniqueConstraints={ @UniqueConstraint( columnNames={"column1"}) } ) @Table( uniqueConstraints = { @UniqueConstraint(name = "UniqueNumber..
๐ง SecurityBuilder & SecurityConfigurer SecurityBuilder๋ ์น ๋ณด์์ ๊ตฌ์ฑํ๋ ๋น ๊ฐ์ฒด์, ์ค์ ํด๋์ค๋ค์ ์์ฑํ๋ ์ญํ ์ ์ํํ๋ฉฐ, ๊ทธ ์ข
๋ฅ๋ก๋ WebSecurity, HttpSecurity๊ฐ ์์ต๋๋ค. SecurityConfigurer์ Http ์์ฒญ๊ณผ ๊ด๋ จ๋ ๋ณด์์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ํํฐ๋ค์ ์์ฑํ๊ณ , ์ฌ๋ฌ ์ด๊ธฐํ ์์
์ ๊ด์ฌํฉ๋๋ค. SecurityBuilder๋ ์๋์ ๊ฐ์ด SecurityConfigurer๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ์ธ์ฆ ๋ฐ ์ธ๊ฐ ์ด๊ธฐํ ์์
์ SecurityBuilder ๋ด๋ถ์์ SecurityConfigurer๋ฅผ ํตํด ์งํ๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ด๊ธฐํ ์์
์ SecurityBuilder์ build() ๋ด๋ถ์์ ์คํ๋๋ฉฐ, ์๋์ ๊ฐ์ด init()๊ณผ ..
๐ง ์ํฉ ์ธ์ฆ ์ JWT๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ์ ์งํํ๋ฉฐ, ํ์๊ฐ์
๊ณผ ๋ก๊ทธ์ธ์ ์ ์ธํ ๋ชจ๋ URL์ ๋ํด์ ์ธ์ฆ ๊ด๋ จ Interceptor๋ฅผ ๊ตฌํํ์ฌ ๋ฑ๋กํด ๋ ์ํ์์ต๋๋ค. ํด๋น ์ธํฐ์
ํฐ์์๋ AccessToken์ด ์๋ ๊ฒฝ์ฐ ์์ธ๋ฅผ throw ํ๋๋ก ๊ตฌํํ์๋๋ฐ, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋์์ต๋๋ค. @Component public class LogInInterceptor implements HandlerInterceptor { // ์๋ต @Override public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) { AccessToken token = extractA..
๐ง N + 1 ๋ฌธ์ N + 1 ๋ฌธ์ ๋ ์ฐ๊ด๊ด๊ณ๊ฐ ์ค์ ๋ ์ํฐํฐ ์ฌ์ด์์ ํ ์ํฐํฐ๋ฅผ ์กฐํํ์์ ๋, ์กฐํ๋ ์ํฐํฐ์ ๊ฐ์(N ๊ฐ)๋งํผ ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ N + 1์์, 1์ ํ ์ํฐํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํ ์ฟผ๋ฆฌ์ ๊ฐ์์ด๋ฉฐ, N์ ์กฐํ๋ ์ํฐํฐ์ ๊ฐ์๋งํผ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ์ฟผ๋ฆฌ์ ๊ฐ์๋ฅผ ์๋ฏธํฉ๋๋ค. N + 1๋ณด๋ค๋, 1 + N์ด๋ผ ๋ถ๋ฅด๋ ๊ฒ์ด ๋ ์ดํดํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ํฐํฐ ์กฐํ ์ฟผ๋ฆฌ(1 ๋ฒ) + ์กฐํ๋ ์ํฐํฐ์ ๊ฐ์(N ๊ฐ)๋งํผ ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํ ์ถ๊ฐ ์ฟผ๋ฆฌ (N ๋ฒ) ๐ง ๋ฐ์ํ๋ ์ํฉ N + 1 ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ์์๋ณด๊ธฐ ์ํด ๊ฒ์๊ธ๊ณผ ๋๊ธ์ ์์๋ก ์ฌ์ฉํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ํ๋์ ๊ฒ์..
๐ง ์๋ก ๋๋ฉ์ธ ์ด๋ฒคํธ๋ฅผ ํ๋ฒ ์ฌ์ฉํด๋ณด๊ณ ์ ์ด๋ฐ์ ๋ฐ ์๋ฃ๋ค์ ์ฐธ๊ณ ํ๋ฉฐ ์ฌ์ฉ์ ํ๋ ์ค์ ๋ฌธ์ ๊ฐ ํ๋ ๋ฐ์ํ์ต๋๋ค. ์ ๊ฐ ์ด๋ฒคํธ๋ฅผ ํตํด ํ๊ณ ์ ํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ชจ์ ์์ฑ (๋ชจ์ ์์ฑ ์ด๋ฒคํธ ๋ฐํ) -> ์ด๋ฒคํธ ์ฒ๋ฆฌ (๋ชจ์ ๊ธฐ๋ณธ ์ญํ ๋ฑ๋ก) & ๋ชจ์ ๊ธฐ๋ณธ ์ญํ ๋ฑ๋ก ์ด๋ฒคํธ ๋ฐํ -> ์ด๋ฒคํธ ์ฒ๋ฆฌ (๋ชจ์์ ์์ฑํ ํ์์ ํ์ฅ์ผ๋ก ๋ฑ๋ก) ์ฐ์ ๋ชจ์๊ณผ, ๋ชจ์์ ์ญํ , ๋ชจ์ ์ฐธ๊ฐ์๋ ๋ฐ๋ก๋ฐ๋ก ์์ ๋๊ณ ์ ๊ฑฐ๋ ์ ์์ผ๋ฏ๋ก, ๋ค๋ฅธ ์๊ทธ๋ฆฌ๊ฑฐํธ๋ผ ํ๋จํ์ฌ ์ด๋ค์ ๋ถ๋ฆฌํ์์ต๋๋ค. ์ ์ํฉ์์ ์ ๋ @TransactionalEventListener๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค. @Transactional @Service public class CreateClub implements CreateCl..
๐ฅบ ์๋ก ๋๋ฉ์ธ ๊ณ์ธต์ Repository์ ์์์ฑ ๊ณ์ธต์ Repository๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉํด๋ณด๋ ค ์๋ํ๋ ๊ณผ์ ์์, findBy*** ์์ ์ด๋ฆ์ ๋ฉ์๋์, @Query๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฑ์ ๋ฉ์๋๋ ์ด๋ค ์์ผ๋ก ์ฌ์ฉํด์ผ ํ๋์ง์ ๋ํด์ ์์๋ณด์๊ณ , ์ด๋ ค์ด ๋ด์ฉ์ ์๋๊ธฐ๋ ํ๊ณ ์๊ฐํ๋ ๋ฐฉ์ ๊ทธ๋๋ ์ ์ฉ๋๊ธด ํ์ง๋ง, ๊ทธ๋๋ ํน์ ๋์ ๋์๋ ๋ถ์ด ์์๊น๋ด ์์ฑํ๋ ค ํฉ๋๋ค. ๐ง ๋๋ฉ์ธ ๊ณ์ธต์ Repository์, ์์์ฑ ๊ณ์ธต์ Repository ๋ถ๋ฆฌํ๊ธฐ ์ ๋ ์ ์ฌ์ง์ฒ๋ผ ๋๋ฉ์ธ ๊ณ์ธต๊ณผ ์ธํ๋ผ์คํธ๋ญ์ณ ๊ณ์ธต์ ๋๋์๊ณ , JpaArticleRepository๋ ArticleRepository๋ฅผ ์์๋ฐ์ต๋๋ค. ArticleRepository๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์์ต๋๋ค. ์ด๋ฅผ ์์๋ฐ์ Jp..