목록Spring (78)
빙응의 공부 블로그

📝프로젝션프로젝션이란 SELECT 대상을 지정하는 것을 말한다. 예를 들어보자List result = queryFactory .select(member.username) .from(member) .fetch();해당 코드는 SELECT 대상이 하나이므로 String이라는 명확한 타입으로 지정할 수 있으나만약 2개 이상이라면 튜플이나 DTO로 조회를 해야한다. 튜플 조회 List result = queryFactory .select(member.username, member.age) .from(member) .fetch(); for (Tuple tuple : result) { String username = tuple.get(me..

목차1. 검색2. 결과3. 정렬4. 페이징5. 집합6. 조인7. 서브쿼리8. Case 📝 개요 QueryDSL에서 제공하는 검색 조건에 대해 알아보자!!기본 검색 조건 쿼리 @Test public void search() {Member findMember = queryFactory .selectFrom(member) .where(member.username.eq("member1") .and(member.age.eq(10))) .fetchOne(); assertThat(findMember.getUsername()).isEqualTo("member1"); }📌 검색 조건 코드기능member.username.eq(..

📝 QueryDSL은 무엇일까요?DSL은 Domain Specific Language의 약자로, 특정 영역에 특화된 언어를 의미한다.즉 QueryDSL은 쿼리생성에 특화된 프레임워크를 의미한다. 그렇다면 QueryDSL이 필요한 이유가 무엇일까???스프링의 JPA는 객체지향 어플리케이션과 관계형 DB 사이의 패러다임 불일치를 해결하는 프레임워크이다.개발자는 객체지향 관점으로 개발하고 JPA는 자동으로 SQL쿼리문을 생성한다. 그렇기에 개발자는 SQL 관점에서 프로그래밍을 하지 않아도 된다. 그러나 완전한 분리는 불가능해 JPA는 JPQL을 지원한다.public interface EmployeeRepository extends JpaRepository { // JPQL 쿼리 사용 @Query(..

📝 사용자 정의 리포지토리 JPA에서 기본적인 기능은 JpaRepository 인터페이스를 상속받아 사용한다.그러나 복잡한 쿼리나 특정 기능 구현을 위해 사용자 정의 인터페이스를 사용할 수 있다.스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동으로 생성한다스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많다.다양한 이유로 인터페이스 메서드를 직접 구현하고 싶다면 사용하면 된다.!!사용자 정의 인터페이스 public interface MemberRepositoryCustom { List findMemberCustom(); }사용자 정의 인터페이스 구현 클래스@RequiredArgsConstructor public class Member..

JPA의 쿼리 기능을 알아보자!📝 메소드 이름으로 쿼리 생성만약 특정 속성으로 엔티티를 검색한다고 해보자... 이름과 나이로 회원 조회 public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList(); }순수하게 JPA를 사용한다는 기준으로 다음과 같이 ..

📝 개요 저번 시간에는 1대1, 다대1에 대해 페치 조인을 통해 최적화를 해보았다.그렇다면 일대다 관계 조회는 어떻게 최적화해야할까?📝 컬렉션 조회 최적화🚩 V1. 엔티티 직접 노출 /** * V1. 엔티티 직접 노출 * - Hibernate5Module 모듈 등록, LAZY=null 처리 * - 양방향 관계 문제 발생 -> @JsonIgnore */ @GetMapping("/api/v1/orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember(..