본문 바로가기
Spring/JPA

연관관계 - 단방향 연관관계

by YellowCow 2023. 2. 28.

이 페이지에서는 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와 조인할  기준컬럼을 설정하는 것이다

댓글