2-5. 다음으로

지니🧸·2023년 3월 3일
0

Spring Boot & JPA

목록 보기
23/35

본 문서는 인프런의 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 (김영한) 강의를 공부하며 작성한 개인 노트입니다.

🗂️ 스프링 데이터 JPA 소개

public interface MemberRepository extends JpaRepository<Member, Long> {
	List<Member> findByName(String name);
}

JPA Repository

기본적 CRUD 기능 모두 제공

  • 일반화하기 어려운 기능 메서드 (findByName 등)도 정확한 JPQL 쿼리 실행
    • select m from member m where m.name = :name

QueryDSL

  • 동적 쿼리

build.gradle

buildscript {
	dependencies {
    	classpath("gradle.plugin.come.ewerk.gradle.plugins:querydsl-plugin:1.0.10")
    }
}
plugins {
	...
    id
}
dependencies {
	...
    
    implementation 'com.querydsl:querydsl-jpa'
    implementation 'com.querydsl:querydsl-apt'
}

def querydslDir = 'src/main/generated'

querydsl {
	library = "com.querydsl:querydsl-apt"
    jpa = true
    querydslSourcesDir = querydslDir
}

sourceSets {
	main {
    	java {
        	srcDirs = ['src/main/java', querydslDir]
        }
    }
}

적용

main/java/jpabook/repository/OrderRepository

@Repository
public class OrderRepository {

	public List<Order> findAll(OrderSearch orderSearch) {
    	QOrder order = QOrder.order;
        QMember member = QMember.member;
        
        JPAQueryFactory query = new JPAQueryFactory(em);
        return query.select(order)
        	.from(order)
            .join(order.member, member)
            .where(statusEq(orderSearch.getOrderStatus()))
            .limit(1000)
            .fetch();
    }
    private BooleanExpression statusEq(OrderStatus statusCond) {
    	if (statusCond == null) {
        	return null;
        }
        return QOrder.order.status.eq(statusCond);
        
}

QueryDsl은 SQL/JPQL와 유사 & 자바 코드로 동적 쿼리 생성

  • 높은 개발 생산성
  • 컴파일 시점에 쿼리 오류
  • 직관적인 문법
  • 코드 재사용
  • 코드 자동완성
  • 깔끔한 DTO 조회
profile
우당탕탕

0개의 댓글