728x90
반응형
도메인 모델


도메인 모델 구현 및 동작확인
Member 엔티티
package study.datajpa.entity; @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 = username; } public void changeTeam(Team team) { this.team = team; team.getMembers().add(this); } public Member(String username, int age, Team team) { this.username = username; this.age = age; if(team != null) { this.changeTeam(team); } } public Member(String username, int age) { this.username = username; this.age = age; } }
- Lombok
-@Setter
: Setter를 자동으로 생성해주는 어노테이션으로 실무에서는 가급적 Setter를 사용하지 말고 생성자를 통한 값 설정을 권장한다.
-@NoArgsConstructor AccessLevel.PROTECTED
: 기본생성자를 자동으로 생성해주는 어노테이션으로 Protected 접근 레벨을 지정하여 기본 생성자 접근은 막으면서 JPA 스펙상 Protected로 열어두기 위함.
-@ToString
: ToString()을 자동으로 생성해주는 어노테이션으로 연관관계 없는 내부 필드로만 구성하는 것을 권장한다. changeTeam()
연관관계 편의 메소드를 구현하여 양방향 연관관계를 한번에 처리
Team 엔티티
package study.datajpa.entity; @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "name"}) public class Team { @Id @GeneratedValue @Column(name = "team_id") private Long id; private String name; @OneToMany(mappedBy = "team") List<Member> members = new ArrayList<>(); public Team(String name) { this.name = name; } }
- Member와 Team은 양방향 연관관계로
Member.team
이 연관관계의 주인이고Team.members
는 연관관계의 주인이 아니다. 따라서Member.team
을 통해 데이터베이스 외래키 값을 변경하고 반대편은 읽기만 가능하다. mappedBy
는 외래키가 없는 곳에 설정한다.
동작확인
package study.datajpa.entity; @SpringBootTest @Transactional @Rollback(value = false) public 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에서 모든 연관관계는 지연로딩으로 설정해야 한다. 왜냐하면 즉시로딩은 성능 최적화하기 어렵기 때문이다.

728x90
반응형
'Dev > Spring Data JPA' 카테고리의 다른 글
[Spring Data JPA] 확장 기능 (0) | 2021.12.13 |
---|---|
[Spring Data JPA] 쿼리 메소드 기능 (0) | 2021.12.09 |
[Spring Data JPA] 공통 인터페이스 기능 (0) | 2021.11.29 |
[Spring Data JPA] 프로젝트 환경설정 (0) | 2021.10.22 |
[Spring Data JPA] 강좌 소개 (0) | 2021.10.22 |
댓글