[JPA] 자바 ORM 표준 프로그래밍 정리 #2

y__hi_2X·2022년 1월 26일
1

JPA

목록 보기
2/4

이 글은 김영한님의 '자바 ORM 표준 프로그래밍' 교재와 '실전! 스프링 부트와 JPA 활용' 강의를 바탕으로 정리한 글입니다. :)

이번 글에서는 실제로 동작하는 JPA 소스에 대해 간단히 살펴보겠습니다. 😚

JPA 테스트 시 사용될 기본적인 프로젝트 세팅은 https://start.spring.io/ 페이지에서 진행할 수 있습니다.

객체 매핑

JPA를 사용하려면 가장 먼저 클래스와 테이블을 매핑해야 한다.

테이블

예시로 아래와 같은 회원 테이블과 있다고 가정해보자.

create table member
(
    member_id bigint       not null	primary key,
    name  varchar(255) null,
    city      varchar(255) null,
    street    varchar(255) null,
    zipcode   varchar(255) null
);

클래스

회원 클래스에 JPA가 제공하는 매핑 어노테이션이 추가해 테이블을 표현할 수 있다.

@Entity
public class Member {

    @Id
    @GeneratedValue
    @Column(name="member_id")
    private Long id;

    private String name;

    @Embedded
    private Address address;

    @OneToMany(mappedBy = "member")
    private List<Order> orderList = new ArrayList<>();
}
  • @Entity
    엔티티 클래스를 테이블과 매핑한다고 JPA에 알려준다.
  • @Table
    엔티티 클래스에 매핑할 테이블 정보를 알려준다. 여기서는 엔티티와 테이블 명이 동일하기에 생략되었다.
  • @Id
    필드를 테이블의 기본 키(Primary key)에 매핑한다.
  • @GeneratedValue
    기본키 매핑 전략
    AUTO: 데이터베이스에 따라 알맞은 전략 선택(Default / Oracle: SEQUENCE, MySQL: IDENTITY)
    IDENTITY: 기본 키 생성을 데이터베이스에 위임
    SEQUENCE: 데이터베이스 시퀀스를 통해 기본 키 할당
    TABLE: 키 생성용 테이블을 만들어 시퀀스처럼 사용
  • @Column
    필드를 컬럼에 매핑한다. 해당 어노테이션이 없는 경우 동일한 이름의 컬럼(대소문자 구분은 데이터베이스에 따라 다르므로 유의!)을 찾아 자동 매핑한다.
  • @Embedded
    사용자가 정의한 값 타입을 지정할 수 있다.(연관도 있는 값들로 분류해 응집력 ↑)
  • @OneToMany
    양방향 연관관계 매핑, 해당 어노테이션은 일대다 관계를 나타낸다.

매핑 관계

객체 매핑이 된 테이블과 클래스의 관계는 아래와 같이 나타난다.

비즈니스 로직

실제로 JPA를 이용하는 간단한 코드를 알아보도록 하자.

EntityManager em;

String memberId = "user1";

Member member = new Member();
member.setId(memberId);
member.setName("James");
member.setId(20);

// 등록
em.persist(member);

// 조회
Member findMember = em.find(Member.class, memberId);

// 수정
member.setAge(21);

// 삭제
em.remove(member);

수정의 경우 별도의 엔티티 매니저 함수를 이용하지 않고 단순히 엔티티의 값만 변경했다. JPA는 어떤 엔티티가 변경되었는지 추적하는 기능을 갖추고 있기에 엔티티의 값만 변경하면 자동으로 UPDATE문을 생성해 데이터베이스의 값을 변경한다.
엔티티 매니저는 엔티티의 등록, 조회, 삭제와 같은 기본적인 함수를 제공하기에 개발자는 SQL을 작성할 필요없이 이 함수를 이용하면 된다. 실제 SQL은 JPA가 자동으로 생성해 데이터베이스에 넘겨준다.

JPQL

위에서 예시로 든 예제는 엔티티 매니저의 함수를 통해 처리 가능한 단순한 코드였다. 하지만 실제 실무에서는 위 함수로 처리할 수 없는 복잡한 로직을 만들어야할 경우가 생긴다.
이에 JPA는 엔티티 객체를 대상으로 쿼리하는 JPQL을 제공한다.

EntityManager em;

List<Member> memberList = em.createQuery("select m from Member m", Member.class)
                .getResultList();

JPQL은 위와 같이 엔티티 매니저의 createQuery 함수를 통해 쿼리 객체를 생성하며 이를 getResultList()로 리턴한다.


읽어주셔서 감사합니다. 🙇‍

0개의 댓글