멋쟁이사자처럼 13기/정기 세션

[멋사/Mac OS] 5주차 정기 세션 (Part 2. JPA 쿼리 작성 방법)

개발자 지망생 리네 2025. 6. 20. 20:55

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);
    }
}