반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

샘오리_개발노트

[JAVA] JPA 활용법 -3 (QueryDSL 활용해보기) + 기본 문법 본문

카테고리 없음

[JAVA] JPA 활용법 -3 (QueryDSL 활용해보기) + 기본 문법

샘오리 2022. 12. 9. 17:40
728x90
반응형

https://samori.tistory.com/58

 

[JAVA] JPA 활용법 -2 (QueryDSL 활용해보기)

https://samori.tistory.com/52 [JAVA] JPA 활용법 -1 (QueryDSL 적용해보기) QueryDSL이란? Spring Boot Data JPA 는 쿼리문을 직접 짜지 않아도 함수명만 알맞게 적어주면 쿼리를 자동으로 짜주는 ORM으로 유명한데 사

samori.tistory.com

지난 글에 이어 오늘은 QueryDsl을 활용해서 기본적인 생성과 삭제를 진행해보려고 한다.

지난 글에도 언급했지만 QueryDSL은 INSERT를 자체적으로 제공하고 있지 않아서 EntityManager을 이용해야 한다.

 

VIEW단에서 Controller에 Form을 통해 값을 전달했다고 치면

아래 처럼 DTO라는 규격안에 담아서 서비스의 추가(생성)관련 함수를 호출할 것이고

@PostMapping("/경로")
public 데이터 타입 addCode(@ModelAttribute CodeDto codeDto) {
    codeMngtService.addCodeList(codeDto);
    return 리턴경로;
}

서비스에서는 아래와 같이 받을 것이다.

여기까지는 지난글과 동일하기에 복습의 개념으로만 보면 되고

public void addCodeList(CodeDto codeDto) {
    codeRepositoryCustom.addCodeList(codeDto);
}

이제 QueryDSL 인터페이스를 거쳐 

void addCodeList(CodeDto codeDto);

구현체에서 어떻게 EntityManager를 사용하여 추가했는지 보면 될 것이다.

먼저 JPAQueryFactory와 EntityManager를 생성자 주입을 통해 호출할 수 있도록 주입해줄 것이고

생성이라는게 DB의 데이터를 조작/변경하는 것이기에 @Transactional 어노테이션도 사용해줄 것이다.

private final JPAQueryFactory jpaQueryFactory;
private final EntityManager entityManager;

public CodeRepositorySupport(JPAQueryFactory jpaQueryFactory, EntityManager entityManager) {
     this.jpaQueryFactory = jpaQueryFactory;
     this.entityManager = entityManager;
}

@Override
@Transactional
public void addCodeList(CodeDto code) {
        entityManager
        .createNativeQuery("INSERT INTO 테이블명 (칼럼명, 칼럼명) VALUES (?,?)")
                .setParameter(1, code.get변수명())
                .setParameter(2, code.get변수명())
                .executeUpdate();
    }
}

눈여겨볼것은

네이티브 쿼리를 통해 쿼리를 작성해주되

Spring Data JPA에서의 Repository에서 네이티브 쿼리를 쓰기 위해 @Query해서

쿼리 안에 직접 바인딩 변수를 넣은 것과는 다르게

예:

@Modifying
@Query("update 테이블명 set 칼럼명 = 변경값 where 칼럼명 = :바인딩변수")
int 함수명(@Param("바인딩변수") int 바인딩변수);

 

바인딩 변수를 .setParameter라는 자바 코드로 삽입한다는 것이고

.setParameter(1, code.get변수명())
.setParameter(2, code.get변수명())

 

커밋을 할 때 그냥 execute가 아니라

.executeUpdate()를 한다는 특징이 있다.

 

Delete같은 경우는 QueryDSL 자체적으로 지원하기 때문에 좀더 쉽다.

// 매개 변수 없이 절대적인 값/기준을 통해 지우고 싶을 때
// QueryDSL 자체 dto static 참조변수가 customer이라고 가정할 때
@Override
@Transactional
public void removeCodeList() {
	queryFactory
    .delete(customer)
    .where(customer.칼럼명.lt(3))
    .execute();
}

// 매개 변수가 있고 그 매개 변수가 dto 규격에 담겨져 있으며 해당 매개 변수의 값과 동일한
// 정보가 있다면 그 정보만 지우고 싶을 때 아래처럼 로직을 쓰면 된다.
@Override
@Transactional
public void removeCodeList(CodeDto deleteCode) {
	queryFactory
    .delete(customer)
    .where(customer.칼럼명.eq(deleteCode.칼럼명))
    .execute();
}

참고로 QueryDSL같은 경우 아래와 같은 조회 문법을 가지고 있다.

member.username.eq("member1")		// username = 'member1'
member.username.ne("member1")		//username != 'member1'
member.username.eq("member1").not()	// username != 'member1'

member.username.isNotNull()	//이름이 is not null
member.age.in(10, 20)		// age in (10,20)
member.age.notIn(10, 20)	// age not in (10, 20)
member.age.between(10,30)	//between 10, 30

member.age.goe(30)	// age >= 30
member.age.gt(30)	// age > 30
member.age.loe(30)	// age <= 30
member.age.lt(30)	// age < 30

member.username.like("member")			//	%member
member.username.contains("member")		// 	%member%
member.username.startsWith("member")	//	member%

이상 기본적인 QueryDSL CRUD 설명을 마친다.

728x90
반응형
Comments