
1. JDBC란?
JDBC(Java Database Connectivity) 란 자바 프로그래밍 언어를 사용해 데이터베이스에 접근할 수 있도록 하는 자바 API이다. 이를 통해 우리는 DB에 접근 할 수 있다.
기존에 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL 문법 등이 다른 문제를 해결하기 위해 JDBC가 등장하게 되었다.

JDBC 드라이버란 DBMS 회사들이 자신들의 데이터베이스 시스템에 접근 할 수 있도록 표준 JDBC 인터페이스에 명시된 메소드들을 구현한 것이다
사용자는 자신에게 맞는 JDBC Driver를 선택하여 원하는 데이터베이스를 사용할 수 있다.
[Spring에서 JDBC를 설정해주는 예시]
spring:
datasource:
url: ${DB_URL:jdbc:mysql://localhost:3306/dayoung}
username: ${DB_USERNAME:root}
password: ${DB_PASSWORD:070211}
driver-class-name: com.mysql.cj.jdbc.Driver
#만약 당신의 database가 sqlite라면 아래 driver 설정만 변경하면 된다.
driver-class-name: org.sqlite.JDBC
2. JPA란?
JPA(Java Persistence API)란, JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 즉, 실제적으로 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다.
JPA의 구현체로 보통 Hibernetes를 많이 사용한다.
그 외에도 OpenJPA, EclipseLink, DataNucleus 등이 존재한다.
3. Hibernate란?
JPA는 Hibernate와 매핑을 해주는 인터페이스일 뿐이기에 실제 기능들은 Hibernate 구현체 등의 안에 전부 존재한다.
Hibernate의 기능
- Spring Data Jpa : 추후 후설하겠다.
- 특정 기술에 종속적이지 않다 : 설정 파일에서 JPA에게 어떤 DB를 사용하고 있는지만 알려주면 얼마든지 DB를 변경할 수 있다.
- 패러다임 불일치 해결 : ORM의 역할 중 하나로, Ovject와 Database간의 패러다임 불일치를 해결할 수 있다.
- 테이블 컬럼이 변경되었을 때, 자동으로 SQL문을 날려 유지보수를 편하게 한다.
사람들이 잘 모르는 것이, 보통 코드에서 추가해주는 JPA의존성은 Spring Data JPA이다. 이 의존성을 추가해주면 구현체들과 라이브러리들을 가져와 JPA를 사용할 수 있게 되는 것이다.
4. Spring Data JPA란?
JpaRepository 인터페이스를 상속받으면, Spring Data JPA가 해당 인터페이스의 구현 클래스를 자동으로 생성해주고, 이 구현 클래스는 Spring Bean으로 등록 된다.
SpringBoot 애플리케이션에서 @EnableJpaRepositories를 자동으로 설정해주어서, 직접 명시하지 않아도 자동으로 JpaRepository빈을 활성화 한다.
이 과정에서 Spring은 JPA 프록시 기술을 사용하여 데이터베이스와 상호작용하는 코드를 자동으로 생성한다
따라서 개발자는 별도로 구현 클래스를 작성하지 않아도 기본적인 CRUD 기능을 사용할 수 있다.
[쿼리 메서드 예시 코드]
public interface QuizRepository extends JpaRepository<Quiz, Long> {
List<Quiz> findAllByTitleAndAreaInAndLevelIn(String title, List<Area> area, List<Level> level);
Quiz findQuizById(Long id);
}
쿼리 메서드 단점
- 메서드 호출만으로 쿼리를 수행하는 것은 Raw SQL보다 성능이 떨어진다.
- 복잡하고 무거운 쿼리는 튜닝 혹은 가독성을 위해 결국 SQL을 직접 작성하게 될 수도 있다.
- 학습비용이 비싸다.
JPQL
JPA에서 지원하는 기능중, JPQL이라는 것이 있는데, 쿼리 메서드만으로는 섬세한 쿼리 작성이 어려워 탄생하게 된 언어이다.
[예시 코드]
@Query("SELECT m FROM Member m WHERE m.name = 'podo'")
List<Member> findMembersByNamePodo();
JPQL 특징
- 테이블이 아닌 객체를 검색하는 객체지향 쿼리이다
- SQL을 추상화 했기 때문에 특정 벤더에 종속적이지 않는다.
- JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회한다.
JPQL 단점
- JPQL은 기본 문자열로 작성되기에 컴파일 단계에서 문법이 잘 못 되어도 에러를 발생시키지 않는다.
- 동적으로 쿼리 언어를 작성하는데 효율적이지 못하다.
- 쿼리 메서드보다는 빠르지만, 여전히 Raw SQL보다는 느리다.
참고 👇👇
https://dev-coco.tistory.com/74
https://aomee0880.tistory.com/132
https://velog.io/@alstjdwo1601/JDBC란
https://hstory0208.tistory.com/entry/JPA-JPA란-그리고-Spring-Data-JPA
'Java & Kotlin' 카테고리의 다른 글
| 테스트 코드를 작성하며 느낀 필요성 (0) | 2024.10.30 |
|---|