Oracle scott 계정 스키마를 Domain 으로 구성하기

개인적으로 데이터베이스 Vendor 중에서 가장 좋아하는 예제는 Oracle 의 Dept, Emp, Salgrade 다. 연습할 수 있는 모든 상황이 정리한 가장 좋은 구조다. 이번 글은 위 예제를 자바 객체와 연관관계를 만들어 보고 데이터베이스와 자바 구조는 어떤 차이가 있는지 기록한다. 기회가 되면 JPA 연동해서 구조를 만들어보겠다.

Oracle Schema 구조.

테이블은 아래와 같이 3가지로 구성되어 있다.

Table

Class

설명

emp

Employee

직원

dept

Department

부서

salgrade

Salarygrade

급여등급

자바 객체로 구현.

이 테이블의 구조를 객체의 구조로 해석했다. 사용한 JDK 는 11 버젼이다.

자바와 데이터베이스는 다른 구조를 가지고 있기 때문에 몇가지 차이점이 있다. 

1. Employee 와 Dept 연관관계를 설정할 method 가 존재한다.

데이터베이스는 테이블의 관계를 외래키(Foreign Key)로 설정한다. 때문에 참조하는 데이터의 Key 값을 저장한다. 반면에, 자바는 참조하는 객체의 식별자 값을 저장하지 않고 직접 객체를 참조한다. 객체간 참조하는 연간관계를 만들기 위해서는 서로를 엮어줄 method 가 필요하다. 그 method 가 바로 Employee.appointDepartment() 와 Department.addEmployees() 다. 



💡  
appointDepartment() 는 default 접근자를 사용했다. 외부에서 사용할 수 있는 부서와 직원을 연결하는 method 를 Department.addEmployees() 로 제한하기 위해서다. 즉, 부서를 결정할 수 있는 책임은 부서 객체만 존재한다.

2. Manager 를 입력하는 별도의 method 를 만들어야 한다.

1번과 비슷한 이유다. 데이터베이스는 참조하는 Manager 의 사번을 입력할 수 있지만, 자바는 객체를 참조한다. 모든 직원 객체를 만들 뒤, 각각 Manager 를 설정해줘야 한다.

3. salgrade 를 연결할 수 있다.

데이터베이스에서 EMP 와 SALGRADE 는 NON-EQUAL join 대상이다. 서로 참조하는 Key 값은 없지만, 범위연산을 통해 join 할 수 있다. 객체를 참조하는 자바는 SalaryGrade 를 참조할 수 있다. 이번 글에서는 Employee.setSalarayGrade() 에서 java stream 으로 급여등급 객체를 참조했다.
💡  
급여 혹은 급여등급은 언제든지 바뀔 수 있다.  SalaryGrade 와 Employee 를 다른 구조로 연결시켜 급여등급을 가져올 때 마다 계산하는 것이 좋을 것 같다. 

코드

댓글

이 블로그의 인기 게시물

JPA 와 함께 - 느낀점

Scott 과 함께 - Recursive Query 구현하기