본문 바로가기
개발자의삶/Java

JPA를 사용하는 이유와 JPA 는 어떻게 객체 지향적인가?

by 트라네스 2025. 3. 17.
728x90
반응형

 

 이번에 공부를 하다 보니 JPA를 쓴 적은 있는데 이걸 왜 썼는지가 중요한 느낌이라 한 번 이것저것 찾아보고 공부한 흔적을 작성해보고자 한다. JPA를 사용하는 이유는 여러 가지가 있겠지만 익숙하는 전제하에 생산성을 높이고 Entity와 Table의 매핑을 통하여 쿼리 작성이 필요 없이 객체지향적 데이터 처리가 가능하다. 아래를 보자.

 

JPA를 사용하는 이유

JPA(Java Persistence API)는 Java 애플리케이션에서 데이터베이스와 객체 간의 매핑(ORM, Object-Relational Mapping)을 제공하는 표준 API입니다. JPA를 사용하는 이유는 다음과 같습니다.

  1. 객체 지향적인 데이터 처리
    • SQL 중심이 아닌 객체 중심으로 데이터를 다룰 수 있음.
    • 객체와 테이블 간의 변환을 자동으로 수행하여 코드의 일관성을 유지.
  2. 생산성 향상
    • SQL을 직접 작성하는 대신, 엔티티 객체를 사용하여 데이터 조작 가능.
    • @Entity, @Id, @Column 등의 어노테이션을 활용해 간편하게 매핑 설정.
  3. DB 변경에 대한 유연성
    • 특정 RDBMS에 종속되지 않으며, 설정 변경을 통해 DBMS를 쉽게 교체 가능.
    • DDL 자동 생성 기능(hibernate.hbm2ddl.auto)을 통해 테이블을 자동으로 생성 및 업데이트 가능.
  4. 트랜잭션 관리 및 일관성 유지
    • @Transactional을 사용하여 트랜잭션을 자동 관리.
    • 변경 감지(Dirty Checking)를 통해 필요한 경우에만 업데이트 수행.
  5. SQL을 최소화하고 유지보수 용이
    • JPQL(Java Persistence Query Language)을 활용하여 객체 지향적인 쿼리를 작성.
    • 데이터베이스 변경이 발생해도 엔티티 클래스를 수정하는 방식으로 대응 가능.

 

JPA는 어떻게 객체 지향적인가?

JPA는 객체 지향적인 개념을 유지하면서 관계형 데이터베이스와 연동할 수 있도록 설계되었습니다.

  1. 객체 중심 모델 유지
    • SQL에서는 테이블과 행(Row) 중심으로 데이터를 다루지만, JPA에서는 객체와 필드를 활용하여 데이터를 저장하고 조회할 수 있음.
    • User 객체를 User 테이블과 매핑하여 SQL 없이도 객체만으로 데이터를 조작 가능.
  2. 객체 간 연관관계 매핑 지원
    • 관계형 DB에서는 JOIN을 통해 데이터를 연결하지만, JPA는 객체의 연관관계(OneToMany, ManyToOne 등)를 직접 설정할 수 있음.
@Entity
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();
}

@Entity
public class Order {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;
}

 

 

  • Member 객체에서 Order 리스트를 직접 접근할 수 있으며, SQL을 직접 작성하지 않아도 member.getOrders()로 쉽게 주문 목록을 조회 가능.

   3. 영속성 컨텍스트(Persistence Context) 활용

  • 엔티티 객체는 JPA의 영속성 컨텍스트에서 관리되며, 동일한 트랜잭션 내에서는 같은 객체를 재사용할 수 있음.
  • 변경 감지(Dirty Checking) 기능을 통해, 개발자가 update SQL을 직접 작성하지 않아도 변경된 부분만 자동으로 업데이트됨.

 

    4. 캡슐화 및 객체 지향적인 쿼리 사용

  • JPQL을 통해 SQL이 아닌 객체를 대상으로 하는 쿼리를 작성할 수 있음.
  • 예시 
String jpql = "SELECT m FROM Member m WHERE m.name = :name";
List<Member> members = em.createQuery(jpql, Member.class)
                         .setParameter("name", "John")
                         .getResultList();

 

  • 객체의 필드(m.name)를 대상으로 조건을 설정할 수 있어 가독성이 향상됨.

 

   5. 계층형 구조와 상속 지원

  • JPA는 객체의 상속 관계를 테이블 구조와 매핑할 수 있도록 지원함.
  • @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 등을 활용하여 객체의 계층 구조를 유지한 채 데이터베이스에 저장 가능.

 

결론

JPA는 객체 지향적인 방식으로 데이터를 처리할 수 있도록 ORM을 지원하며, 개발자가 객체 중심으로 코드를 작성할 수 있게 도와줍니다.

  • 테이블이 아닌 객체 단위로 데이터를 다룰 수 있음.
  • 객체 간 연관관계를 설정하여 SQL JOIN 없이 객체 탐색 가능.
  • 트랜잭션 및 변경 감지 기능으로 데이터 일관성을 유지함.
  • JPQL 및 Criteria API를 통해 객체 지향적인 쿼리를 작성할 수 있음.

이러한 이유로 JPA는 SQL 중심의 개발 방식보다 유지보수성이 뛰어나고 객체 지향적인 개발 패턴을 유지할 수 있도록 도와줍니다. 🚀

 

 

추가 참고 : https://github.com/spring-projects/spring-data-examples/tree/main/jpa/jpa21

728x90
반응형

댓글


TOP

TEL. 02.1234.5678 / 경기 성남시 분당구 판교역로