분류 전체보기

    [Querydsl] 프로젝션, 동적 쿼리, 배치 쿼리(벌크 연산)

    프로젝션 프로젝션은 select절에 무엇을 가져올지 대상을 지정하는 것을 프로젝션이라고 한다. 프로젝션 대상이 하나인 경우 @Test public void oneProjection(){ List members = queryFactory .select(member.username) .from(member) .fetch(); for (String s : members){ System.out.println("s = "+s); } } 이 경우에는 프로젝션 대상이 하나이기 때문에 타입을 명확하게 지정할 수 있다. 프로젝션 대상이 둘 이상이면? 이전에 봤던 Tuple이나 DTO로 조회해야 한다. 튜플로 조회 ‘com.querydsl.core.Tuple’ @Test public void tupleProjection(..

    [Querydsl] Querydsl 기본문법

    JPQL, Querydsl 비교 테스트 코드 @SpringBootTest @Transactional public class QuerydslBasicTest{ @Autowired EntityManager em; @BeforeEach public void before(){ Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1",10,teamA); Member member2 = new Member("member2",20,teamA); Member member3 = new Member("member3",30,teamB)..

    [Querydsl] Querdydsl 설정하기

    build.gradle(Spring Boot 2.x) 1. plugin 추가 plugins { id 'java' id 'org.springframework.boot' version '3.0.2' id 'io.spring.dependency-management' version '1.1.0' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } 2. dependencies에 querydsl 라이브러리 추가 dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-..

    @EntityListener로 생성일, 수정일 자동으로 넣기 + 프록시 활용(연관관계 Insert) - 게시판 만들기(13)

    이전에 회원가입, 로그인까지 만들었다. 나의 경우 간단하게 상세 정보도 만들어 1대 1 매핑을 했다. 이런 간단한 비즈니스들은 본인이 원하는 대로 만들면 될 것 같다. 게시글 Entity를 만들기 전에 게시글은 생성일, 수정일이 필요할 것 같아 해당 기능을 자동으로 하기 위해 JPA Auditing을 사용해보려고 한다. JPA Auditing JPA Auditing이란? JPA에서 시간 값을 자동으로 넣어주는 기능이다. Entity를 영속화 시키거나 조회를 수행한 후에 update를 하는 경우 매번 시간을 읽어와서 저장해 주는 번거로움이 있는데 JPA Auditing을 사용하면 자동으로 시간을 매핑하여 DB 테이블에 넣어준다. 사용하기 전에 이게 정말 좋을까?에 대한 생각이 들었다. 사실 자동으로 다 해..

    [JPA] 영속성 전이와 고아 객체

    영속성 전이 특정 Entity를 영속 상태로 만들 때 연관된 Entity도 함께 영속 상태로 만드는 것을 의미한다. 가령 부모 Entity를 저장할 때 자식 Entity도 함께 저장하는 것이다. 영속성 전이는 즉시 로딩, 지연 로딩, 연관 관계 설정과 관계없는 개념이다. @Entity public class Parent { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "parent") private List childList = new ArrayList(); public void addChild(Child child) { childList.add(child); child.setParent(this); } } @Entity public class..

    [JPA] 즉시 로딩과 지연 로딩

    만약 Member의 username만 사용하는 비즈니스라면 Team정보까지 불러오는 것은 추가적인 비용이 들어 손해이다. 이런 문제 때문에 JPA는 지연 로딩이라는 것을 지원한다. 지연 로딩 @Entity public class Member { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn private Team team; } fetch = FetchType.LAZY 연관 관계 설정 어노테이션의 옵션으로 프록시 객체로 조회한다. 이전의 프록시는 해당 객체에 대해 직접적인 값을 사용할 때 DB에서 조회했다. 즉 프록시 객체로 조회하면 team을 출력하거나 응답하는등의 작업을 하지 않는다면 team은 조회되지 않는다. Team team = new Team(); team...

    [JPA] 프록시

    프록시 Member와 Team의 연관 관계에서 Member를 조회하면 항상 Team도 조회하는 것을 원하지 않을 수 있다. 지금 당장 나는 username만 필요하다면 굳이 Team을 조회할 필요가 없는 것이다. 만약 Team이 username을 조회할 때마다 조회된다면 추가적인 비용이 드는 것이니 손해이다. 이런 문제를 해결하기 위해선 먼저 프록시를 이해해야 한다. 프록시 기초 em.find() DB를 통해서 실제 Entity 객체를 조회하는 메소드 Member member = em.find(Member.class, memberId); member라는 객체 데이터를 사용하지 않고 find()만 해도 SELECT 쿼리를 실행한다. em.getReference() DB 조회를 미루는 프록시(가짜) Enti..

    [JPA] 다양한 연관 관계 매핑(다대일, 일대다, 일대일, 다대다)

    다대일(N:1) @ManyToOne 어노테이션으로 설정한다. 다대일(N:1)은 N이 연관 관계의 주인이다. 다대일 관계는 가장 많이 사용하는 연관 관계이다. 단방향 Member가 N, Team이 1이다. 이때 N이 외래키를 가지며 관계의 주인이 된다. 외래키가 있는 곳에 참조를 걸고 연관 관계 매핑을 하면 된다. 양방향 양방향이 테이블에 영향을 주지는 않는다. 테이블은 FK로 관계를 풀기 쉽지만 객체의 경우는 같은 방법으로는 불가능하기 때문에 단방향 관계를 양쪽에서 설정하여 해결한다. 어차피 연관 관계의 주인이 외래 키를 관리하기 때문에 객체에서 양방향 관계를 추가하면 된다. 일대다(1:N) @OneToMany 어노테이션으로 설정한다. 일대다(1:N)는 1이 연관 관계의 주인인 방법이다. 추천하지 않는 ..