์ ์ฒด ๊ธ
[Redis] M1 MacOS์์ Docker Redis Cluster ์ค์ ํ๊ธฐ + SpringBoot ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋ฌ์คํฐ ์ฐ๊ฒฐํ๊ธฐ
๐ค ๊ฐ์ [Redis] Redis์ ๋ฐฑ์ ๊ณผ HA๋ฅผ ์ํ ์ ๋ต (RDB, AOF, Replication, Sentinel, Sharding, Cluster)๐0. ์๋ก ํ ํ๋ก์ ํธ์์ Redis๋ฅผ ์ฌ์ฉํ๋ค๊ฐ, ์ ๊ธฐํ ํ์์ ๋ฐ๊ฒฌํ๋ค. ์ฐ๋ฆฌ ํ๋ก์ ํธ์์๋ ๋์ปค๋ฅผ ํตํด ๋ ๋์ค ์๋ฒ๋ฅผ ๋๋ฆฌ๊ณ ์์๊ณ , JWT Refresh Token์ ๋ ๋์ค ์๋ฒ์ ์ ์ฅํ๊ณ ์์๋๋ฐ ๋hoons-dev.tistory.com ์ด์ ๊ธ์ ๋ณด๋ฉด, ๋ ๋์ค์ ๋ฐฑ์ ๊ณผ ๊ณ ๊ฐ์ฉ์ฑ์ ๋ํ ์์ธํ ์ด์ผ๊ธฐ๊ฐ ๋ด๊ฒจ์์ต๋๋ค.Redis์ ๊ณ ๊ฐ์ฉ์ฑ์ ์ํด์ Cluster๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๊ทธ ์ค์์๋ Docker Desktop for Mac์ ์ฌ์ฉํ๋ฉด์ Redis-Cluster๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก Docker-Compose ํ์ผ ๊ตฌ์ฑ๊ณผ Sprin..
[QueryDSL] QueryDSL-JPA : DTO Projection๊ณผ Transform
QueryDSL์ ์ฌ์ฉํ๋ฉด์ ์กฐํ Query ์ฑ๋ฅ์ ๋์ด๋ ๋ฐฉ๋ฒ ์ค์ ํ๋๋, ์ํฐํฐ๊ฐ ์๋ DTO๋ก ๊ฐ์ ๋ฐ์ผ๋ฉด ์๋ ํฅ์์ ์ป์ ์ ์์ต๋๋ค.๊ทธ ์ด์ ๋ ์๋์ ๊ฐ์๋ฐ์. 1. ํ์ํ ํ๋๋ง ์กฐํํ๋ฏ๋ก ๋น์ฐํ๊ฒ๋ ์กฐํ ์๋๊ฐ ์ฆ๊ฐํ๋ค.SQL์ SELECT๋ฌธ์ ๋ณด๋ฉด, ํ์ํ ์ปฌ๋ผ๋ง ์ป์ด์ค๋ ๊ฒ์ด ํ ์ด๋ธ ์ ์ฒด๋ฅผ ์ป์ด์ค๋ ๊ฒ๋ณด๋ค ๋น์ฐํ๊ฒ๋ ๋น ๋ฆ ๋๋ค. DTO๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ํ ๋ฐ์ดํฐ๋ง ์กฐํํ๋ ค๋ ์๋๊ฐ ๋ดํฌ๋์ด ์์ต๋๋ค. ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์์์ผ๋ก์จ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ์ต์ ํ ํ ์ ์์ต๋๋ค. 2. JPA์ ์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋์์ด ์๋๋ค.์ํฐํฐ๋ JPA์ ๊ด๋ฆฌ ๋์์ด๋ฏ๋ก ์์์ฑ ์ปจํ ์คํธ์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ํฐํฐ๋ฅผ ์กฐํํ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์๋์ ์ผ๋ก ๋ ๋ง์ ์ ์์ต๋๋ค.๋ฐ๋ฉด DTO๋ ์์ํ..
[QueryDSL] QueryDSL-JPA : JOIN ํ๊ธฐ
๐ ํ๊ฒฝ- QueryDSL 5.0.0- Spring Data JPA 3.1.2 ๐ JOIN ์ข ๋ฅ1. INNER JOINJOIN ๋นํ๋ ํ ์ด๋ธ์ A, JOIN์ ๊ฑฐ๋ ํ ์ด๋ธ์ B๋ผ๊ณ ํ ๋, A์ B ํ ์ด๋ธ ๋ชจ๋ JOIN์ ํ๋ ค๋ ๋์ Key ์ปฌ๋ผ์ ๋ํด ๊ฐ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ง JOIN์ ํ๋ ๊ฒ์ INNER JOIN์ด๋ผ๊ณ ํฉ๋๋ค. queryDSL์์ Inner join์ ์ฐ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค.queryFactory์์ select์ from์ ์ดํ์ join ๋ฉ์๋๋ฅผ ํฌํจํ๋ฉด ๋ฉ๋๋ค. ์๋๋ ์ฝ๋ ์์์ ๋๋ค. @Entity@Getter@Table(name = "neo_starpage")public class StarPage { @EmbeddedId @AttributeOverride(na..
[QueryDSL] QueryDSL-JPA : @ElementCollection VO์ ๋ํ JOIN
๐ ํ๊ฒฝ - QueryDSL 5.0.0 - Spring Data JPA 3.1.2 ๐ค ์ฌ์ฉ๋ ๋๋ฉ์ธ ์ฝ๋ ๐ StarPage Aggregate Root @Entity @Getter @Table(name = "neo_starpage") public class StarPage { @EmbeddedId @AttributeOverride(name = "value", column = @Column(name = "star_page_id")) private StarPageId starPageId; @Embedded private StarPageInfo information; @ElementCollection @CollectionTable(name = "neo_starpage_admin", joinColumns = @..
[Redis] Redis์ ๋ฐฑ์ ๊ณผ HA๋ฅผ ์ํ ์ ๋ต (RDB, AOF, Replication, Sentinel, Sharding, Cluster)
๐0. ์๋ก ํ ํ๋ก์ ํธ์์ Redis๋ฅผ ์ฌ์ฉํ๋ค๊ฐ, ์ ๊ธฐํ ํ์์ ๋ฐ๊ฒฌํ๋ค. ์ฐ๋ฆฌ ํ๋ก์ ํธ์์๋ ๋์ปค๋ฅผ ํตํด ๋ ๋์ค ์๋ฒ๋ฅผ ๋๋ฆฌ๊ณ ์์๊ณ , JWT Refresh Token์ ๋ ๋์ค ์๋ฒ์ ์ ์ฅํ๊ณ ์์๋๋ฐ ๋์ปค๋ฅผ ์ค์งํ๊ณ ๋ฉฐ์น ๋ค์ ๋ค์ ์คํ์ ํด๋ณธ ๊ฒฐ๊ณผ ์์ง ํด๋น ํ ํฐ๋ค์ด ๋จ์์๋ ํ์์ ๋ฐ๊ฒฌํ๋ค. "์ฅ? Redis๋ InMemory DB๋ก ์ข ๋ฃ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ชจ๋ ํ๋ฐ๋์ด ๋ฐ์ดํฐ๊ฐ ์๋๊ฒ ๋ง์ง ์๋?" ์ด๋ฌํ ์๊ฐ์ ๊ฐ์ง๊ฒ ๋์๊ณ , Redis์ ๋ฐฑ์ ์ ๊ด๋ จ๋ ๋ด์ฉ์ ๊ณต๋ถํ์ ํด๋น ์ค๋ง๋ฆฌ๋ฅผ ํ์ด๋ผ ์ ์์๋ค. ๐ค 1. Redis์ ๋ฐฑ์ ๋ฐฉ์ 1-1. RDB(Redis DataBase ๋ฐฉ์) ์ฌ๊ธฐ์ RDB๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋๋ผ, Redis์ ์์ฒด์ ์ธ ๋ฐฑ์ ๋ฐฉ์์ธ Redis Database ๋ฐฉ์์..
[Spring] Spring Security + OAuth2.0 + JWT Token์ ํ์ฉํ ์์ ๋ก๊ทธ์ธ ์ด์ ๋ฆฌ - (1) ๋ฐฐ๊ฒฝ ์ง์ ์ดํดํ๊ธฐ, ์ ์ฒด ๊ทธ๋ฆผ ์ดํด๋ณด๊ธฐ
๐๐ป ์๋ก NEO ํ ์ด ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ฒ ๋์์ต๋๋ค. ์ธํฐ๋ท ์์ ๋ง์ ๊ธ์ ์ฝ๊ณ , ๋์์ ๋ง์ด ๋ฐ์์ผ๋ ์ ๋ณด๊ฐ ํ๋ฐ ๋ชจ์ฌ์์ง ์๊ณ ๋ณธ์ธ์ด ๊ฐ์ธ์ ์ผ๋ก ์ดํด๊ฐ ๋์ง ์๋ ๋ถ๋ถ์ด ๋ง์ ๋์ค์ ๋ค์ ๊ตฌํํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ๊ธ๋ก ์์ฑํ๊ธฐ๋ก ๋ง์์ ๋จน์์ต๋๋ค. ๋ถ์กฑํ ๋ด์ฉ์ด ์์ ์ ์์ง๋ง ๋ ์ข์ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ๋ฌ์์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ์ข์ ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ด๋ฉฐ, ์ ๊ธ์ด ์์ ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ ค๋ ๋๊ตฐ๊ฐ์๊ฒ ์ข์ ๋์์ด ๋์์ผ๋ฉด ํฉ๋๋ค. ๊ธ์ ์งํ์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ด์ด์ง ์์ ์ ๋๋ค. 1. ๋ฐฐ๊ฒฝ์ง์ ์ดํดํ๊ธฐ, ์ ์ฒด ๊ทธ๋ฆผ ์ดํด๋ณด๊ธฐ (OAuth2, JWT Token, ํ๋ก์ ํธ ์ ์ฒด ๋์ํ) 2. Naver, Kakao, Google์ ํ๋ก์ ํธ๋ฅผ OAuth2 Client๋ก..
[TS] Spring Security + Spring OAuth2 Client ์ ์ฉ ๊ณผ์ ์ค ๋ฐ์ํ ๋ฌธ์ ํธ๋ฌ๋ธ ์ํ
๐ค ์ค๋ฅ ๋ฐ์ ์๋ก์ด ํ ์ด ํ๋ก์ ํธ, NEO๋ฅผ ๊ฐ๋ฐํ๋ฉด์ ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํด OAuth2 Client ๊ฐ๋ฐ์ ์งํํ์ต๋๋ค. ๊ฐ๋ฐ์ด ๋๋ ํ, API ์์ฒญ์ ํตํด ํด๋น ๊ธฐ๋ฅ์ ๊ฒํ ํ๋ ๋์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ OAuth2 ์ธ์ฆ ๊ณผ์ ์ ์งํํ ์ดํ ์๋ก์ด ํ์ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ง ์๋ ์ด์ํ ํ์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌธ์ ๋ผ๋ฉด, ๋ถ๋ช ๋ก๊ทธ๊ฐ ์์ฑ๋์์ํ ๋ฐ, ํด๋น ๋ก๊ทธ๊ฐ ์๋ ๊ฒ๋ ์ด์ํด ๋ฌธ์ ์ ์์ธ์ ํธ๋ํนํ์ต๋๋ค. OAuth2 ์ธ์ฆ ๊ณผ์ ์ค, ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ป์ด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ์ฝ๋๋, OAuth2UserService๋ฅผ implementํ NEOOAuth2UserService์ ์์ต๋๋ค. @Slf4j @Service @RequiredArgsConstructor public ..
[Trouble Shooting] Lombok ์ฌ์ฉ์, ์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋์ง ์๋ ๊ฐ๋จํ ๋ฌธ์ ํด๊ฒฐ
Lombok์ ์ฌ์ฉํด ๋ง์ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ค์ด๊ณ ์๋ค. @RequiredConstructor์ @Builder, @Getter๋ฑ ๋ง์ ๋์์ ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๊ทธ๋ฌ๋ iDE ์์์๋ ์ ์์ ์ผ๋ก ์ธ์์ด ๋์ง๋ง, ๋น๋ ๋ฐ ์ปดํ์ผ์ ํ๋ฉด ํด๋น ๋ฉ์๋๋ฅผ ์ฐพ์ ์ ์๋ค๋ ๊ธฐ์ดํ ๋ฌธ์ ์๋ค. ์๋ฅผ ๋ค์ด, @RequiredConstructor๋ฅผ ์ฌ์ฉํ๋ฉด IDE ์์๋ ๋ฌธ์ ์๋ ์ฝ๋๋ฅผ ์ ์์ฑํ์ง๋ง, ์ด์ ๊ฐ์ด ์์ฑ์๋ ์๋ฌด๋ฐ ์ธ์๋ฅผ ์ํ์ง ์๋๋ค๋ ์ค๋ฅ๊ฐ ๋์๋ค. ์ค๋ง๋ฆฌ๋ฅผ ํธ๋ ๊ณผ์ ์์, ์ง์ ์์ผ๋ก ๋ชจ๋ ์ธ์์ ๋ํ Constructor๋ฅผ ์์ฑํ๋ ์ค๋ฅ๊ฐ ์ ๊ฑฐ๋์๋ค๋ ์ ๊ณผ, ๋จ์ํ @RequiredArgsConstructor ์ธ์๋ @Getter์ ๊ฐ์ ๋ค๋ฅธ ๋กฌ๋ณต ์ด๋ ธํ ์ด์ ์ ๋ํด์๋ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ..