2. JPA 쿼리 작성 방법
(1) JPQL과 쿼리
- JPQL : JPA 전용 객체 지향 쿼리 언어, SQL과 유사하지만 엔티티 중심으로 작성
SELECT e FROM EntityName e WHERE e.property = :value
-> SQL과 비슷하지만 엔티티 기준으로 작성
-> 테이블 이름이 아닌 클래스 이름과 필드명을 사용
-> DB 독립적인 쿼리라 이식성이 좋음
-> 복잡한 조건도 표현이 가능해서 유연성이 높음
- @Query : JPQL을 써먹을 수 있게 해주는 도구
@Query("SELECT m FROM Member m WHERE m.age > :age")
List<Member> findOlderThan(@Param("age") int age);
-> 복잡한 조건, 동적 쿼리, 조인 등 자유도가 높을 때 사용
-> 재사용은 어렵지만 명확하게 쿼리 작성 가능
(2) 쿼리 메소드
- 쿼리 메소드 : 메소드 이름만으로 자동으로 쿼리를 생성
List<Member> findByUsernameAndAge(String username, int age);
-> 간단한 조건일 때 빠르고 편함
-> 복잡한 조건에는 가독성이 떨어지고 한계가 존재
(3) JPQL vs 쿼리 메소드
| 쿼리 메소드 | JPQL | |
| 작성방식 | 메소드명으로 쿼리 생성 | @Query 안에 JPQL 작성 |
| 간단한 쿼리 | 매우 간편 | 간단한 조건의 쿼리 작성은 가능 |
| 복잡한 조건 | 메소드 명이 길어져 가독성이 저하됨 | 복잡한 조건을 자유롭게 사용 |
| 유연성 | 제한적 | 높음 |
| 가독성 | 간단한 경우에 좋음 | 복잡한 쿼리에서도 깔끔하게 작성 가능 |
| 유지보수 | 조건 변경 시 메소드명 수정 필요 | 쿼리만 수정 |
(4) 실습
문제 1 : username이 "yujin"이고, age가 25 이상인 회원을 조회
-> 쿼리 메소드
List<Member> findByUsernameAndAgeGreaterThanEqual(String username, int age);
-> @Query(JPQL)
@Query("SELECT m FROM Member m WHERE m.username = :username AND m.age >= :age")
List<Member> findUsernameAndOlderThan(@Param("username") String username, @Param("age") int age);
Member.java에 toString() 추가
@Override
public String toString() {
return "Member{" +
"id=" + id +
", username='" + username + '\'' +
", age=" + age +
", university='" + university + '\'' +
'}';
}
MemberTest.java
package com.week5.likelionmember;
import com.week5.likelionmember.domain.Member;
import com.week5.likelionmember.repository.MemberRepository;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class MemberTest implements CommandLineRunner {
private final MemberRepository memberRepository;
public MemberTest(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Override
public void run(String... args) throws Exception {
// 쿼리 메서드 실행
List<Member> queryMethodResult = memberRepository.findByUsernameAndAgeGreaterThanEqual("yujin", 23)
System.out.println("쿼리 메소드 결과: ");
// @Query JPQL 실행
List<Member> jpqlResult = memberRepository.findUsernameAndOlderThan("yujin", 23);
System.out.println("@Query JPQL 결과:");
jpqlResult.forEach(System.out::println);
}
}
'멋쟁이사자처럼 13기 > 정기 세션' 카테고리의 다른 글
| [멋사/Mac OS] 5주차 정기 세션 (Part 4. 영속성 전이 ~ Part 6. Auditing) (0) | 2025.06.20 |
|---|---|
| [멋사/Mac OS] 5주차 정기 세션 (Part 3. QueryDSL 소개 및 JPQL과 비교) (0) | 2025.06.20 |
| [멋사/Mac OS] 5주차 정기 세션 (Part 1. 실습환경 세팅) (0) | 2025.06.20 |
| [멋사/Mac OS] 4주차 정기 세션 (Part 3. 실습) (0) | 2025.06.18 |
| [멋사/Mac OS] 4주차 정기 세션 (Part 2. 엔티티 설계) (0) | 2025.06.18 |