본문 바로가기
Java/ORM

JAVA ORM - Spring Data JPA(JPA와의 차이점)

by 티코딩 2024. 8. 20.

ㅇ JPA와 Spring Data Jpa의 차이

JPA (Java Persistence API)

JPA는 자바 표준 ORM API이다. 자바의 객체와 관계형 데이터베이스 간의 매핑을 정의하고 관리하기 위한 표준.

데이터베이스와의 매핑을 위해 엔티티(Entity) 클래스를 정의하고, 이를 통해 SQL 쿼리를 추상화하여 데이터베이스 조작을 수행한다.

JPA는 자바 EE의 일부로, 특정 구현체에 의존하지 않는 범용 인터페이스를 제공합니다. 따라서 구현체를 교체하더라도 코드의 큰 변경 없이 사용할 수 있다.

Spring Data JPA

Spring Data JPA는 JPA를 더 쉽게 사용할 수 있도록 도와주는 스프링 프레임워크의 하위 프로젝트다. Spring Data JPA는 JPA를 기반으로 하고, JPA의 기능을 확장하여 개발 생산성을 높혀준다.

Spring Data JPA는 복잡한 쿼리 작성을 간소화하는 다양한 기능(메서드 이름을 통한 쿼리 생성, 쿼리 메서드, @Query 애노테이션을 통한 직접 쿼리 작성 등)을 제공함. 또한, 레포지토리 패턴을 사용하여 CRUD 및 데이터 접근 계층을 쉽게 구현할 수 있다.

Spring Data JPA는 Spring Framework와 자연스럽게 통합되며, 트랜잭션 관리, 의존성 주입, 스프링의 다양한 기능들을 활용할 수 있습니다. 이를 통해 스프링 애플리케이션에서 데이터 접근 계층을 더욱 효과적으로 관리할 수 있다.

요약

  • JPA : 자바 표준 ORM API로, 객체와 데이터베이스 간의 매핑을 정의하는 데 사용됨.
  • Spring Data JPA : JPA를 기반으로, 이를 스프링 프레임워크와 통합하여 더 쉽게 사용할 수 있도록 돕는 확장 라이브러리. 특히, 레포지토리 패턴과 간편한 쿼리 작성 기능을 제공하여 JPA의 복잡함을 줄이고, 개발 생산성을 높힘.

나는 여태껏 Spring Data JPA만 사용해와서 사실 레포지토리를 사용하는 spring data jpa가 가장 편하다. 자세히 알아보자.

 

코드예제

 

1.멤버 엔티티

@Entity @Getter @Setter
@AllArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "username","age"})
public class Member {
    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;
    private int age;
    private String username;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "team_id")
    private Team team;

    public Member(String username) {
        this.username = username;
    }

    public Member(String username, int age, Team team) {
        this.username = username;
        this.age = age;
        if(team!= null){
            changeTeam(team);
        }
    }

    public void changeTeam(Team team){
        this.team = team;
        team.getMembers().add(this);
    }
}

 

2. 팀 엔티티

@Entity @Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of={"id", "name"})
public class Team {
    @Id @GeneratedValue
    @Column(name = "team_id")
    private Long id;

    private String name;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();

    public Team(String name){
        this.name = name;
    }
}


3. JPA 레포지토리

@Repository
public class MemberJpaRepository {
    @PersistenceContext
    private EntityManager em;

    public Member save(Member member) {
        em.persist(member);
        return member;
    }
    public Member find(Long id) {
        return em.find(Member.class, id);
    }
}

 

4. Spring Data JPA 레포지토리

public interface MemberRepository extends JpaRepository<Member, Long> {
}

 

위의 3,4번 레포지토리를 비교해보면 확연한 차이가 있는걸 확인할 수 있다.

JPA만 사용하려면 EntityManager 객체도 만들어야하고, 메서드도 만들어야 하는 번거로움이 있다.

하지만 Spring data Jpa를 사용하면 interface로 만들어 JpaRepository만 상속받아주면 save나, find, findall, findById, existById ... 등등 바로 사용할수있어서 개발자는 딱히 구현해줄게 별로 없다. 뭐 ID가 아닌 findByUsername이라든지 다른 파라미터를 사용하고싶다면 그렇게 사용할 수 도 있다.