728x90
반응형
728x90

 

 

 

 

✅ Querydsl이란 ?

 

Querydsl자바 기반의 오픈 소스 라이브러리로, SQL과 유사한 형태의 쿼리를 자바 코드로 작성할 수 있게 해주는 도구입니다. JPA(Java Persistence API)와 함께 사용하여 데이터베이스 쿼리를 유형 안전하고 직관적으로 작성할 수 있도록 도와줍니다. 다만, Querydsl은 단순히 문자열로 작성되는 SQL 쿼리를 매핑하는 것이 아니라, 쿼리를 객체지향적으로 다루고 처리하는 기능을 제공합니다.

Querydsl은 Q클래스를 생성하여 쿼리작성을 할 수 있습니다. Q클래스 생성 방법은 Q클래스는 엔티티의 필드들을 각각의 필드로 정의하고, 이를 활용하여 타입 세이프한 쿼리를 작성할 수 있게 해줍니다.

Querydsl Q클래스 파일을 생성하는 방법은 다음과 같습니다:

  1. Querydsl 라이브러리 추가 : 먼저 프로젝트의 빌드 도구에 Querydsl 관련 라이브러리를 추가합니다.

  2. Q클래스 생성 설정 : 빌드 도구에 Querydsl의 APT(Annotation Processing Tool) 설정을 추가하여 Q클래스를 생성하도록 합니다.

  3. Q클래스 생성 : 이제 엔티티 클래스에 대한 Q클래스를 생성합니다. 주로 엔티티 클래스와 같은 패키지 내부에 생성됩니다. Q클래스의 이름은 엔티티 클래스 이름 앞에 Q를 붙인 형태입니다. 예를 들어, 만약 Member라는 엔티티 클래스가 있다면, 해당 엔티티에 대한 Q클래스는 QMember가 됩니다.

  4. IDE나 빌드 도구 실행 : 프로젝트를 빌드하거나 IDE의 빌드/컴파일 작업을 실행합니다. Querydsl의 APT가 실행되어 Q클래스가 생성됩니다.

  5. Q클래스 사용 : 생성된 Q클래스를 사용하여 타입 세이프한 쿼리를 작성합니다. 예를 들어 JPAQueryFactory를 사용하여 쿼리를 작성하거나 검색 조건을 쉽게 표현할 수 있습니다.

 

Querydsl 생성과 적용의 예시입니다.

 

          
          
          	@Entity
            public class Member {
                @Id
                @GeneratedValue
                private Long id;
                private String username;
                // other fields and getters/setters
            }
            

            // Q클래스 생성 후
            import com.querydsl.core.annotations.QueryEntity;

            @QueryEntity
            public class QMember extends EntityPathBase<Member> {
                public QMember(String variable) {
                    super(Member.class, forVariable(variable));
                }
                // QMember fields here
            }


            // Query 작성 및 사용
            JPAQueryFactory queryFactory;

            List<Member> members = queryFactory
                .selectFrom(QMember.member)
                .where(QMember.member.username.eq("john"))
                .fetch();

 


 

💡 Querydsl 예제 모델로 동작 확인

Member와 Team 엔티티 클래스를 이용하여 동작을 확인하며, 이 둘은 양방향 연관관계를 갖고있습니다.

2개의 Entity는 1개의 Team에는 여러명의 Member가 존재할 수 있기 때문에 Member의 입장에서 보면 @ManyToOne관계이고, Member에 외래 키로 사용할 team_id를 작성합니다.

           
           
           @Entity
            @Getter
            @Setter
            @NoArgsConstructor(access = AccessLevel.PROTECTED)
            @ToString(of = {"id","username","age"})
            public class Member {

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

                private String username;
                private int age;

                @ManyToOne(fetch = FetchType.LAZY) //ManyToOne에서는 항상 fetch를 LAZY로 설정!
                @JoinColumn(name = "team_id") //외래 키 이름!
                private Team team;
728x90
반응형

+ Recent posts