JPA란 무엇일까?

여준서·2024년 8월 21일
post-thumbnail

JPA란?

JPA는 자바에서 데이터베이스에 데이터를 저장하고 조회 할 수 있게 해주는 도구이다. 마치 자바 객체와 데이터베이스 테이블을 서로 연결해주는 다리 같은 역할을 한다.


JPA가 필요한 이유

SQL없이 데이터베이스 다루기

기존에는 데이터베이스에서 정보를 가져오거나 저장하려면 SQL이라는 언어를 직접 작성해야했다. 하지만 JPA를 사용하면 복잡한 SQL을 직접 쓰지 않고도 , 자바 코드로 쉽게 데이터를 다룰 수 있다.

JPA의 장점

  • 코드가 간결해진다. : SQL을 직접 작성하지않기 때문에 코드가 더 깔끔하고 관리하기 쉽다.
  • 효율적이다 : 자바 객체와 데이터베이스 사이의 변환을 자동으로 처리해줘서 개발자가 덜 신경 쓸 수 있다.
  • 데이터베이스 독립성 : 다양한 데이터베이스에서 사용할 수 있도록 도와준다.(MySQL,Oracle 등등)

JPA의 핵심 개념

엔티티(Entity)

엔티티는 쉽게 말해 데이터베이스의 테이블에 대응되는 자바 객체이다. 예를 들어, 회원 정보를 저장하는 테이블이 있다면, 자바 코드에서는 Member라는 클래스를 만들어 테이블과 연결해준다.

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private int age;
}

영속성 컨텍스트란?

영속성 컨텍스트는 자바의 메모리 공간이다 여기서 JPA가 엔티티 객체를 관리한다. 쉽게 말해서 , JPA가 데이터베이스에 저장할 객체들을 모아두는 공간이다. 이 공간 덕분에 JPA가 객체의 상태를 추적하고, 데이터베이스와의 작업을 효율적으로 처리할 수 있다.

영속성 컨텍스트의 역할
1. 객체를 관리함 : 데이터베이스에 저장될 객체들을 메모리에서 관리하고 , 필요한 작업을 자동으로 처리해준다.
2. 1차 캐시 기능 : 영속성 컨텍스트는 자주 사용하는 데이터를 메모리에 저장해둬서 , 데이터베이스를 자주 조회하지 않게 해준다. 이렇게 하면 성능이 좋아진다.
3. 변경 감지 : JPA는 객체의 값이 변경되면 이를 감지하고 , 변경된 부분만 데이터베이스에 업데이트해준다. 그래서 개발자들이 일일이 수정할 필요가 없다.

객체의 상태
JPA는 객체를 크게 비영속,영속,준영속,삭제상태로 나눠서 관리한다.
1. 비영속 상태
아직 데이터 베이스와 연결되지 않은, 그냥 메모리 상에만 있는 상태다. 예를 들어 new키워드로 객체를 만들면 이 상태에 있다.

Member member = new Member(); // 비영속 상태
  1. 영속 상태(Persistent) :
    객체가 영속성 컨텍스트에 저장된 상태이다. 이제 JPA가 이 객체를 관리하면서 데이터베이스와 연결된 상태이다.
em.persist(member); // 영속 상태

3.준영속 상태(Detached):
한번 영속 상태였던 객체가 더 이상 JPA에 의해 관리되지 않는 상태이다. 한마디로 데이터베이스와의 연결이 끊긴 상태이다.

em.detach(member); // 준영속 상태
  1. 삭제 상태(Removed):
    객체가 삭제된 상태이다. 영속성 컨텍스트에서 삭제되고, 데이터베이스에서도 삭제될 준비를 하고 있다.
em.remove(member); // 삭제 상태

1차 캐시

1차 캐시는 JPA가 관리하는 작은 메모리 저장소이다. 여기서 조회한 데이터를 한번 저장해뒀다가 ,똑같은 데이터를 다시 요청 할 때는 데이터베이스가 아니라 메모리에서 바로 가져오는 기능이다. 덕분에 성능이 좋아진다.

변경 감지

변경 감지는 JPA가 객체의 변화를 자동으로 감지하는 기능이다. 엔티티의 필드 값을 수정하면 , JPA는 변경된 내용을 알아채고 , 트랜잭션이 끝날 때 자동으로 데이터베이스에 반영해준다.

public void updateMember(Long id, String newName) {
    Member member = em.find(Member.class, id); // 영속 상태
    member.setName(newName); // 값을 변경함
    // 트랜잭션이 끝나면 데이터베이스에 자동으로 업데이트됨
}

쓰기 지연

쓰기 지연JPA가 데이터베이스에 즉시 반영하지 않고 , 변경 내용을 모아뒀다가 한번에 처리하는 방법이다. 트랜잭션의 개념이 여기에 반영이 되었다. 이렇게 하면 여러개의 SQL 쿼리를 한번에 실행 할 수 있어서 성능이 더 좋아진다.

public void createMember(Member member) {
    em.persist(member); // SQL 실행은 아직 안됨
    // 트랜잭션이 끝날 때 INSERT 쿼리가 실행됨
}

정리 및 결론

JPA는 데이터베이스와 자바 객체를 연결해주는 강력한 도구이다. 그 중에서도 영속성 컨텍스트는 데이터를 메모리에서 관리하면서 성능을 높여주는 중요한 역할을한다. 데이터를 효율적으로 관리하고 , 우리가 일일이 신경 쓰지 않아도 변경 사항을 자동으로 처리해준다.

그 덕분에 개발자는 SQL 쿼리를 직접 작성하지 않아도 객체 지향적으로 데이터를 다룰 수 있고 ,성능도 최적화된 프로그램을 만들 수 있다. JPA는 개발자의 일을 더 쉽고 빠르게 만들어주는 도구라고 생각하면 된다.

profile
DevOps 전향을 준비 중인 인프라 지향형 주니어 개발자

0개의 댓글