프로젝트 논의 - JPA, SQL

동준·2024년 5월 5일
0

개인공부(스프링)

목록 보기
10/14

1. JPA

1) 정의

자바의 ORM, 즉 객체 관계형 매핑을 쉽게 구현하도록 도와주는 API, 즉 인터페이스.
객체 관계형 매핑을 통해서 SQL문에 대한 의존성을 줄이고 개발자는 서버의 개발에 집중할 수 있다.
메소드 이름은 findby(필드명), deleteby(필드명)처럼 메소드 명칭만 적어주면 개발자는 SQL을 작성하지 않아도 쿼리문을 만들어준다.

여기서 API, 즉 인터페이스이기 때문에 실제로 사용하기 위해서는 구현체가 필요하다.
그렇기 때문에 프로젝트에서 Hibernate라는 구현체인 ORM 프레임워크를 사용하는 것이다.
사실 Hibernate 말고도 EclipseLink, DataNucleus 같은 프레임워크도 존재하지만, Hibernate가 가장 많이 쓰이는 건 범용적으로 다양한 기능을 제공하기 때문.

2) Hibernate, Spring Data JPA

Hibernate

Hibernate는 SQL을 사용하지 않고 직관적인 코드(메소드)를 사용해 데이터를 조작할 수 있지만, SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는 것은 아님.
Hibernate가 지원하는 메소드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 작성하지 않을 뿐.

장점

  • 생산성 및 객체지향적 개발(객체관계형 매핑과 더불어서)

Hibernate는 SQL을 직접 사용하지 않고, 메소드 호출만으로 query가 수행된다.
즉, 반복적인 SQL 작업과 CRUD 작업을 직접 하지 않으므로 생산성이 매우 높아진다.
객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직 및 객체 자체에 집중할 수 있다.

  • 유지보수

테이블 컬럼이 변경되었을 경우,
Mybatis에서는 관련 DAO의 파라미터, 결과, SQL 등을 모두 확인하여 수정해야 하지만
JPA는 JPA가 이런 일들을 대신 해주기 때문에 유지보수 측면에서 좋다.

  • 특정 SQL에 종속적이지 않다.

여러 DB 벤더 (MySQL, ORACLE 등 . .)마다 SQL 사용이 조금씩 다르기 때문에 어플리케이션 개발 시 처음 선택한 DB를 나중에 바꾸는 것은 매우 어렵다.
하지만 JPA는 추상화된 데이터 접근 계층을 제공하기 때문에 특정 벤더에 종속적이지 않다.

설정 파일에서 JPA에게 어떤 DB를 사용하고 있는지 알려주기만 하면 얼마든지 DB를 변경할 수 있다.

다만 그럼에도 단점이 존재하는데

단점

메소드 호출로 쿼리를 실행함에 따라 직접 쿼리를 작성하는 것보다 리소스를 더 잡아먹는다

Spring Data JPA

실제 코드 단위에서 JPA를 사용하고 있는 곳은 Spring Data JPA의 Repository의 구현이다.
개발자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 메소드 이름에 적합한 쿼리를 발신하는 구현체를 만들어 Bean으로 등록한다.

Spring Data JPA와 Hibernate의 차이점은, Spring Data JPA의 Repository 구현에서 GenericDao라는 커스텀 구현체(JPA 쿼리 생성 목적)를 제공한다는 점 등을 비춰봤을때, Spring Data JPA는 JPA를 쓰기 편하게 만든 모듈이며, 결국 얘를 사용하기 위해서는 JPA를 구현한 구현체(여기서는 Hibernate)가 필요한 것이다.

2. SQL

프로젝트에서 선택된 언어는 MySQL
비교 대상으로는 PostgreSQL

분명 PostgreSQL이 MySQL보다 기능적으로 더 유리한 부분이 많다. MySQL에 없는 GIN, GIST 등의 고급 인덱싱이나 단순 관계형 데이터베이스 관리 시스템(RDBMS)을 넘어선 객체 관계형 데이터베이스 관리 시스템(ORDBMS)이라던지, 배열, hstore 등의 다양한 SQL 데이터 유형을 지원한다.

그렇지만 속도와 안정성 측면에서는 MySQL이 특정 SQL 기능을 포함하지 않으면서 특히 동시성이 높은 읽기 전용 기능에서 두드러지는 장점을 보일 수 있다. 부하가 많은 상황에서의 복잡한 쿼리를 많이 실행해야 하는 케이스에서는 PostgreSQL이 나을 수 있지만 프로젝트 규모 및 엔티티 관계 및 러닝 커브를 고려해서 MySQL로 선택

https://dev-coco.tistory.com/74
https://ccomccomhan.tistory.com/131
https://www.integrate.io/ko/blog/postgresql-vs-mysql-which-one-is-better-for-your-use-case-ko/

profile
scientia est potentia / 벨로그 이사 예정...

0개의 댓글