알아두면 좋은것

자바 관계형 데이터 베이스 사용

큼큼이 2020. 3. 29. 01:25

일반적으로 Spring 에서 관계형 데이터 베이스를 사용 할 때, ORM의 표준인 JPA를 사용한다.

나는 JPA 를 구현하는 Framework 중 Hibernate 를 사용해서 개발을 한다.

 

대충 이런 구조라는 거는 알고있었는데 ORM 의 정의, JPA 에 대해서는 전혀 알지 못하고 개발하고 있었고

개발을 하는 것은 문제가 되지 않지만

회의를 하거나 깊은 부분을 공부하려다보면 정의나 기초에 대해 정리하고 있어야 하는 부분이 많다라는 것을 느끼고 있어서 정의, 관계에 대해 정리 해보려고 한다.

 

ORM (Object-Relational Mapping)

: 객체와 관계형 데이터 베이스를 매핑한다는 뜻. -> 객체와 테이블을 매핑해서 패러다임의 불일치를 해결해줌

 

JPA (Java Persistence API)

: 자바에서 ORM 기술의 표준임. Application 과 JDBC 사이에서 동작함

관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스

EntityManager 를 통해 객체를 사용, 저장 등을 하도록 정의되어 있음.

 

Hibernate

: - JPA Framework 다. JPA 를 사용하기 위해서 Hibernate 를 "꼭" 사용해야하는 것은 아니다.

단지 framework 이기에 다른 Framework 나 직접 구현을 해도 된다.

- EntityManager 와 같은 인터페이스를 직접 구현하고 Transaction 등 JPA 를 구현해놓은 프레임워크이다.

 

Spring Data JPA

:  Spring 에서 제공하는 모듈. JPA 를 더 쉽게 사용할 수 있도록 도와준다.

JPA 를 보다 추상화 한 Repository 라는 인터페이스를 사용하여 규칙대로 메소드를 만들어두면 Spring 에서 메소드의 이름을 보고 적합한 쿼리를 날리는 구현체를 만들어 Bean 으로 등록해준다.

 

Application - 관계형 데이터 베이스

 

 

결국 정리를 해보자면..

ORM 은 객체를 이용하여 관계형 데이터베이스를 매핑하는 것이고 자바에서 ORM 표준을 JPA 라고 한다.

결국 Hibernate 는 JPA 의 프레임워크이자 ORM 프레임워크가 된다!

이게 끝인줄 알았지만 Spring 에는 Spring Data JPA 라는게 있어서 JPA 를 보다 쉽게 사용 할 수 있게 해준다!

 

이렇게 따로 쿼리를 짜지 않아도 할 수 있게 제공해주고 관계형 데이터 베이스를 사용할 때, 객체 형식으로 사용할 수 있어서 개발하기도 편하던데...

장점이랑 단점이 뭐가 있을까 생각해보아야 할 필요가 있다!

 

장점

1. 생산성 향상

: 나같이 쿼리를 짜는 것을 정말정말 싫어하는 사람 뿐만 아니라 ORM 은 객체를 이용하여 매핑한다. 따라서 객체를 저장하는 듯이 JPA 에 저장해줘! 라는 persist 만 해주면 Insert 는 JPA 가 알아서 해주고 find 도 JPA 가 알아서 다 해줘서 반복적인 코드를 짜지 않아도 된다.

 

2. 유지보수

 : JPA를 사용하지 않으면 SQL 에 의존적인 개발이 되는데.. JPA 를 사용하면 Entity 에 필드 하나만 추가해주고 RDB 에 alter 만 쳐도 바로 삽입, 삭제, 수정, 조회 등 모든 일을 할 수 있다.

 

3. 패러다임 불일치 해결

: 이 부분은 따로 공부를 해서 다시 정리해보도록 하자

 

4.성능

: 만약 JPA 를 사용하는 서비스에서 같은 *조회* 쿼리를 여러번 날리는 일이 있다면 처음 값을 캐싱 하고 있다가 두 번째는 캐싱한 값을 재사용한다. *** 이 부분은 JPA 캐싱 시스템에서 한 번 더 공부해서 정리해보자.

 

단점

1. JDBC 로 직접 호출 하는 것 보다 느리다.

: 메소드 호출로 호출이 되기 때문에 내부에 메소드 이름을 파싱해서 쿼리를 만드는 등의 작업이 필요 할 텐데 이 부분을 해야하기에 직접 호출보다 느리다. *그래서 대량으로 가지고 오는 부분이나 많은 JOIN 을 사용해야하는 등의 부분에선 아직까지 JDBC 로 호출하는 경우도 자주 있다

 

2. 복잡한 쿼리를 날리기 힘들다.

: JPA 를 사용한다면 여러 테이블을 조회해서 사용하고 하는 것이 아주 귀찮은 일이 아닐 수 없다. 그래서 QueryDSL 과 같이 쿼리를 날릴 수 있게 하던가 생쿼리를 날리는 경우도 종종 있다.

 

3. 필요 없는 데이터까지 계속 조회 해야 한다.

지연로딩, 즉시로딩 등 객체 내에서 연관관계가 있는 다른 DB 의 값까지 조회 될 수 있으므로 이 부분도 잘 확인해서 개발해야한다.

 

 

-> 그럼 나는 JPA 를 사용 할 것인가? : 당연히 사용한다^^77 각 테이블의 구조를 관리할 때 객체 지향 적으로 관리하는 것이 이해도나 추가에서 너무 편했고 개발 할 때, 쿼리문의 실수를 줄일 수 있어서 너무 좋았다.