-
관계형 데이터베이스와 ORM (스프링 데이터 JPA - 1)Programming/Spring Data JPA 2020. 4. 30. 18:26728x90
1. JDBC
- 관계형 데이터베이스와 자바의 연결 고리
- 기본적으로 자바 안에 들어있어서, 각 디비에 맞는 드라이버만 추가하면 됨
- 아래는 postgreSQL 드라이버를 의존성에 추가한 부분
<dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.10</version> </dependency> </dependencies>
- 도커를 사용하여 디비 실행 (스프링 부트 포스팅 참고)
- URL 정보, 인증 정보가 필요함
public class Application { public static void main(String[] args) throws SQLException { String url = "jdbc:postgresql://localhost:5432/springdata"; String username = "hongchan"; String password = "pass"; try(Connection connection = DriverManager.getConnection(url, username, password)){ System.out.println(connection); String sql = "INSERT INTO ACCOUNT VALUES (1, 'hongchan', 'pass');"; try(PreparedStatement statement = connection.prepareStatement(sql)) { statement.execute(); } } } }
2. 문제점
- SQL이 데이터베이스 마다 다르다. (디비를 변경할 경우?)
- SQL을 실행하는 비용이 비싸다. (Connection을 불러오는 경우)
- 반복적인 코드가 너무 많다
- 스키마 변경 시 모드가 많이 바뀜
- 당장은 필요 없는데 언제 쓸 줄 모르니 미리 다 읽어와야 하는 문제 발생
3. ORM (Object-Relation Mapping)
ORM은 애플리케이션 클래스와 SQL 데이터베이스의 테이블 사이의 맵핑 정보를 기술한 메타데이터를 사용하여, 자바 애플리케이션의 객체를 SQL 데이터베이스의 테이블에 자동으로 영속화 해주는 기술이다.
맵핑 정보를 기술한 메타데이터?
- 어떤 자바 객체가 어떤 테이블과 맵핑되는지
- 어떤 멤버가 어떤 속성에 맵핑되는지
JDBC 대신 도메인 모델을 사용하는 이유는?
- 객체지향 프로그래밍 장점 활용 가능
- 각종 디자인 패턴 적용 가능
- 코드 재사용
- 비즈니스 로직 구현 및 테스트가 편함 (위의 코드를 보면 비즈니스 로직과 상관없는 코드가 많음! 이를 없애줌!)
장점
- 생산성 (맵핑 정보만 기술하면 쉽게 데이터 조작 가능)
- 유지보수성 (비즈니스 로직에 집중할 수 있음, 코드가 짧아짐...)
- 성능
(성능 최적화를 위한 여러 방법을 제공함. 객체와 데이터베이스 사이의 캐싱을 해 불필요한 쿼리를 날리지 않음 - 정말 디비에 반영해야 하는 상황에만 적용함)
- 벤더 독립성 (벤더마다 SQL 문법이 다름! 그러나 다이렉트를 설정하면 하이버네이트가 SQL을 자동으로 생성해줌! )
단점
- 높은 학습 비용 (성능 최적화 등을 위해 하이버네이트 등에 대한 깊은 이해 필요!)
4. ORM: 패러다임 불일치
- 밀도 문제
객체는 커스텀한 타입을 쉽게 만들 수 있음 (String, Address)
릴레이션은 기본 데이터 타입을 주로 사용.
- 서브타입 문제
객체는 상속 구조를 만들기 쉽고, 다형성을 지원함 / 릴레이션은 테이블 상속이라는게 없음
- 식별성 문제
객체는 레퍼런스 동일성(==), 인스턴스 동일성(equals()) / 릴레이션은 PK
- 관계 문제
객체는 레퍼런스로 관계를 표현하고, '방향'이 존재, 다대다 관계 가질 수 있음
릴레이션은 외래키로 관계를 표현하고 '방향' 의미가 없고 Join으로 아무거나 묶을 수 있음. 다대다 관계를 못만듬
- 데이터 네비게이션의 문제
객체는 레퍼런스를 이용해서 다른 객체로 이동이 가능하고 콜렉션을 순회활 수도 있음.
릴레이션은 이러한 데이터를 조회하는 방법을 사용함에 있어서 매우 비효율적임. (많은 SQL 문을 사용하게 됨, 이를 줄이려고 조인을 하면 한 번에 너무 많은 데이터를 불러오게 됨)
이러한 갭을 줄이고 호환성을 높이려고 하는게 ORM의 목표임.
인프런 백기선님 '스프링 데이터 JPA’ 강의를 듣고 정리한 내용입니다.
728x90'Programming > Spring Data JPA' 카테고리의 다른 글
스프링 데이터 Common - Web (스프링 데이터 JPA - 6) (0) 2021.01.01 스프링 데이터 Common - 2 (스프링 데이터 JPA - 5) (0) 2021.01.01 스프링 데이터 Common - 1 (스프링 데이터 JPA - 4) (0) 2021.01.01 JPA 프로그래밍 - 2 (스프링 데이터 JPA - 3) (0) 2021.01.01 JPA 프로그래밍 - 1 (스프링 데이터 JPA - 2) (0) 2020.04.30