교내 해커톤과 동아리 프로젝트에서 JPA를 이용하여 서버 개발을 진행하였다.
JPA가 뭔지도 모르고 냅다 개발부터 했기에..
어려움도 많았고 배운것도 많았지만! 김영한님 강의를 들으며 개념을 천천히 정리해보려 한다.
지금 시대는 객체를 관계형 DB에 관리
JDBC를 사용해보면 SQL문을 정말.정말정말 많이 써야 한다는 것을 알 수 있다.
자바 객체 ↔ SQL
여기에서 오는 패러다임의 불일치는 개발자를 'SQL 매퍼'로 만들어 버린다.
갑자기 기획자님이 멀쩡한 class에 필드를 하나 추가해달라고 요청한다고 치자
모든 SQL문에 필드를 넣어야 하는...참 귀찮고 힘든 불상사가 일어나게 된다.
객체를 자바 컬렉션에 저장하면 어떨까?
갑자기 웬 컬렉션인가 싶겠지만 이게 참 편리할 것 같다는 걸 알게된다.
JDBC에서 사용하는 SQL문 직접 작성 방법
public Album findAlbumById(Connection conn, Long albumId) throws SQLException {
String sql = "SELECT i.id, i.name, i.price, a.artist FROM Item i JOIN Album a ON i.id = a.id WHERE a.id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setLong(1, albumId);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
Album album = new Album();
album.setId(rs.getLong("id"));
album.setName(rs.getString("name"));
album.setPrice(rs.getDouble("price"));
album.setArtist(rs.getString("artist"));
return album;
}
}
}
return null;
}
- 데이터베이스에서 직접 Item과 Album을 조인하여 필요한 데이터를 조회
- SQL 쿼리 작성과 실행에 대한 오버헤드가 있습니다.
vs
만약 자바 컬렉션이라면?
public Album findAlbumById(List<Album> albums, Long albumId) {
for (Album album : albums) {
if (album.getId().equals(albumId)) {
return album;
}
}
return null;
}
- 메모리에 로드된 Album 객체 리스트를 반복 검사하여 ID가 일치하는 객체를 찾음
그렇다면 객체를 자바 컬렉션에 저장 하듯이 DB에 저장할 수는 없을까?
JPA - Java Persistence API
JPA는 자바 진영에서 ORM(Object-Relational Mapping)을 제공하여 애플리케이션의 객체와 관계형 데이터베이스 테이블을 자동으로 연결해주는 표준 기술이다.
이 말이 무슨 뜻인지 하나씩 알아보겠다.
ORM
- Object-relational mapping (객체 관계 매핑)
- 객체는 객체대로, 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재
데이터를 생성한 프로그램이 종료되어도 데이터가 사라지지 않고 영구적으로 저장되는 특성을 영속성(Persistence)라고 한다.
영속성의 예
- 데이터베이스: 가장 흔한 영속성의 예로, SQL 데이터베이스(MySQL, PostgreSQL) 혹은 NoSQL 데이터베이스(MongoDB) 등
- 파일 시스템: 로그 파일, 구성 파일, 데이터 덤프 등
- 클라우드 스토리지: AWS S3, Google Cloud Storage와 같은 클라우드 기반 스토리지 서비스
데이터의 영속성을 관리하기 위해 원래 JDBC를 사용했다. 개발자는 직접 SQL명령어를 작성하여 데이터베이스를 조작할 수 있었는데, 이는 비효율적인 작업을 지원한다.
ORM은 객체-관계형 데이터베이스 테이블 간의 매핑을 자동화하여 객체를 마치 데이터베이스의 테이블인 것처럼 다룰 수 있게 하는 프로그래밍 기술이다.
ORM을 사용하면 SQL을 직접 작성하는 대신, 객체의 속성과 메서드를 통해 데이터를 관리할 수 있다.
JPA는 자바에서 ORM을 구현하기 위한 표준 인터페이스를 제공한다. JPA는 ORM의 개념을 구현하며, JDBC 위에서 작동하여 개발자가 데이터베이스 작업을 쉽게 할 수 있도록 도와준다.
앞서 설명했던 것처럼 JPA도 결국 JDBC위에서 동작한다.
JPA는
- 유저가 만든 Entity를 분석
- SQL문을 직접 생성
- JDBC API를 사용
- 객체-관계형DB 간의 패러다임 불일치 해결
이러한 프로세스를 가지게 된다.
Hibernate
JPA의 특이한 점 중 하나가 여기서 나온다.
JPA는 ORM 기술 표준으로 사용하는 인터페이스의 모음인데, 그럼 그 구현체들은 어디에 있을까?
가장 널리 알려진 구현체가 Hibernate이다.
재미있는 점은 JPA보다 하이버네이트가 먼저 시작됐다는 것이다.
기존에 있던 자바 표준 기술(EJB)에 아쉬움을 느낀 한 개발자(개빈 킹(Gavin King))님이 오픈소스로서 하이버네이트를 개발 및 배포하였고
그 다음에 자바에서 개빈 킹을 모셔왔다고 한다.
IT업계의 빠른 발전은 역시 지식공유가 한 몫 한다고 생각한다
'백엔드 > Spring' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 04. 엔티티 매핑 (0) | 2025.03.03 |
---|---|
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 03. 영속성 관리 (0) | 2025.02.28 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 02. JPA 시작 (0) | 2025.02.28 |
[실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발] 도메인 분석 설계 (1) | 2025.01.18 |
객체지향 & TDD (5) | 2024.09.16 |