JPQL(5)

9mond·2023년 10월 17일
0
post-thumbnail

1. 영속성 전이(Cacade)란?

  • 특정 엔티티에 대해 특정한 작업을 수행하면 관련된 엔티티에도 동일한 작업을 수행한다는 의미
  • CascadeType.ALL : 모든 cascade를 적용한다.

1-1. CacadeType.ALL

  • JPA에서 CacadeType.ALL이라는 옵션은 엔티티의 관계를 정의하는데 사용한다.
  • 이 옵션은 부모 엔티티의 변경사항이 자식 엔티티에 모두 전파되도록 지정한다.
  • CacadeType.ALL의 작업 수행
    -> 부모 엔티티가 저장될 때 자식 엔티티도 함께 저장된다.
    -> 부모 엔티티가 업데이트 될 때 자식 엔티티도 함께 업데이트 된다.
    -> 부모 엔티티가 삭제될 때 자식 엔티티도 함께 삭제된다.
// Order.java
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();

💻검색 기능

이 경우는 파라미터 값이 다 존재한다는 뜻
그런데 status, name의 값이 null일 수 있다.
-> 이 방법은 안쓸거다.

// OrderRepository.java
public List<Order> findAll(OrderSearch orderSearch) {
	List<Order> resultList =
			em.createQuery("select o from Order o join o.member m "
					+ "where o.status = :status "
					+ "and m.name like :name",Order.class)
			  .setParameter("status", orderSearch.getOrderStatus())
			  .setParameter("name", orderSearch.getMemberName())
			  .setFirstResult(100)
			  .setMaxResults(10)
			  .getResultList();
	return resultList;
}

-> 따라서 우린 QueryDSL을 쓸거다.

2. QueryDSL

  • QClass 세팅
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
//annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
//querydsl 추가 
def querydslDir = "$buildDir/generated/querydsl"

sourceSets {
   main.java.srcDirs += [ querydslDir ]
}

tasks.withType(JavaCompile) {
   options.generatedSourceOutputDirectory = file(querydslDir)
}

clean.doLast {
   file(querydslDir).deleteDir()
}

이걸 추가해준다.

  • build.gradle
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.1.4'
	id 'io.spring.dependency-management' version '1.1.3'
}


group = 'com.codingbox'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	
	implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
    //annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

tasks.named('test') {
	useJUnitPlatform()
}

//querydsl 추가 
def querydslDir = "$buildDir/generated/querydsl"

sourceSets {
   main.java.srcDirs += [ querydslDir ]
}

tasks.withType(JavaCompile) {
   options.generatedSourceOutputDirectory = file(querydslDir)
}

clean.doLast {
   file(querydslDir).deleteDir()
}

이렇게 된다.
Window -> Show View -> Other
Gradle Task
Run Default Gradle Task 실행
clean 한번 해주고 기다리면 Gradle Task에 나타난다.
Gradle Task에 이렇게 나타난다.
Gradle refresh
좀 기다린 뒤에 프로젝트 clean, refresh 해주면
이렇게 QClass가 생긴다.
-> QClass는 git에 업로드 하면 안된다.

  • QueryDSL
// QueryDSL - 실무에서 많이 사용
public List<Order> findAll(OrderSearch orderSearch){
	JPAQueryFactory query = new JPAQueryFactory(em);
	// Order, Member 간에  join을 해야한다.
	QOrder order = QOrder.order;
	QMember member = QMember.member;
	
	return query.select(order)
				.from(order)
				.join(order.member, member)	// member : member의 알리아스
				.where(order.status.eq(orderSearch.getOrderStatus()), 
						member.name.like(orderSearch.getMemberName()))
				.fetch();
}

💻취소 기능

  • orderList.html

// Order.java
// 주문 취소
public void cancel() {
	this.setStatus(OrderStatus.CANCEL);
	for( OrderItem orderItem : orderItems ) {
		orderItem.cancel();
	}
}
// OrderItem.java
public void cancel() {
	getItem().addStock(count);
}
// Item.java
// stock 증가
public void addStock(int count) {
	this.stockQuantity += count;
}
profile
개발자

0개의 댓글

관련 채용 정보