๐พBackEnd/๐ฑ Spring(11)
-
N+1 ๋ฌธ์ ๋ค์ํ ํด๊ฒฐ๋ฒ
์๋ก JPA๋ฅผ ํ์ตํ๋ฉด ๋ฌด์กฐ๊ฑด ๋ฃ๋ ํค์๋๋ N+1 ์ด๋ค. ๋ณดํต ๋ธ๋ก๊ทธ์์ ์๊ฐํ๋ ๋ฐฉ์์ fetch join์ ํตํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ณ ์ด์ผ๊ธฐํ๋ค. ๋ฌผ๋ก ํ๋ฆฐ ๋ฐฉ์์ ์๋๋ค. ํ์ง๋ง ์ค์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๋ฉด์ N+1 ๋ฌธ์ ๋ฅผ ๋ง์ด ๋ง๋๋ณด๋ฉด์ N+1์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค. ์ํฉ์ ๋ฐ๋ผ์ N+1 ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ ์ ํ๊ฒ ํด๊ฒฐํ๋๊ฒ ์ฑ๋ฅ ์ ํ์ ๋ฌธ์ ์ ๋์ํ ์ ์๋ค๊ณ ์๊ฐํ๋ค. ๊ธ์ ์์ํ๊ธฐ ์ด์ ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋ฉด 1:1 ์ฐ๊ด๊ด๊ณ : Fetch join Collection ์ฐ๊ด๊ด๊ณ : default_batch_fetch_size N๊ฐ์ ์ปฌ๋ ์ ์ fetch join์ ํ๋ฉด MultipleBagFetchException์ด ๋ฐ์ํ๋ค. ํน์ ์ปฌ๋ผ์ ์กฐํํ ๊ฒฝ์ฐ์ join์ ํ๊ณ Projectio..
2023.12.15 -
[ Swagger ] Swagger UI๋ฅผ ํตํด API ๋ช ์ธ์ Postman ๊ณต์
1. ๊ธ์ ์์ฑํ ์ด์ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ API ์คํ์ ๊ณต์ ํ๊ธฐ ์ํด ๋ค์ํ ๋ฐฉ๋ฒ์ ์ฐพ์์ต๋๋ค. ๋ณดํต API ๋ฌธ์ํ๋ฅผ ํ๊ธฐ ์ํด์๋ Rest DOCS์ Swagger๋ฅผ ํตํด์ API๋ฅผ ๋ฌธ์ํ๋ฅผ ํ๋ค. ์ ํฌ๋ Swagger๋ฅผ ์ ํ์ ํ์๊ณ ๋ฌธ์ํ๋ฅผ ํ์์ผ๋ ๋ฌธ์ํ๋ฅผ ๋ค๋ฅธ ์ฌ๋์๊ฒ ๊ณต์ ํ๊ธฐ ์ํด์ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๋์ค์ ๋ฐฐํฌ๋ฅผ ํ์ง ์๊ณ Postman์ผ๋ก ๋ฌธ์ ๊ณต์ ํ๊ฐ ๊ฐ๋ฅํ์ฌ ๊ธ์ ์์ฑ์ ํ์ต๋๋ค. 2. Swagger UI ์ ์ฉํ๊ธฐ ์ฒ์์ Gradle์ ์์กด์ฑ์ ์ถ๊ฐ๋ฅผ ํฉ๋๋ค. implementation 'org.springdoc:springdoc-openapi-ui:1.6.9' ์ดํ Config์์ ์ ํฉ๋๋ค. @Configuration public class OpenApiConfig { @Bean publi..
2023.04.21 -
Mockito๋ ์๊ณ ํ ์คํธ ์ฝ๋ ์์ฑํ์
Mockito - mockito-core 5.2.0 javadoc Latest version of org.mockito:mockito-core https://javadoc.io/doc/org.mockito/mockito-core Current version 5.2.0 https://javadoc.io/doc/org.mockito/mockito-core/5.2.0 package-list path (used for javadoc generation -link option) https://javadoc.io/doc/org.m javadoc.io Mockito๋? Mock์ ์ฝ๊ฒ ๋ง๋ค๊ณ mock์ ํ๋์ ์ ํ๋ stubbing ๋ก์ง์ด ์คํ์ด ๋์๋์ง ํ์ธํ๊ธฐ ์ํ verify()๋ฅผ ์ด์ฉ์ด ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ํ๋ ์..
2023.03.24 -
์ํธํ Bcrypt์ ๋ํ ์ฌ์ธต ๋ถ์
๊ธ์ ์์ฑํ๋ ์ด์ ์ํธํ๋ ์๋น์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ํ์๋ก ๋ค์ด๊ฐ๋ ๋ถ๋ถ์ด๋ค. ์๋ฅผ ๋ค์ด ํ์๊ฐ์ ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ํธํ๋ฅผ ํ์๋ก ์งํ์ ํ๊ฒ ๋๋๋ฐ ์ด๋ Bcrypt๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ๋ง์ ์ด ๋ถ๋ถ์ ์ฝ๋๋ก ๊ตฌํํ๊ณ ์ ํํ๊ฒ ์ค๋ช ์ ํ ์ ์์ด ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํ๋ค. ์ํธํ & ๋ณตํธํ ์ด ๋ถ๋ถ์ ๋ํด์๋ ์์ธํ๊ฒ ์ค๋ช ์ ํ๊ธฐ ๋ณด๋ค๋ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๊ณ ์๋ฅผ ๋ค์ด ์ดํด๋ฅผ ํ๋๊ฒ ์ข๋ค๊ณ ์๊ฐ์ ํ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ํธํ๋ ๋ณตํธํ์ ๋ํด ์งง๊ฒ ์ค๋ช ์ ํ๊ฒ ์ต๋๋ค. ์ผ๋จ ์ํธํ๋ ํ๋ฌธ์ ์ํธ๋ก ๋ฐ๊พธ๋ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋น๋ฐ๋ฒํธ๋ฅผ 123์ ์ ๋ ฅํ๋ฉด ์ํธํ ๊ณผ์ ์ ๊ฑฐ์ฒ ํ๋ฌธ์ ์ํธ๋ก ๋ฐ๊ฟ๋๋ค. ์ง๊ธ์ ๊ธฐ์กด์ ์ซ์์ 3์ ๋ํ๋ ๋ฐฉ์์ผ๋ก ์ํธํ๋ฅผ ์งํํ๋ฉด 456์ผ๋ก ๋น๋ฐ๋ฒํธ๊ฐ ์ค์ ์ด ๋ฉ..
2023.03.24 -
[ Object Mapper] Dozer์ ๋ํด์ ๋ค์ด๋ ๋ดค๋?
Dozer dozermapper.github.io Dozer๋ ๋ฌด์์ธ๊ฐ? Dozer๋ Java ๊ธฐ๋ฐ์ ๊ฐ์ฒด ๋งคํ ๋๊ตฌ ์ค ํ๋์ ๋๋ค. ๊ฐ์ฒด ๋งคํ์ ์๋ก ๋ค๋ฅธ ํด๋์ค ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ฑฐ๋ ๋งคํํ๋ ํ๋ก์ธ์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฝ์ ๋ฐ์ดํฐ๋ฅผ Java ๊ฐ์ฒด์ ๋งคํํ๊ฑฐ๋, ์๋ก ๋ค๋ฅธ API์์ ๋ฐํํ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ๋งคํํ๋ ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ์ฒ์์ ์ผ๋จ ์์กด์ฑ ์ถ๊ฐํ์ implementation'com.github.dozermapper:dozer-core:6.4.0' Dozer๋ฅผ ์ฌ์ฉํ๊ธฐ ์ด์ ์ ์ฝ๋๋ฅผ ํ๋ฒ ์ดํด๋ณด์ ๊ธฐ์กด์ ์ฝ๋๋ Builder๋ฅผ ์ด์ฉํ์ฌ ๋งคํ์ ํ๊ฒ ๋์์ค๋ค. ์ด ๋ฐฉ์์ ์์ฑ์๋ฅผ ํตํ ๋ฐฉ์๋ณด๋ค ์ ํํ๊ฒ ๋งคํ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ ์๊ฒ๋๋ค. ํ..
2023.03.14 -
[ RFC ] ๊ณต์ ๋ฌธ์๋ฅผ ํตํ์ฌ Delete์ Status๋ฅผ ์์๋ณด์
๊ธ์ ์์ฑํ ์ด์ status์ฝ๋๋ฅผ ํ์ตํ๊ณ ์ฑ๊ณตํ๋ฉด ๋ฌด์กฐ๊ฑด OK(200) ๋ผ๋ ๊ณต์์ด ์์๋ค. ํ์ง๋ง ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ผ๋ฉด์ ์์ ํ ์๋ชป ์ดํดํ ๋ถ๋ถ์ด ์์ด ์ดํ์ ๋ณต๊ธฐ๋ฅผ ํ๊ธฐ ์ํด ์์ฑํ๋ค. https://www.rfc-editor.org/rfc/rfc2616#section-9.7 RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1 www.rfc-editor.org ๊ธฐ์กด์ ํผ๋๋ฐฑ์ ๋ฐ์๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์ @DeleteMapping("{id}") @ResponseStatus(HttpStatus.OK) public void delete(@PathVariable Long id){ this.userService.delete(id); } ๋ด๊ฐ ์ด ์ฝ๋๋ฅผ ๊ตฌํ์ ํ๋ฉด์ ์๊ฐํ..
2023.03.12