728x90
예제 도메인 모델과 동작 확인
📌 Member 엔티티
package study.datajpa.entity;
@Entity
@Getter @Setter
@NoArgsConstructor(access = 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 = LAZY)
@JoinColumn(name = "team_id")
private Team team;
public Member(String username) {
this.username = username;
}
public Member(String username, int age, Team team) {
this.username = username;
this.age = age;
// 팀 값이 null 인 경우 예외를 터트리거나 무시하는 쪽 둘 중 하나를 선택할 것
if(team != null ){ // 이번 경우에는 예외를 터트리지 않고 무시하는 쪽으로 선택함.
changeTeam(team);
}
}
public void changeTeam(Team team) {
this.team = team;
team.getMembers().add(this);
}
}
- 이번 예제에서는 사용했지만 가급적 @Setter를 쓰지 말 것.
- 엔티티에 @ToString을 쓰지 말 것. 만약에 쓴다면 연관관계 없는 필드에만 적용 시킬 것
📌 Team 엔티티
package study.datajpa.entity;
@Entity
@Getter @Setter
@ToString(of = {"id", "name"})
@NoArgsConstructor(access = PROTECTED)
public class Team {
@Id @GeneratedValue
@Column(name = "team_id")
private Long id;
private String name;
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
public Team(String name) {
this.name = name;
}
}
🔍 데이터 확인 테스트
📌 MemberTest 테스트 코드
package study.datajpa.entity;
@SpringBootTest
@Transactional
@Rollback(false)
class MemberTest {
@Autowired
private EntityManager em;
@Test
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로 동작을 확인했다. (나중에 변경할 것이다.)
- member.getTeam() 을 통해 지연로딩 동작도 확인했다.
👀 참고 자료
실전! 스프링 데이터 JPA - 인프런 | 강의
스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다.
www.inflearn.com
728x90
'[JPA] > 실전! 스프링 데이터 JPA' 카테고리의 다른 글
[JPA] 나머지 기능들 (0) | 2022.04.22 |
---|---|
스프링 데이터 JPA 분석 (0) | 2022.04.21 |
[JPA] 확장 가능 (0) | 2022.04.20 |
[JPA] 쿼리 메소드 기능 (0) | 2022.04.17 |
[JPA] 공통 인터페이스 기능 (0) | 2022.04.16 |