๋ชจ๋ ์์ค ์ฝ๋๋ ์ฌ๊ธฐ ์์ต๋๋ค. ์ด์ ํฌ์คํ ์ ์ด์ด์ Querydsl์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ์๊ฐํฉ๋๋ค. ๊ธฐ๋ณธ Join ์ฒซ ๋ฒ ์งธ ํ๋ผ๋ฏธํฐ์ joinํ ๋์, ๋ ๋ฒ ์งธ ํ๋ผ๋ฏธํฐ์ ๋ณ์นญ์ผ๋ก ์ฌ์ฉํ Q Type์ ์ง์ ํฉ๋๋ค. package io.lcalmsky.querydsl.domain; import com.querydsl.jpa.impl.JPAQueryFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBoot..
๋ชจ๋ ์์ค ์ฝ๋๋ ์ฌ๊ธฐ ์์ต๋๋ค. Querydsl์ ์ฌ์ฉํ๊ธฐ ์ํด ํ๋ก์ ํธ ์ค์ ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฌ๋ ค๋ด ์๋ค! ๋จผ์ ์๋ฐ ๋ฒ์ ์ 11, ์คํ๋ง ๋ฒ์ ์ 2.5.2๋ฅผ ์ ํํ์๊ณ gradle ํ๋ก์ ํธ๋ก ์์ฑํ์ฌ ์๋ ๋ค ๊ฐ์ง dependency๋ฅผ ์ค์ ํ์์ต๋๋ค. spring-boot-starter-web spring-boot-starter-data-jpa lombok h2 build.gradle ์์ ๊ฐ์ด ์ค์ ํ์ จ๋ค๋ฉด build.gradle ํ์ผ์ด ์๋ ์ฒ๋ผ ์์ฑ๋์์ํ ๋ฐ์, plugins { id 'org.springframework.boot' version '2.5.2' id 'io.spring.dependency-management' version '1.0.1..
์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ์ ๊ณตํ๋ ๊ณตํต ๊ตฌํ์ฒด๋ฅผ ๋ถ์ํด๋ด ์๋ค. SimpleJpaRepository๋ JpaRepository๋ฅผ ๊ตฌํํ๋ ๊ตฌํ์ฒด๋ก ๊ธฐ๋ณธ์ ์ธ CRUD๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ฝ 1000 ๋ผ์ธ์ ๊ฐ๊น์ด ์์ค ์ฝ๋๊ฐ ๋ด๋ถ์ ์ผ๋ก EntityManager๋ฅผ ์ฃผ์ ๋ฐ์ JPA๋ฅผ ์ง์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด ์์ต๋๋ค. ๋ช ๊ฐ์ง ๊ตฌํ๋ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์กฐํ CRUD์ค R์ ํด๋นํ๋ ๊ฒ์ผ๋ก select ๋์ ์ค PK๋ก ํ row๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํฉ๋๋ค. @Override public Optional findById(ID id) { Assert.notNull(id, ID_MUST_NOT_BE_NULL); Class domainType = getDomainClass(); // (1)..
๋ชจ๋ ์์ค ์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค. API์์ ํ์ด์ง ํ์ฉ ์ง๋ ๋ฒ์ ์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ํ์ด์ง ๋ฐ ์ ๋ ฌ์ ์ง์ํ๋ ๋ถ๋ถ์ ์ดํด๋ดค์๋๋ฐ์, API ํํ๋ก ์ ๊ณต๋ ๋๋ ์ด๋ป๊ฒ ํ์ฉ๋ ์ ์๋์ง Controller๋ฅผ ๊ฐ๋ฐํด ํ์ธํด๋ณด๊ฒ ์ต๋๋ค. package io.lcalmsky.springdatajpa.controller; import io.lcalmsky.springdatajpa.domain.entity.Member; import io.lcalmsky.springdatajpa.domain.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; impo..
๋ชจ๋ ์์ค ์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค. Entity๋ฅผ ์์ฑํ๊ฑฐ๋ ๋ณ๊ฒฝํ ๋, ๊ฐ๊ฐ์ ์๊ฐ๊ณผ ๋ด๋น์๋ฅผ ์ถ์ ํ ํ์๊ฐ ์์ต๋๋ค. ํนํ ์ค๋ฌด์์ ์ด๋ ฅ์ ๋จ๊ธฐ๊ธฐ์ํด ๋ง์ด ์ฐ์ด๋ ๊ธฐ๋ฅ์ธ๋ฐ์, ์ด๋ ๊ฒ ํ๊ธฐ ์ํด์ Entity๋ง๋ค ํ์์๋ฐ๋ผ ์์ฑ ์๊ฐ, ์์ ์๊ฐ, ์์ฑํ ์ฌ๋, ์์ ํ ์ฌ๋ ์ด ๋ค ๊ฐ์ง ์์ฑ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค. JPA๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ Entity๊ฐ ๊ฒฐ๊ตญ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๊ณตํต์ ์ธ ์์ฑ์ ๋ชจ๋ ๊ฐ์ง๋ ํด๋์ค๋ฅผ ์ค๊ณํ๋ฉด ๊ฐ๋จํ ํด๊ฒฐํ ์ ์๋๋ฐ์, ๊ทธ ๋ฐฉ๋ฒ์ ํ ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค. BaseEntity ์ ์ ์์ฑ ์๊ฐ, ์์ ์๊ฐ์ ๊ฐ์ง๋ Entity๋ฅผ ์์ฑํฉ๋๋ค. package io.lcalmsky.springdatajpa.domain.entity; import javax.persistence.Colu..
์ฌ์ฉ์ ์ ์ Repository Best Practice ์ฌ์ฉ์ ์ ์ Repository๋ฅผ ๋ง๋ค ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์ ์ ์ Repository๋ผ๊ณ ํจ์, JpaRepository๋ฅผ ์์ํด์ ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ์๋๋ผ ๊ตฌํ์ฒด์์ ์ง์ JPA๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ MyBatis, JdbcTemplate, QueryDSL ๋ฑ์ ์ด์ฉํด ๊ตฌํํ ๊ฒ์ ๋งํฉ๋๋ค. ์๋์ ์ผ๋ก(?) ๋์ ์์ Entity๊ฐ Member, Team์ด ์กด์ฌํ๊ณ Member๋ JpaRepository๋ฅผ ์ฌ์ฉํ๊ณ Team์ ์ฌ์ฉ์ ์ ์ Repository๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ๊ทธ๋ฅ ๊ตฌํํด๋ ์๊ด์์ต๋๋ค. ํ์ง๋ง MemberRepository๊ฐ ์กด์ฌํ๋๋ฐ CustomMemberRepository๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ S..
๋ชจ๋ ์์ค ์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค. Fetch Join๊ณผ @GraphEntity๋ฅผ ์๊ฐํ๊ธฐ ์ ์ JPA๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด ๊ฒช์ ์ ์๋ ์ฌ๋ก ํ๋๋ฅผ ์๊ฐํฉ๋๋ค. Member Entity์ Team Entity๊ฐ ๋ค๋์ผ ๊ด๊ณ(@ManyToOne) ์ผ ๋ Entity ํด๋์ค์ ์๋ก์ ๊ด๊ณ๋ฅผ ํ์ํด์ค๋๋ค. Entity๊ฐ ์ฐ๊ด๊ด๊ณ๊ฐ ์๊ณ JPA๋ฅผ ์ด์ฉํ์ฌ ์กฐํํด์ผ ํ๋ ์ํฉ์์๋ ๋๋๋ก์ด๋ฉด FetchType.LAZY ์ฌ์ฉ์ ๊ถ์ฅํฉ๋๋ค. ๊ด๊ณ ํ์ ์ ์ํด ์์ค ์ฝ๋๋ฅผ ์ดํด๋ด ์๋ค. (์ค๋ช ์ ํ์ ์๋ import๋ฌธ ๋ฑ์ ์๋ตํ์์ต๋๋ค.) @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString public class Member ..
๋ชจ๋ ์์ค ์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค. ์คํ๋ง ๋ฐ์ดํฐ JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ ์ธํฐํ์ด์ค ์ธ์๋ ๋ฉ์๋ ์ถ๊ฐ ๋ง์ผ๋ก ์ง์ ๊ตฌํ์ฒด๋ฅผ ๊ตฌํํ์ง ์์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ ๋ฉ์๋ ์ด๋ฆ์ผ๋ก ์ฟผ๋ฆฌ ์์ฑ ๋ฉ์๋ ์ด๋ฆ์ ๋ถ์ํ์ฌ JPQL ์ฟผ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. package io.lcalmsky.springdatajpa.domain.entity; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; import javax.persistence.*; @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTE..

JPA๋ฅผ ๋ค๋ฃจ๋ค๋ณด๋ฉด Entity๋ฅผ ์์ฑํ ๋ ๋ฐ๋ณต์ ์ผ๋ก ํด์ค์ผ ํ ์ผ๋ค์ด ์์ต๋๋ค. @Entity ์ ๋ํ ์ด์ ์ ํด๋์ค ์ด๋ฆ ์์ ์์ฑํด์ค์ผ ํ๊ณ , lombok์ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ @Getter, @Setter ๋ฑ์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์์ฑํด์ค์ผ ํฉ๋๋ค. ํนํ IntelliJ Ultimate ๋ฒ์ ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด DataSource์ ์๋์ผ๋ก ์ฐ๋ํ์ฌ JPA ๊ด๋ จ๋ ์์ฑ๋ค์ ํ์ ํด ์ปดํ์ผํ์์ ๋ฐ๋ก๋ฐ๋ก ์๋ฌ๋ ๊ฒฝ๊ณ ๋ฅผ ํ์ํด์ฃผ๊ธฐ๋ ํฉ๋๋ค. ๊ทธ๋์ ๊ณ์ ๋ฐ๋ณต์ ์ธ ์์ ์ ํ๋๊ฒ ๊ท์ฐฎ๊ธฐ๋ ํ๊ณ ๋ฐ๋ก๋ฐ๋ก ๋ํ๋๋ ๋นจ๊ฐ ์ค๋ค์ด ์ ๊ฒฝ์ฐ์ด๊ธฐ๋ ํด์ ๊ฑฐ์ ๊ธฐ๋ณธ ํฌ๋งท์ฒ๋ผ ์ฌ์ฉํ๋ Entity ํด๋์ค๋ฅผ Live Template ๊ธฐ๋ฅ์ ์ฌ์ฉํด ์ ์ํด๋ดค์ต๋๋ค. ๋จผ์ ์ค์ ํญ์์ Live Template์ ๊ฒ์ํ ๋ค Java ํญ๋ชฉ์ ์ฐพ..
์๋ฐ์ ORM ํ์ค ๊ธฐ์ ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ JDBC API ์ฌ์ด์ ์ธํฐํ์ด์ค ์ญํ ์ ํฉ๋๋ค. ์ฌ๊ธฐ์ ORM(Object-Relational Mapping)์ ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ๋งคํ์ ๋งํฉ๋๋ค. ORM ํ๋ ์์ํฌ๊ฐ ํด๋น ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ฆ, ORM ํ๋ ์์ํฌ๋ฅผ ์ด์ฉํ๋ฉด ์๋ฐ ์ปฌ๋ ์ ์ ์ฌ์ฉํ๋ฏ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์์ต๋๋ค. ORM ํ๋ ์์ํฌ๋ Entity๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฐ์ฒด๋ฅผ ๋ถ์ํ์ฌ SQL๋ฌธ์ ์์ฑํ๊ณ JDBC API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋ํฉ๋๋ค. ๋จ์ํ ์ฐ๋๋ง ํ๋ ๊ฒ์ด ์๋๋ผ ์์ ๋ค๋ค๋ ๋ฌธ์ ๋ค(์ด์ ํฌ์คํ ์ฐธ์กฐ, SQL์ ๋ฌธ์ ์ , ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฒด๊ณ์ ํ๊ณ)์ ๊ทน๋ณตํ ์ ์๊ฒ ํด์ค๋๋ค. ๋ฐ๋ผ์ ๋ณด๋ค ์ ๊ตํ ๋ชจ๋ธ๋ง์ ๊ฐ๊ฐ์ ํ๊ฒฝ์ ๋ง๊ฒ ํ ์ ์์ต๋๋ค. ํ๋ง๋๋ก..
- Total
- 71,740
- Today
- 103
- Yesterday
- 133
- Spring Boot Tutorial
- r
- leetcode binary search
- ์๊ณ ๋ฆฌ์ฆ
- ์คํ๋ง๋ถํธ
- JSON
- ์คํ๋ง ๋ฐ์ดํฐ jpa
- Spring Boot
- spring boot application
- leetcode stack
- ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์
- Java
- ๋๋ฉ์ธ ์ค๊ณ
- leetcode bst
- leetcode
- intellij
- Spring Data JPA
- Jackson
- ์คํ๋ง ๋ถํธ ์น ์ ํ๋ฆฌ์ผ์ด์
- ์คํ๋ง ๋ถํธ ํ์ ๊ฐ์
- spring boot jwt
- spring boot app
- gRPC
- QueryDSL
- ์คํ๋ง ๋ถํธ jwt
- Linux
- ์คํ๋ง ๋ถํธ ํํ ๋ฆฌ์ผ
- JPA
- ์คํ๋ง ๋ถํธ
- proto3