Spring JPA 1편: Build UP!!

참고

본 시리즈는 백기선님의 스프링 데이터 JPA를 학습 후 정리한 내용입니다.

관계형 DB 와 Java

JDBC
관계형 DB 와 Java를 연결하는 기본은 JDBC이다. JDBC를 기반으로 여러 방식들이 제시되었다.

JDBC

JDBC는 Java Data Base Connectivity으로 JDK 1.1을 기준으로 Java의 표준(java.sql.*)이 되었다.
Java 표준으로 정해졌기 떄문에 사용하려는 DBMS 진영에서 JDBC 드라이버(API를 구현한 라이브러리)를 제공하면 어떤 DBMS든 쉽게 사용할 수 있을 줄 알았다.
하지만 DBMS와 연결하는 API만 표준으로 제공할뿐 실질적은 Query는 직접 작성해야겠다.

Mybatis: SQL Mapping

JDBC를 그냥 사용하니 코드와 SQL이 같이 있어서 불편해.. 반복되는 SQL도 너무 많은데? DB Connection 관리하기도 너무 힘들어서… Mybatis가 나왔다. XML형식으로 쿼리를 작성하고 코드상에서는 작성해놓은 쿼리에 파라미터만 채워서 DB로 전송한다.
JDBC를 직접 사용할때보다 Connection Pool, 코드와 쿼리의 분리문제는 해결하였다… 하지만 Query를 작성하는 번거로움과 기능을 실행해봐야지만 Query를 검증할 수 있는 문제, 반복적인 코드, 밴더에 종속, 스키마 변경시 다량의 코드 수정등 해결되지 않는 문제가 있었다

JPA

JPA는 Java Persistence API의 약자로 Java ORM을 정의하는 인터페이스 표준 으로 JPA는 JDBC와 동일하게 인터페이스의 구현체 가 필요하다. 주로 사용하는 구현체로 Hibernate를 사용한다.

당장은 그렇구나 하고 넘어가고 JPA, Hibernate, Spring Dawta JPA을 설명한 글이 있는데 읽어보길 추천한다.

ORM Object-Relation Mapping

ORM은 애플리케이션의 클래스와 SQL 데이터베이스의 테이블 사이의 맵핑 정보를 기술한 메타데이터를 사용하여, 자바 애플리케이션의 객체를 SQL 데이터베이스의 테이블에 자동으로 (또 깨끗하게) 영속화 해주는 기술입니다라고 정의하고 있다.

중요!

  • 맵핑 정보를 기술한 메타데이터
  • 자동으로 (또 깨끗하게) 영속화
OMR 장점
  • (SQL 작성 안함) 생산성
  • 유지보수 (코드의 간결, SQL 관리가 됨)
  • 성능 (Connection Pool, 필요할때만 호출)
  • 밴더 독립성 (어떤 DB든 JDBC 드라이버만 있으면 사용 가능)

이렇게 좋아보이는 ORM도 학습비용이라는 단점이 존재하긴 한다.

  • SQL도 잘알..
  • 하이버 네이트도 잘알..

해결하려는 문제

객체와 릴레이션을 Mapping하려고 하니.. OOP와 SQL이라는 두개의 패러다임의 다음과 같은 간격이 존재한다. 아래의 내용이 이해가 되지 않는다면 OOP와 SQL를 먼저 공부하시길 추천드립니다.

밀도(Granularity) 문제

Object Relation
다양한 크기 다양한 방법의 표현 가능 테이블
커스텀 하기 쉽다 기본 데이터 타입

서브타입(Subtype) 문제

Object Relation
상속이 가능 상속? 그게 뭐죠
(다형성) (다형성을 표현할 방법이 없음)

식별자(Identity) 문제

Object Relation
래퍼런스 동일성 비교(==) 주키 (primary key)
인스턴스 동일성 비교 (equals())

관계(Association) 문제

Object Relation
객체 레퍼런스로 관계 표현 외래키(foreign key)로 관계 표현
'방향'이라는 개념이 존재 ‘방향'이라는 개념이 없음 Join으로 걍 묶음
다대다 관계 가능 다대다 관계가 불가능하다 굳이 하려면 ‘조인테이블’ 혹은 ‘링크 테이블'을 이용해야한다.

데이터 네비게이션(Navigation) 문제

Object Relation
레퍼런스를 이용해서 다른 객체로 이동 가능 가능은 하지만 매우 비효율적
콜렉션으로 순회할 수 있음 (List[]) 데이터베이스에 요청을 적게 할 수록 성능이 좋음 하지만 너무 많이 가져오려고 해도 Lazy Loading 문제
comments powered by Disqus