스파르타 내일배움캠프에서 진행하는 JPA 심화 강의 일지를 작성합니다.
객체지향 프로그래밍을 하면서 자연스럽게 관계형 데이터베이스를 사용했고 두 가지의 미묘함을 느끼고 있었지만 JPA만을 사용했기 때문에 정확히 알지 못했다.
여기서 미묘함이란 것은 개발을 위해 DB모델링을 고려했을 때, 객체의 필드와 DB의 컬럼 사이의 애매함과 PK, FK, 연관관계, 상속에서의 애매함,, 여기서 애매함이라고 표현한 것은 두 가지가 같은 것이 아닌데 JPA로 마치 같은 것처럼 사용하기 때문에 확 와닿지 않기 때문이다.
이번에 JPA 공부를 새롭게 시작했고 평소 느꼈던 이 미묘함이 어디서 나온 것인지를 알 수 있었다.
먼저, 객체지향 언어로 개발하면 비즈니스 요구사항을 정의한 도메인 모델도 객체로 모델링을 할 수 있는데 객체로 모델링한 이 도메인 모델을 저장할 때 문제가 생긴다.
예를 들어, 유저의 회원 가입에서 회원이라는 도메인을 객체 인스턴스로 생성한 후에 이 객체를 어딘가에 영구적으로 보관해야한다.
이때에 관계형 데이터베이스가 필요하게 된다.
하지만, 관계형 데이터베이스는 데이터 중심으로 구조화되어 있고, 집합적인 사고를 요구한다. 그리고 객체지향에서 이야기하는 추상화, 상속, 다형성 같은 개념이 없다.
객체지향과 관계형 데이터베이스는 지향하는 목적이 서로 달라 둘의 기능과 표현 방법이 다른데 이것을 패러다임 불일치 문제라고 한다.
패러다임 불일치 문제에는 상속, 연관관계, 객체 그래프 탐색, 비교하기가 있는데 JPA는 이런 패러다임 불일치 문제를 해결해준다.
상속
객체는 상속 기능이 있지만 DB 테이블에는 없음
연관관계
객체는 참조를 통해 다른 객체와 연관관계를 가지고 참조에 접근해 연관 객체를 조회함
테이블은 외래키를 사용해 연관관계를 가지고 조인을 사용해 연관된 테이블을 조회함
객체 그래프 탐색
객체에서 참조를 사용해 연관된 객체를 찾는 것을 객체 그래프 탐색이라고 함
테이블에서는 조인을 통해 연관된 테이블을 조회해야하므로 자유로운 탐색이 어려움
비교
객체는 동일성 비교(==), 동등성 비교(equals())로 객체의 주소값과 내부 값을 비교함
데이터베이스는 기본 키의 값으로 각 로우를 구분함
같은 객체를 두 번 조회할 경우, 데이터베이스는 같은 것을 두 번 조회해 같은 값이지만 객체는 동등성 비교는 같지만 다른 인스턴스로 설정되어 동일성 비교는 달라짐
위의 문제들은 JPA를 통해 DB와 데이터를 주고받는다면 모두 해결된다!