보물창고 블로그

QueryDSL 기초 정리 본문

웹 개발/QueryDSL

QueryDSL 기초 정리

홋 메 2022. 9. 9. 22:19
728x90

이 글에서는 QueryDSL의 기초 사용법에 대해 정리하고자 합니다.

먼저 QueryDSL은 쿼리를 자바 코드로 작성할 수 있게 도와주는 기술입니다.

Spring Data JPA로 해결하지 못하는 복잡한 쿼리/동적 쿼리를 쉽게 해결할 수 있습니다.

자바 코드로 작성하기 때문에 문법 오류를 컴파일 시점에 잡아낼 수 있습니다.

먼저 저는 빌드 도구로 Gradle을 사용하므로 build.grade 파일에 dependencies에 아래 내용을 추가합니다.

implementation 'com.querydsl:querydsl-jpa'
// Querydsl JPAAnnotationProcessor 사용 지정
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa"
annotationProcessor("jakarta.persistence:jakarta.persistence-api")
annotationProcessor("jakarta.annotation:jakarta.annotation-api")

다음으로 예시에 사용할 도메인 모델에 대한 엔티티 클래스와 ERD는 아래와 같습니다.

엔티티 클래스와 ERD

위의 엔티티 클래스 다이어그램대로 사용하기 위해 Member 객체를 아래와 같이 선언합니다.

@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {

  @Id
  @GeneratedValue
  @Column(name = "member_id")
  private Long id;

  private String username;

  private int age;

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "team_id")
  private Team team;

  public Member(String username, int age, Team team) {
    this.username = username;
    this.age = age;
    if(team != null){
      changeTeam(team);
    }
  }

  private void changeTeam(Team team) {
    this.team = team;
    team.getMembers().add(this);
  }

  public Member(String username){
    this(username,0,null);
  }

  public Member(String username,int age){
    this(username,age,null);

  }

  @Override
  public String toString() {
    return "Member{" +
        "id=" + id +
        ", username='" + username + '\'' +
        ", age=" + age +
        '}';
  }
}

추가적으로 Team 객체도 아래와 같이 선언합니다.

@Entity
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Team {

  @Id @GeneratedValue
  private Long id;
  private String name;

  @OneToMany(mappedBy = "team")
  private List<Member> members = new ArrayList<>();

  public Team(String name){
    this.name = name;
  }

  @Override
  public String toString() {
    return "Team{" +
        "id=" + id +
        ", name='" + name + '\'' +
        '}';
  }
}

이후 프로젝트 빌드를 한번 해주면 아래 사진과 같이 generated 폴더 안에 Q 클래스들이 생성되는 것을 확인할 수 있습니다.

 

이 Q클래스를 활용하여 QueryDSL을 사용할 수 있습니다.

여기까지 하였다면 QueryDSL을 사용할 준비가 끝났습니다.

다음 글에서는 QueryDSL을 본격적으로 테스트해보겠습니다.

 

Comments