JPA 소개

Jeongyeon Kim·2023년 1월 15일
0

JPA

목록 보기
1/11
post-thumbnail

SQL을 직접 다룰 때 발생하는 문제점

1. 반복

// 회원 객체
public class Member {
	private String memberId;
    private String name;
}
// 회원용 DAO
public class MemberDAO {
	
    public Member find(String memberId) {...}
    public void save(Member member) {...}
}

회원 조회 기능 개발

  1. SQL 작성
SELECT MEMBER_ID, NAME FROM MEMBER M WHERE MEMBER_ID = ?
  1. JDBC API 사용해 SQL 실행
ResultSet rs =  stmt.executeQuery(sql);
  1. 조회 결과를 Member 객체로 매핑
String memberId = rs.getString("MEMBER_ID");
String name = rs.getString("NAME");

Member member = new Member();
member.setMemberId(memberId);
member.setName(name);
...

회원 등록 기능 개발

  1. SQL 작성
String sql = "INSERT INTO MEMBER (MEMBER_ID, NAME) VALUES(?,?)";
  1. 회원 객체의 값을 꺼내서 SQL에 전달
pstmt.setString(1, member.getMemberId());
pstmt.setString(2, member.getName());
  1. JDBC API를 사용해서 SQL 실행
pstmt.executeUpdate(sql);

회원을 수정하고 삭제하는 기능도 추가하려면 SQL을 작성하고 JDBC API를 사용하는 일을 반복해야 함.

❗️ 데이터베이스는 데이터 중심의 구조를 가지므로 객체를 데이터베이스에 직접 저장하거나 조회할 수 없음.
✅ 따라서 개발자가 객체 지향 애플리케이션과 데이터베이스 중간에서 SQL과 JDBC API를 사용해서 변활 작업을 해주어야 함.

2. SQL에 의존적인 개발

  • 필드나 연관된 객체에 관한 요구사항이 추가되면 관련된 모든 코드를 수정해야 함.
  • 데이터 접근 계층을 사용해서 SQL을 숨겨도 어쩔 수 없이 DAO를 열어서 어떤 SQL이 실행되는지 확인해야 함.(엔티티 신뢰 X, 진정한 의미의 계층 분할 X)

3. JPA와 문제 해결

저장 기능

jpa.persist(member);

조회 기능

String memberId = "helloId";
Member member = jpa.find(Member.class, memberId);

수정 기능

Member member = jpa.find(Member.class, memberId);
member.setName("이름변경");

연관된 객체 조회

Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();

2. 패러다임의 불일치

  • 객체지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치 제공
  • 객체: 속성(필드), 기능(메소드)

관계형 데이터베이스는 데이터 중심으로 구조화되어 있고, 집합적인 사고 요구

1. 상속

  • Album이 Item을 상속한다면 persist() 메소드를 사용해 객체 저장
jpa.persist(album);

➡️ JPA가 ITEM, ALBUM 두 테이블에 나누어 저장

INSERT INTO ITEM ...
INSERT INTO ALBUM ...

find() 메소드를 통해 객체 조회

String albumId = "id100";
Album album = jpa.find(Album.class, albumId);

➡️ JPA가 ITEM과 ALBUM을 조인해서 필요한 데이터 조회하고 결과 반환

SELECT I.*, A.*
	FROM ITEM I
    JOIN ALBUM A ON I.ITEM_ID = A.ITEM.ID

2. 연관관계

  • 객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체 조회
  • 객체는 참조가 있는 방향으로만 조회 가능

테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블 조회

JPA가 참조를 외래 키로 변환하고 외래 키를 참고로 변환하는 과정을 처리해줌.

3. 객체 그래프 탐색

SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해짐.
➡️ 비즈니스 로직에 따라 사용하는 객체 그래프가 다른데 언제 끊어질지 모를 객체 그래프를 함부로 탐색할 수는 없음.

  • JPA를 사용하면 연관된 객체를 신뢰하고 마음껏 조회할 수 있음.
  • 실제 객체를 사용하는 시점까지 데이터베이스 조회를 미룬다고 해서 지연 로딩이라고 함.
  • JPA는 지연 로딩을 투명하게 처리

4. 비교

데이터베이스는 기본 키의 값으로 각 로우(row) 구분

객체는 동일성 비교와 동등성 비교라는 두 가지 비교 방법이 있음.

  • 동일성(identity) 비교: == 비교, 객체 인스턴스의 주소 값 비교
    ➡️ 데이터베이스의 같은 로우에서 조회했지만, 객체 측면에서 볼 때는 다른 인스턴스
  • 동등성(equality) 비교: equals() 메소드를 사용해서 객체 내부의 값 비교

JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장

3. JPA란 무엇인가?

  • JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준
  • JPA는 자바 ORM 기술에 대한 API 표준 명세
  • ORM(Object-Relational Mapping) 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해줌.
    ➡️ 자바 진영의 대표적인 ORM 프레임워크: 하이버네이트

JPA를 사용해야 하는 이유

  • 생산성
    ➡️ 지루하고 반복적인 코드와 CRUD용 SQL을 개발자가 직접 작성하지 않아도 됨. CREATE TABLE 같은 DDL 문을 자동으로 생성해주는 기능도 있음. 이런 기능들을 사용하면 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전시킬 수 있음
  • 유지보수
    ➡️ 개발자가 작성해야 했던 SQL과 JDBC API 코드를 JPA가 대신 처리해주므로 유지보수 해야 하는 코드 수가 줄어듦.JPA가 패러다임의 불일치 문제를 해결해주므로 객체지향 언어가 가진 장점들을 활용해서 유연하고 유지보수하기 좋은 도메인 모델을 편리하게 설계할 수 있음.
  • 패러다임의 불일치 해결
    ➡️ JPA는 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제를 해결해줌.
  • 성능
  • 데이터 접근 추상화와 벤더 독립성
    ➡️ 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공해서 애플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 함.
  • 표준
profile
Backend Developer👩🏻‍💻

0개의 댓글