이 페이지에서는 JPA에서 테이블 간 관계를 어떻게 표현하는지 알아보도록 하겠다
아래와 같이 Department(부서)와 Employee(직원) 테이블이 있다고 치자.
위 테이블 간 관계를 그대로 Entity로 표현하면 아래와 같이 표현할 수 있다.
Employee
@Entity
public class Employee{
/** 직원 id */
@Id
@Column(name="EMPLOYEE_ID")
private Long id;
/** 직원 이름 */
private String name;
/** 직원 나이 */
private Integer age;
/** 부서 id */
private Long departmentId;
}
Department
@Entity
public class Department{
/** 부서 id */
@Id
@Column(name="DEPARTMENT_ID")
private Long id;
/** 부서 이름 */
private String name;
}
하지만 위와 같이 하게 되면 아래와 같은 문제가 있다
Employee에 Department 정보를 저장하는 경우
Department d = new Department();
em.persist(d)
Employee e = new Employee();
//Department Id 저장
e.setDepartmentId(d.getId());
em.persist(e)
객체지향관점에서는
Employee에 Department 정보를 저장할 때 Department 객체를 저장해야 할 것 같은데
위 코드에서는 Department ID를 저장하고 있다
객체지향적인 설계와는 먼 코드를 짜게 된다
Employee에서 Department 정보를 조회하는 경우
//employee 정보를 조회
Employee e = em.find(Employee.class, 1L);
//Department ID값을 가져옴
Long departmentId = e.getDepartmentId();
//Department 정보를 조회
Department d = em.find(Department.class, 3L);
객체지향적인 설계에서 벗어난 코드로 인해
Department 정보를 가져오려면 Employee에서 Department ID값을 뽑아낸 후,
Department ID값으로 Department를 뽑아오는 과정을 거쳐야 한다
만약, 객체지향적인 설계를 따랐다면,
e.getDepartment() 한 줄로 Department 정보를 가져올 수 있었을 것이다
그러면 앞의 Employee 테이블의 Entity 구조를 객체지향설계에 맞게 수정해보자
Employee
@Entity
public class Employee{
/** 직원 id */
@Id
private Long id;
/** 직원 이름 */
private String name;
/** 직원 나이 */
private Integer age;
/** 부서 */
@ManyToOne
@JoinColumn(name="DEPARTMENT_ID")
private Department department;
}
derpartmentId로 값을 추가적으로 값을 가져오는게 아닌
Department를 바로 가져올 수 있게 되었다
참고로,
@ManyToOne은 Employee와 Department의 관계를 표현한 것이다(N:1)
(이외 에도 여러가지가 있지만, 추후에 자세히 살펴 보겠다)
@JoinColumn은 Department 쪽에서 Employee와 조인할 기준컬럼을 설정하는 것이다
'Spring > JPA' 카테고리의 다른 글
양방향 연관관계 - 연관관계의 주인 (0) | 2023.03.12 |
---|---|
연관관계 - 양방향 연관관계(기본 컨셉) (0) | 2023.03.07 |
Entity-Table 매핑 - 기본키 매핑 (0) | 2023.02.24 |
환경세팅 (0) | 2023.02.24 |
Entity-Table 매핑 - 필드 매핑(@Transient) (0) | 2023.02.23 |
댓글