본문 바로가기

Spring

(183)
[Querydsl] Bulk 이번 장에서는 Querydsl의 Bulk 연산에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. Update 이름이 "Roy"인 모든 선수들의 키를 10cm 증가시키는 방법이다. 여기서 주의할 점은 업데이트 이후 강제로 flush, clear를 해주었다는 점이다. Querydsl은 JPQL로 변경될 뿐이다. JPQL의 경우 영속성 컨텍스트의 내용을 무시하고 실행되기 때문에 벌크 연산 이후 DB와의 싱크를 맞추기 위해서는 반드시 영속성 컨텍스트를 비워주어야한다. @Transactional @SpringBootTest @TestMethodOrder(value = OrderAnnotation...
[Querydsl] Dynamic Query 이번 장에서는 Querydsl의 동적 쿼리에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. Querydsl에서 동적 쿼리를 사용하는 방법은 BooleanBuilder와 Where 절에 다중 파라미터를 사용하는 방법 두 가지가 있다. BooleanBuilder @Transactional @SpringBootTest @TestMethodOrder(value = OrderAnnotation.class) public class QuerydslBasicGrammarTest { @Autowired private EntityManager entityManager; private JPAQueryFac..
[Querydsl] Projection 이번 장에서는 Querydsl의 프로젝션에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. 프로젝션이란 Select의 조회의 대상을 지정하는 것을 말한다. SELECT SP.name, SP.height, SP.weight FROM soccer_player SP 이러한 SQL문이 있을 때 프로젝션 대상은 이름, 키, 몸무게 총 세 개가 된다. Querydsl에서도 이러한 프로젝션이 가능하다. 프로젝션 대상이 단수인 경우 정확한 타입을 지정할 수 있지만 프로젝션 대상이 복수인 경우 Tuple나 DTO로 조회해야한다. Tuple 프로젝션 대상이 SoccerPlayer의 name과 height이..
[Querydsl] Sub Query 이번 장에서는 Querydsl의 서브 쿼리에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. JPA에서 서브 쿼리를 사용하기 위해서는 com.querydsl.jpa.JPAExpressions를 사용해야한다. EQ를 사용하여 키가 가장 큰 선수를 조회한다. 서브 쿼리에 사용될 선수(alias)가 필요하기 때문에 새로운 Q 객체를 생성해야 한다. @Transactional @SpringBootTest @TestMethodOrder(value = OrderAnnotation.class) public class QuerydslBasicGrammarTest { @Autowired private E..
[Querydsl] Join 이번 장에서는 Querydsl의 조인에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. Default Join 첫 번째 파라미터로 조인 대상을 지정한다. 두 번째 파라미터로 별칭(alias)로 사용할 Q 타입을 지정한다. 이번에는 Q 클래스 파일에 기본으로 있는 static 인스턴스를 사용하였다. 만약 같은 테이블에 두번의 조인이 필요하다면 두 개의 별칭(alias)이 필요하게 되고 new QSoccerPlayer("alias") 와 같이 새로운 별칭을 생성하여 사용해야한다. @Transactional @SpringBootTest @TestMethodOrder(value = OrderAn..
[Querydsl] Basic Grammar 이번 장에서는 Querydsl의 기본 문법에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. 두 개의 Entity인 축구선수(SoccerPlayer)와 선수들이 속해있는 팀(Team)을 가지고 예를 들어본다. SoccerPlayer @Entity @Getter @Setter @ToString(of = {"id", "name", "height", "weight"}) @NoArgsConstructor(access = PROTECTED) public class SoccerPlayer { @Id @GeneratedValue @Column(name = "soccer_player_id") priva..
[Querydsl] Initial setting 이번 장에서는 Querydsl을 위한 초기 설정에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 올려두었다. 프로젝트를 생성하는 방법에 대해서는 다루지 않는다. 만약 Spring Boot 프로젝트 생성이 익숙치 않다면 필자가 이전에 작성한 글 (링크)을 참고한다. build.gradle Spring 2.6 이후, Gradle 5.0 이후 plugins { id 'org.springframework.boot' version '2.6.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE&#39..
[Spring Data JPA] Native Query 이번 장에서는 네이티브 쿼리에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. Spring Data JPA는 DB에 직접 쿼리를 날리는 것 처럼 네이티브 쿼리를 지원한다. 네이티브 쿼리를 사용하게 되면 추후 DB의 종류가 변경되면 코드의 변경도 피할 수 없다. JPA의 큰 장점인 DB 추상화가 사라지는 것이다. 이러한 이유로 가급적 네이티브 쿼리는 사용하지 않는 것이 좋다. 기존에는 네이티브 쿼리의 반환 타입으로 Object[]와 Tuple만 가능했지만 최근에는 Projections까지 활용 가능해졌다. 네이티브 쿼리의 경우 페이징을 지원한다. 하지만 Sort를 통한 정렬이 정상 작동하지 않을..