본문 바로가기

스터디/JPA

JPA의 등장 배경

728x90
반응형

SQL을 직접 다룰 때 발생하는 문제점


1. 반복, 반복 그리고 반복

개발자가 객체와 데이터베이스 사이에서 SQL과 JDBC API를 사용해 변환 작업을 직접 해야 한다

기능을 추가할 때마다 SQL을 작성하고 JDBC API를 사용하는 비슷한 작업을 반복해야 한다

 

2. SQL에 의존적인 개발

약간의 요구사항 추가에도 DAO의 CRUD 코드와 SQL 대부분을 변경해야 한다

  * DAO(Data Access Object): 특정한 데이터베이스 작업을 캡슐화한 클래스를 의미

 


 

패러다임의 불일치


패러다임의 불일치란?

대부분의 애플리케이션은 객체를 저장하기 위해 관계형 데이터베이스를 저장소를 사용한다

 

관계형 데이터베이스는 객체와 다르게 추상화, 상속, 다형성 같은 개념이 존재하지 않고데이터 중심으로 구조화되어 있고 집합적인 사고를 요구한다

 

이처럼 객체와 관계형 데이터베이스는 서로 지향하는 바가 다른데 이를 패러다임의 불일치 문제라고 한다

 

1. 상속

객체의 상속이라는 기능을 데이터베이스에서는 지원하지 않는다

 

데이터베이스의 슈퍼타입과 서브타입을 사용해 가장 유사한 형태로 상속을 구현할 수 있다

  - 부모 객체와 자식 객체를 분리해 다른 테이블에 저장한다

  - 객체를 조회할 때 부모 테이블과 자식 테이블을 조인해 자식 객체를 생성해야 한다

 

패러다임의 불일치를 해결하기 위해 소모하는 비용이 크다

 

2. 연관관계

객체는 참조를 통해 다른 객체와 연관관계를 맺고 참조에 접근해 연관된 객체를 조회한다

객체는 참조가 있는 방향으로만 조회(단방향 조회)가 가능하다 

 

테이블은 외래 키를 통해 다른 테이블과 연관관계를 맺고 조인을 사용해 연관된 테이블을 조회한다

테이블은 외래키를 이용한 조인으로 양방향 조회가 모두 가능하다

 

객체와 테이블 사이의 차이점을 해소하기 위해 다음과 같은 방식을 사용할 수 있다

  • 객체를 테이블에 맞추어 모델링
    • 연관된 객체를 참조하는 것이 아닌 외래 키 필드를 추가해 모델링한다
    • 객체를 테이블로 저장할 때는 편리하지만 참조를 통해 연관된 객체를 조회하지 못한다 -> 객체지향의 특징을 잃어버린다
class Member {
	String id;
	Long teamId; //외래키로 연관관계를 맺는다
	String username;
}

class Team {
	Long id;
	String name;
}

 

 

  • 객체지향 모델링
    • 참조를 이용해 연관된 객체를 조회할 수 있지만 객체를 테이블에 저장하거나 조회하기가 쉽지 않다
    • 저장: 참조한 객체를 외래 키 값으로 변환해 객체를 테이블에 저장해야 한다
    • 조회: 외래 키를 통한 조인을 사용해 연관된 두 객체를 조회하고 참조를 통해 연관관계를 설정해야 한다
    • 개발자가 객체와 테이블 사이에서 변환해야 한다
class Member {
	String id;
	Team team; //참조로 연관관계를 맺는다
	String username;
	
	Team getTeam() {
		return team;
	}
}

class Team {
	Long id;
	String name;
}

 

3. 객체 그래프 탐색

참조를 사용해 연관된 객체를 찾는 것을 객체 그래프 탐색이라고 한다

 

SQL을 직접 작성하면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다

 

모든 객체 그래프를 조회해 메모리에 올려두는 것은 현실성이 없으므로 필요에 따라 여러 벌의 메서드를 만들어 사용해야 한다

  - Member만 조회하는 메서드, Member와 Team을 조회하는 메서드, Member와 Order와 Delivery를 조회하는 메서드 등등

 

4. 비교

데이터베이스는 기본 키 값으로 각 로우(row)를 구분한다

 

객체는 동일성(identity) 비교와 동등성(equality) 비교라는 두 가지의 비교 방법이 있다

  - 동일성 비교는 == 비교로 인스턴스의 주소 값을 비교한다

  - 동등성 비교는 equals() 메서드를 사용해 객체 내부의 값을 비교한다

 

기본 키 값이 같은 객체를 두 번 조회해 두 객체의 동일성(==)을 비교하면 당연히 두 개의 객체는 다른 인스턴스이므로 false가 반환된다

  - 데이터베이스의 같은 로우를 조회할때마다 같은 인스턴스를 반환하도록 구현해야 한다

728x90
반응형

'스터디 > JPA' 카테고리의 다른 글

엔티티 매핑 - (2)  (0) 2025.02.08
엔티티 매핑 - (1)  (0) 2025.02.08
영속성 관리 - (2)  (0) 2025.02.07
영속성 관리 - (1)  (0) 2025.02.07
JPA란 무엇인가?  (1) 2025.02.06