Spring Data JPA - ORM
Spring Data JPA
백기선님의 강의인 Spring Data JPA 강의를 듣고 공부한 내용을 정리한 글
ORM
ORM은 Object Relation Mapping 기술을 의미한다.
ORM을 사용하면 다음과 같이 자바 코드로 DB에 접근이 가능하다.
val account = new Account("harry","kakaoenterprise")
accountRepository.save(account)
이렇게 도메인 모델 기반으로 DB 테이블에 영속화를 할 수 있다.
JDBC 기반 보다 도메인 모델 기반으로 개발을 하면 몇가지 장점이 있다.
우선 객체 지향 프로그래밍의 장점을 그대로 활용할 수 있고, 각종 디자인 패턴을 적용할 수 있다.
또한 SQL 쿼리를 작성하지 않아도 되기 때문에 비지니스 로직에 더욱 집중이 가능해진다.
그리고 코드 재사용도 가능하다. (이렇게 쓰니까 완전 ORM 예찬론자급…)
물론 쿼리를 작성하지 않는다는 말이 개발자가 작성하지 않는다는 말이지, ORM이 쿼리를 사용하지 않는다는 말은 아니다. 오해 말자.
ORM의 정의
애플리케이션 클래스와 SQL 데이터베이스의 테이블 사이의 맵핑 정보를 기술한 메타데이터를 사용하여, 자바 애플리케이션의 객체를 SQL 데이터베이스의 테이블에 자동으로 영속화해주는 기술이다.
JPA 하이버네이트가 실행하는 SQL은 단건으로 놓고보면 SQL을 직접 짜서 날리는 것보다 느릴 수도 있다.
그러나 이는 C가 JAVA보다 빠르다라는 말의 맥락과 동일하다.
왜냐하면 하이버네이트에서는 성능 최적화를 위한 여러 방법들을 제공하며, 객체와 데이터베이스 사이에 캐시가 존재해서 불필요한 쿼리를 날리지않는다.
예를 들어, 한 트랜잭션 내에 같은 쿼리가 존재한다면 하이버네이트는 중복되는 작업을 수행하는 쿼리는 수행하지않는다! (와우!)
그래서 이런 관점에서 보면 쌩 SQL보다 성능적 이점이 존재할 수 있다.
ORM의 장점은 생산성, 유지보수성, 성능, 벤더독립성이 존재하며 무시무시한 단점은 오직 학습비용 뿐이다.
하이버네이트가 SQL을 자동으로 생성해준다고 해서, 우리가 SQL을 몰라도 된다는 것은 아니다.
하이버네이트가 어떻게 테이블을 만들고 쿼리를 수행하는지 알고 있어야 우리가 적절하게 튜닝이 가능한 것이다.
그렇기 때문에 하이버네이트는 러닝커브가 상당하며, 어떻게 보면 스프링보다 더 어려울 수도 있다.
하지만, 장점이 충분하기 때문에 하이버네이트를 학습하는 것에 큰 장점이 있다.
특히 성능에 관련된 부분에 큰 장점이 있다!
많은 사람들이 하이버네이트를 사용하다가 성능 문제를 겪고 하이버네이트를 떠난다고 한다.
근데 이것의 근본적 원인은 학습이 부족했기 때문이다.
하이버네이트의 밑단에는 JDBC가 존재하기 때문에 필요하다면 직접 쿼리를 작성하는 것 또한 가능하다.
Reference
인프런 백기선님의 스프링 Data JPA