예제 도메인 모델

LeeKyoungChang·2022년 5월 4일
0
post-thumbnail

Querydsl 수업을 듣고 정리한 내용입니다.

 

📚 1. 예제 도메인 모델

엔티티 클래스
스크린샷 2022-05-04 오후 5 34 59

 

ERD
스크린샷 2022-05-04 오후 5 34 49

 

Member 엔티티

package study.querydsl.entity;  
  
import lombok.*;  
  
import javax.persistence.*;  
  
@Entity  
@Getter @Setter  
@NoArgsConstructor(access = AccessLevel.PROTECTED)  
@ToString(of = {"id", "username", "age"})  
public class Member {  
  
    @Id @GeneratedValue  
    @Column(name = "member_id")  
    private Long id;  
    private String username;  
    private int age;  
  
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "team_id")  
    private Team team;  
  
    public Member(String username) {  
        this(username, 0);  
    }  
  
    public Member(String username, int age) {  
        this(username, age, null);  
    }  
  
    public Member(String username, int age, Team team) {  
        this.username = username;  
        this.age = age;  
        if (team != null) {  
            changeTeam(team);  
        }  
    }  
  
    private void changeTeam(Team team) {  
        this.team = team;  
        team.getMembers().add(this);  
    }  
  
}
  • @Setter : 실무에서 가급적 Setter는 사용하지 않기
  • @NoArgsConstructor AccessLevel.PROTECTED : 기본 생성자 막고 싶은데, JPA 스팩상 PROTECTED로 열어둔다.
  • @ToString은 가급적 내부 필드만(연관관계 없는 필드만)
  • changeTeam() 으로 양방향 연관관계 한번에 처리(연관관계 편의 메소드)

 

Team 엔티티

package study.querydsl.entity;  
  
import lombok.*;  
  
import javax.persistence.Entity;  
import javax.persistence.GeneratedValue;  
import javax.persistence.Id;  
import javax.persistence.OneToMany;  
import java.util.ArrayList;  
import java.util.List;  
  
@Entity  
@Getter @Setter  
@NoArgsConstructor(access = AccessLevel.PROTECTED)  
@ToString(of = {"id", "name"})  
public class Team {  
  
    @Id @GeneratedValue  
    private Long id;  
    private String name;  
  
    @OneToMany(mappedBy = "team")  
    private List<Member> members = new ArrayList<>();  
  
    public Team(String name) {  
        this.name = name;  
    }  
}
  • MemberTeam은 양방향 연관관계, Member.team이 연관관계의 주인, Team.members는 연관관계의 주인이 아니다.
  • Member.team이 데이터베이스 외래키 값을 변경할 수 있다.
  • Team.members은 연관관계의 주인이 아니므로, 조회만 가능하다.

 

MemberTest - 데이터 확인 테스트

  
@SpringBootTest  
@Transactional  
@Commit  
class MemberTest {  
  
    @PersistenceContext  
    EntityManager em;  
  
    @Test  
    public void testEntity() {  
        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);  
        Member member4 = new Member("member4", 40, teamB);  
  
        em.persist(member1);  
        em.persist(member2);  
        em.persist(member3);  
        em.persist(member4);  
  
        // 초기화  
        em.flush();  
        em.clear();  
  
        // 확인  
        List<Member> members = em.createQuery("select m from Member m", Member.class)  
                .getResultList();  
  
        for (Member member : members) {  
            System.out.println("member = " + member);  
            System.out.println("-> member.team" + member.getTeam());  
        }  
    }  
}
  • 가급적 순수 JPA로 동작 확인한다.
  • db 테이블 결과 확인한다.
  • 지연 로딩 동작 확인한다.

 

실행 결과

스크린샷 2022-05-10 오후 5 30 23

 

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글