백엔드/JPA 썸네일형 리스트형 스프링 데이터 JPA, 쿼리 dsl 쿼리 dsl을 적용하기 위해서는 스프링 데이터 JPA의 인터페이스에 사용자 정의 리포지토리를 상속해야한다. public interface MemberRepo extends JpaRepository, MemberCustom { } public interface MemberCustom { List search(MemberSearchDTO condition); List searchPageSimple(MemberSearchDTO condition, Pageable pageable); List searchPageComplex(MemberSearchDTO condition, Pageable pageable); } public class MemberCustomImpl implements MemberCustom { /.. 더보기 쿼리dsl - 조인과 서브쿼리 기본 조인 List team1 = qf.selectFrom(member) .join(member.team, team) .where(team.name.eq("team1")) .fetch(); 기본적인 join 쿼리를 만드는 방법이다. 만약 전혀 연관관계가 없는 경우라면 세타 조인을 쓰면 된다. List fetch = qf.select(member) .from(member, team) .where(member.username.eq(team.name)) .fetch(); 이건 sql 문으로 번역이 되면 from 절에 테이블을 나열한 것으로 번역된다. 세타조인 주의 사항 - 외부 조인 불가능 ON을 활용한 조인 ON을 활용해서 조인하게 되면 Cartesian Product처럼 N*M개의 결과가 나오는 것이 아닌.. 더보기 스프링 데이터 jpa - 구현체 코드 구경, 쿼리 dsl 구현체 살펴보기 스프링 데이터 jpa 레포지토리의 구현체이다. 특징 1. @Repository 스프링 빈의 컴포넌트 스캔대상 Exception을 서비스, 컨트롤러로 넘길때 스프링의 Exception으로 변경되어 올라감. 특징 2. @Transactional 그래서 레포지토리나 서비스에서 @Transactional이 안달려있어도 잘 동작했던 것. save 동작과정 디비에 결과를 반영해야하는 save같은 경우에는 readonly 옵션이 false이다. save 메소드 내부에서는 엔티티의 pk가 null이면 if문 내부로 들어갈 것이다. 하지만 만약에 다음과 같은 상황이라면? public class Member extends JpaBaseEntity { @Id private Long id; //기본생성자 //.. 더보기 스프링 데이터 JPA - 사용자 정의 클래스, Auditing, MVC 페이징 사용자 정의 레포지토리 사용자 정의 레포지토리 만드는 법 1. 인터페이스 만들기 public interface MemberCustomRepo { List findMemCustom(); } 2. 구현체 만들기 - 이름을 맞춰줘야함(설명은 아래에) @RequiredArgsConstructor public class MemberRepositoryImpl implements MemberCustomRepo{ private final EntityManager em; @Override public List findMemCustom() { return em.createQuery("select m from Member m").getResultList(); } } 3. 스프링 데이터 jpa 레포지토리에 1에서 만든 인터페.. 더보기 스프링 데이터 jpa 기본 기능정리 파라미터 바인딩 파라미터 바인딩에는 위치 기반과 이름 기반이 있다. 이름기반을 사용하자!! (유지보수와 가독성이 좋음) @Query("select m from Member m where m.username=:username and m.age = :age") List findUser(@Param("username") String username, @Param("age") int age); 컬렉션을 파라미터로 넘길때도 아래와 같이 가능하다. @Query("select m from Member m where m.username in :names") List findByNames(@Param("names") List names); 반환값 & 페이징과 정렬 List findMemlistByUsername(Stri.. 더보기 스프링 데이터 JPA 기초 https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84/dashboard 실전! 스프링 데이터 JPA - 인프런 | 강의 스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다 www.inflearn.com 위 강의를 들으며 정리한 글입니다. 스프링 데이터 jpa 기존의 jpa 레포지토리와는 다르게 스프링 데이터 레포지토리를 만드는 방법은 그냥 인터페이스를 하나 만들기만 하면 된다. public interface TeamRep.. 더보기 JPQL 페치조인의 한계, 다양한 쿼리 페치조인의 한계 - 페치조인은 별칭을 쓰면 안된다. select t From Team t join fetch t.members m where m.age > 30 이런식으로 하게되면 실제로 team의 멤버보다 적은 수의 결과가 나오게 된다. 이는 JPA에서 의도한 설계가 아니니 지원하지 않는다. 정 이렇게 하고 싶으면 member를 조회하도록 한다. fetch join은 team 조회시 모든 member가 나온다고 가정하고 설계되었다. - 둘 이상의 컬렉션은 페치조인 할 수 없다. - 컬렉션 페치조인 사용시 페이징이 불가능하다. (다대일 일대일에서는 페치조인해도 페이징이 가능하다) 컬렉션 페치조인은 1의 입장에서는 데이터 뻥튀기 현상이 일어나니 페이징을 사용할 수 없는것이 당연하다. 만약 사용하고 싶으면 .. 더보기 JPQL 중급문법 경로 표현식 점을 찍어서 객체 그래프를 탐색하는 것을 경로표현식이라고 한다. 상태필드는 단순히 값을 저장하기 위한 필드, 단일값 연관 필드는 엔티티, 컬렉션 값 연관 필드는 컬렉션을 말한다. List resultList = em.createQuery("select m from Member m join m.team", Member.class).getResultList(); System.out.println(resultList.get(0).getUsername()); System.out.println(resultList.get(0).getTeam().getName()); 단일값 연관 경로는 묵시적으로 내부 join이 발생한다는 특징이 있다. 이에 탐색이 가능하다. List resultList = em.cre.. 더보기 JPQL 기초 JPQL 소개 JPA가 지원하는 쿼리 방법에는 여러가지가 있다. JPQL, queryDSL, JPA Criteria, 네이티브 SQL. JPQL은 이 방법들 중 하나이며 엔티티를 대상으로 쿼리를 날린다는 특징을 가지고 있다. (참고로 Criteria는 공부할 일도, 쓸 일도 없을 듯하다) JPQL을 한마디로 정의하면 객체지향 SQL이다. //jpql 예시 List resultList1 = em.createQuery("select t from Team t join t.members", Team.class).getResultList(); 이렇게 엔티티를 대상으로 쿼리를 날리기때문에 디비에 있는 컬럼명으로 쓰지않고 그냥 클래스의 필드 이름으로 쿼리를 날릴 수 있는 매우 편한 도구이다. jpql의 결과를 가져오.. 더보기 JPA 값타입 JPA의 데이터타입 JPA에는 두가지 데이터타입이 있다. 하나는 지금까지 배운 엔티티이고 나머지 하나는 값타입이다. 엔티티 타입 @Entity로 정의하는 객체 데이터가 변하면 식별자를 가지고 변경감지가 가능 값타입 int, String 처럼 단순히 값으로 다루는 타입 데이터가 변하면 감지 불가능 값타입에도 종류가 있다! 기본값 타입 - int, double, Integer, Long, String 등등 임베디드 타입 컬렉션 값 타입 먼저 기본값 타입은 엔티티를 삭제할 경우에 같이 삭제되는 데이터들이다. 생명주기를 엔티티에 의존한다고 표현한다. 값타입은 당연히 공유가 되지 않는다. 이제 임베디드타입과 컬렉션 값 타입이라는 것에 대해서 알아보자 임베디드 타입 임베디드 타입이 무엇이고 왜 쓰이는지 예제를 통해.. 더보기 이전 1 2 다음