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
관리 메뉴

아님말고

[JPA] QueryDSL 초기 세팅 및 예제 본문

JPA

[JPA] QueryDSL 초기 세팅 및 예제

스타박씨 2022. 9. 9. 09:33

maven 의존성 주입

		<dependency>
		  <groupId>com.querydsl</groupId>
		  <artifactId>querydsl-apt</artifactId>
		  <version>${querydsl.version}</version>
		  <scope>provided</scope>
		</dependency>
		
		<dependency>
		  <groupId>com.querydsl</groupId>
		  <artifactId>querydsl-jpa</artifactId>
		  <version>${querydsl.version}</version>
		</dependency>

 

plugin 추가

		    <plugin>
		      <groupId>com.mysema.maven</groupId>
		      <artifactId>apt-maven-plugin</artifactId>
		      <version>1.1.3</version>
		      <executions>
		        <execution>
		          <goals>
		            <goal>process</goal>
		          </goals>
		          <configuration>
		            <outputDirectory>target/generated-sources/java</outputDirectory>
		            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
		          </configuration>
		        </execution>
		      </executions>
		    </plugin>

queryDsl은 entity 객체기준으로 생성한 Q타입 (query type) 객체로 연산을 하는데 Q타입 객체를 build 하는 plugin 세팅이다. 

JPAAnnotationProcessor 가 target/generated-sources/java 경로에 Q타입 객체를 생성한다.

 

JPAQueryFactory

@Configuration
public class QuerydslConfig {

    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public JPAQueryFactory jpaQueryFactory() {
        return new JPAQueryFactory(entityManager);
    }
}

JPAQueryFactory 를 매번 생성하지 말고 싱글톤으로 설정해놓고 사용하자.

 

※ 회원 정보에서 email을 검색하는 예제

create table member(
	id int not null auto_increment,
	name varchar(255) not null,
	email varchar(255) null,
	primary key(id)
)

insert into member (name, email) values ('kim', 'kim@naver.com');
insert into member (name, email) values ('park', 'park@gmail.com');
insert into member (name, email) values ('lee', 'lee@gmail.com');

 

Member.java

@Data
@Entity
@Table(name = "member")
public class Member {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
	
	private String name;
	
	private String email;
}

Build Path 에 Q파일 소스경로 추가하기
프로젝트명 > 오른쪽 마우스 Build Path > Configure Build Path > source 탭의 add folder 눌러서 target/generated-sources/java 추가

plugin 으로 추가한 JPAAnnotationProcessor 에 의해서 Entity 파일 수정할때마다 Q파일에 적용된다.
혹시나, 초기에 Q파일이 생성 안되져 있다면 아래 경로로 가서 수동 build 한다.
Run as > maven generated-sources

 

 

MemberRepositoryCustom.java

public interface MemberRepositoryCustom {

	List<Member> findByNameOrEmail(String type, String keyword);
}

 

MemberRepositoryCustomImpl.java

public class MemberRepositoryCustomImpl implements MemberRepositoryCustom {

	@Autowired
	private JPAQueryFactory jpaQueryFactory;
	private QMember qMember = QMember.member;
	
	@Override
	public List<Member> findByNameOrEmail(String type, String keyword) {
		
		List<Member> content = jpaQueryFactory
				.select(qMember)
				.from(qMember)
				.where(qMember.email.contains(keyword))
				.fetch();
		return content;
	}
}

Q파일은 생성하는 2가지 방법 중에 static 으로 가져왔다.

QMember qMember = new QMember("m"); //생성자 방식
QMember qMember = QMember.meber; //Q파일 내부의 static 변수

 

MemberRepository.java

public interface MemberRepository extends JpaRepository<Member, Integer>, MemberRepositoryCustom {

}

 

MemberController.java

@RestController
@AllArgsConstructor
public class MemberController {

	private MemberRepository memberRepository;
	
	@GetMapping("members")
	public ResponseEntity<List<Member>> selectMember(){
		List<Member> list = memberRepository.findAll();
		return ResponseEntity.ok(list);
	}
	
	@GetMapping("members/search")
	public ResponseEntity<List<Member>> selectMemberByNameOrEmail(
			@RequestParam String type, 
			@RequestParam String keyword){
		List<Member> list = memberRepository.findByNameOrEmail(type, keyword);
		return ResponseEntity.ok(list);
	}
}

 

호출 및 결과

http://localhost:8080/members/search?type=1&keyword=gmail

[{"id":2,"name":"park","email":"park@gmail.com"},{"id":3,"name":"lee","email":"lee@gmail.com"}]

 

소스

parkjongyoon/MyJPA: jpa example project (github.com)

Comments