JPA
JPA(Java Persistence Api)는 자바에서 제공하는 인터페이스로 ORM 기술에 대한 표준 명세이다.
관계형 데이터베이스를 사용하는 방식을 나타내며 ORM이므로 자바 클래스와 DB table을 Mapping한다.
ORM : Object - Relational Mapping(객체 관계 매핑)
- 객체와 관계형 데이터베이스의 데이터를 매핑하는 기술
- ORM 프레임워크가 객체와 데이터베이스 중간에서 매핑
- 객체와 테이블을 매핑하여 패러다임 불일치 문제 해결
JPA 동작
- JPA는 애플리케이션과 JDBC 사이에서 동작한다.
- JPA는 JDBC API를 사용하여 데이터베이스와 데이터를 주고받게 된다.
JPA를 사용하는 이유
기존의 개발 방식은 SQL 중심적인 개발이였다.이런식의 개발은 직접 SQL문을 작성해야 DB에 접근할 수 있기 때문에 비즈니스 로직 개발보다SQL 작성 및 수정에 더 많은 노력을 들여야했다.
간단한 예시로 아래 형태의 객체 데이터를 DB에 저장해서 관리해야된다고 한다면
public class Memo {
private Long id;
private String username;
private String contents;
}
1 ) DB 테이블 만들기
create table memo (
id bigint not null auto_increment,
contents varchar(500) not null,
username varchar(255) not null,
primary key (id)
);
2 ) SQL 작성 후 JDBC를 사용해서 직접 실행
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
String sql = "SELECT * FROM memo";
jdbcTemplate.update(sql, "Robbie", "오늘 하루도 화이팅!");
jdbcTemplate.query(sql, ...);
3 ) SQL 결과를 객체로 직접 만든다.
@Override
public MemoResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException {
// SQL 의 결과로 받아온 Memo 데이터들을 MemoResponseDto 타입으로 변환해줄 메서드
Long id = rs.getLong("id");
String username = rs.getString("username");
String contents = rs.getString("contents");
return new MemoResponseDto(id, username, contents);
}
이런 순서로 이루어지게된다. 또한 만약 Memo 데이터에 비밀번호를 추가한다면 어떻게될까 ?
public class Memo {
private Long id;
private String username;
private String contents;
// 비밀번호 추가
private String password;
}
// sql 수정
String sql = "INSERT INTO memo (username, contents, password) VALUES (?, ?, ?)";
// 결과값을 넣어주는 부분도 수정해야함
@Override
public MemoResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException {
// SQL 의 결과로 받아온 Memo 데이터들을 MemoResponseDto 타입으로 변환해줄 메서드
Long id = rs.getLong("id");
String username = rs.getString("username");
String contents = rs.getString("contents");
String password = rs.getString("password");
return new MemoResponseDto(id, username, contents, password);
}
이처럼 단순히 메모장에 비밀번호 하나 더 추가했다고 해야할 일들이 많아지는 것을 볼 수 있습니다.
하지만 JPA는 개발자가 직접 쿼리문을 별도로 작성할 필요가 없이 JPA가 적절한 SQL을 생성하여 DB에 전달하고
객체를 자동으로 Mapping해준다는 점에서 생산성을 크게 높인다
유지보수
기존에는 엔티티 클래스의 필드가 변경되면 모든 SQL을 수정해야 했지만
JPA는 쿼리를 작성하지 않기 때문에 필드가 변경되더라도 매핑 정보만 잘 연결하면 SQL문은 자동으로 작성된다.
하이버네이트
JPA는 표준 명세이고, 이를 실제 구현한 프레임워크 중 사실상 표준이 하이버네이트이다.
스프링 부트에서는 기본적으로 하이버네이트 구현체를 사용 중이다.
이외에도 JPA를 사용한다면 상속, 연관관계, 객체 그래프 탐색, 비교 등의
패러다임의 불일치 문제를 해결한다는 이점이있다.
'TIL' 카테고리의 다른 글
JPA - 댓글 CRUD (2) | 2024.10.14 |
---|---|
JPA - 일정 CRUD (1) | 2024.10.13 |
IoC & DI (1) | 2024.10.07 |
ResponseEntity (0) | 2024.10.04 |
Spring MVC 구조 이해하기 (1) | 2024.10.01 |