Books
๋๋ฉ์ธ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅด๋ ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ๋๋ฉ์ธ์ด๋?๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ์๊ฐ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ ๋ถ์ผ๋๋ฉ์ธ ๊ฐ๋
์ ๊ตฌํํ๊ธฐ ์ํด์๋ ํด๋์ค๋ฅผ ์ฌ์ฉํจ→ ํด๋์ค ์ด๋ฆ์ ๋์๋๋ ๋๋ฉ์ธ ๊ฐ๋
์ ์ด๋ฆ๊ณผ ๋์ผํ๊ฑฐ๋ ์ ์ฌํ๊ฒ ์ง์ด์ผํ๋ค. ์? ํด๋์ค ์ฌ์ด์ ๊ด๊ณ๋ ์ต๋ํ ๋๋ฉ์ธ ๊ฐ๋
์ฌ์ด์ ๋งบ์ด์ง ๊ด๊ณ๋ ์ ์ฌํ๊ฒ ๋ง๋ค์ด์ ํ๋ก๊ทธ๋จ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ์์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ผํ๊ธฐ ๋๋ฌธ! ํด๋์ค ๊ตฌํpublic class Screening { private Movie movie; private LocalDateTime whenScreened; public Screening(Movie movie, LocalDateTime whenScreened) { this.movie = movie; this.whenScreened ..
Books
๊ฐ์ฒด ์งํฅ์ ์ค๊ณ๊ฐ ์์ฆ ํฅ๋ฏธ๋ก์์ ์ค๋ธ์ ํธ๋ผ๋ ์ฑ
์ ์ฝ๊ธฐ ์์ํ๋ค!! ์ธ์ ๊น์๋ ๋ด์ฉ์ ๊ฐ๋จํ๋ผ๋ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌํ๊ณ ์ ๊ธ์ ์ด๋ค ใ
ใ
๐ ์ํํธ์จ์ด์ ๋ชจ๋ ๋ชฉ์ ์คํ ์ค์ ์ ๋๋ก ๋์ํ๋ ๊ฒ๋ณ๊ฒฝ์ ์ํด ์กด์ฌํ๋ ๊ฒ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋๊ณผ ์์ฌ์ํต ํ๋ ๊ฒ๋ชจ๋ ์ค๊ณ์ ๋ชฉ์ ์ ๊ฐ์ฒด ์ฌ์ด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฐ ๋ณ๊ฒฝ์ ์ฉ์ดํ ์ค๊ณ๋ก ๋ง๋๋ ๊ฒ์ด๋ค!!๐ ๋ ๋์๊ฐ์ ๊ฒฐํฉ๋๋ ๋ฎ์ถ๊ณ ์์ง๋๋ ๋์ด๋ ๊ฒ์ด ์ข์ ์ค๊ณ์ด๋ค. ์ฌ๊ธฐ์ ์์ง๋๋?๋ฐ์ ํ๊ฒ ์ฐ๊ด๋ ์์
๋ง์ ์ํํ๊ณ ์ฐ๊ด์ฑ ์๋ ์์
์ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์์ํ๋ ๊ฐ์ฒด๊ฐ ์์ง๋๊ฐ ๋๋ค๊ณ ๋งํ๋ค!์ฆ, ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ค๋ก ์ฒ๋ฆฌํ๋ ์์จ์ ์ธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด ๋๋ค ์บก์ํ๊ฐ๋
์ ์ด๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ฒด์ ๋ด๋ถ์ ์ธ๋ถ์ ์ธ ์ฌํญ์ ๊ฐ์ถ๋ ๊ฒ์? ๋ณ๊ฒฝํ๊ธฐ ์ฌ์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ -..
JAVA & OOP
๐ฑ Garbage Collection(๊ฐ๋น์ง ์ปฌ๋ ์
)์ด๋? c๋ c++ ๊ฐ์ unmanaged language๋ free() ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์
ํด์ ํด์ผ ํ๋ค. ํ์ง๋ง java์์๋ JVM์ ๊ฐ๋น์ง์ปฌ๋ ํฐ๊ฐ ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์์ ์ ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ํด์ ํ ํ์๊ฐ ์๋ค. ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ฃผ๋ ์ด์ ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํจ์ด๋ค!! ๋ฉ๋ชจ๋ฆฌ๋ ํ์ ์ ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๊ฑฐ๋ ํ์ ์๋ ๋ถ๋ถ์ ๊ผญ ํด์ ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค. ๐ค ๊ฐ๋น์ง ์ปฌ๋ ํฐ vs ๊ฐ๋น์ง ์ปฌ๋ ์
๊ฐ๋น์ง ์ปฌ๋ ํฐ : ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋ด๋นํ๋ ์์คํ
๋๋ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑ ์์์ด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์ด์ ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ๊ฑฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ๋ ์ญํ ์ ํ๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์
: ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ์ ์ค ํ๋..
JAVA & OOP
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์์น Id๋ก ์ค๋ณต์ ์ ๊ฑฐํ๋ ๋ก์ง์ด ์์ด์ hashCode๋ equals๋ฅผ ์ฌ์ ์ํ๋ค.! ๊ทผ๋ฐ ๋ด๊ฐ ์ด ๋ ๊ฐ๋ฅผ ์์ธํ ๊ณต๋ถํด ๋ณธ ์ ์ด ์์๋ ์ถ์ด์ ์ด์ฐธ์ ์ ๋ฆฌํด์ ์ดํดํด๋ณด๋ ค๊ณ ํ๋ค! @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; GetAllPlaceResDto that = (GetAllPlaceResDto) o; return Objects.equals(placeId, that.placeId); } @Override public int hashCode() { return Objects.hash(p..
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..
JAVA & OOP
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ orElse๋ฅผ ์ฌ์ฉํ ์ฝ๋๊ฐ ์์๋๋ฐ ๋ด ์๋๋๋ก ์๋์ ํ์ง ์์์ ์๋ฌธ์ ์ด ๋ค์๋ค. ๊ฒ์๊ธ์ ์
๋ก๋ํ ๋ ์์น ์ ๋ณด๋ฅผ ๊ฐ์ด ์
๋ก๋ํ๋๋ฐ, ์ด ๊ณผ์ ์์ ์์น DB์ ํด๋น ์ ๋ณด๊ฐ ์๋ค๋ฉด ์์น ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์๊ณ , ์๋ค๋ฉด ์๋ก ๋ง๋ค๋๋ก ํ๋ ๋ก์ง์ด์๋ค! orElse๋ฅผ ์ฌ์ฉํ๋๋ ์์น ์ ๋ณด๊ฐ ๋ ๊ฐ๊ฐ ์ ์ฅ์ด ๋๋ ์์ด๋ฌ๋ํ ์ํฉ์ด์๋ค... ํด๋น ๋ก์ง์ฒ๋ผ ์ฝ๋๋ฅผ ์งฐ๊ณ , ๋น์ฐํ placeRepository์์ null๊ฐ์ ๊ฐ์ ธ์์ ๋๋ง orElse๊ฐ ์ํ๋๋ค๊ณ ์๊ฐ์ ํ์๋ค. ๊ทผ๋ฐ ์ฐพ์๋ณด๋๊น ๋ฐ์ ๋ง๊ณ ๋ฐ์ ํ๋ ธ์๋ค!! orElse()์ orElseGet()์ ๊ณตํต์ ๋ ๋ฉ์๋ ๋ชจ๋ Optional ํด๋์ค ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ์ค์ ๊ฐ์ด null์ผ ๊ฒฝ์ฐ ์ด๋ค ๊ฐ์ผ๋ก ๋์ฒดํด์ return ํด..
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 {..