프로그래머스 백엔드 데브코스 TIL 37-38일차

Inchang Choi·2022년 5월 16일
0

백엔드 데브코스 TIL

목록 보기
22/30
post-thumbnail

엔티티 매핑

단일 엔티티 매핑

JPA는 엔티티 객체를 생성할 때, 기본 생성자(Default Constructor)를 사용한다.

@Entity(속성 = “엔티티 이름”)

@Table(속성 = “매핑할 테이블 이름”)

DDL 옵션

@Id

  • 직접 할당
    • 영속화 전에 애플리케이션에서 직접 값을 할당한다.
      @Id
      @Column(name = "id")
      private Long id;
  • SEQUENCE
    • 데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속화
    • ORACLE, H2
      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE)
      private Long id;
  • TABLE
    • 데이터베이스 시퀀스 생성용 테이블에서 식별자 값을 획득한 후 영속화
  • IDENTITY
    • 데이터베이스 엔티티를 저장해서 식별자 값을 획득한 후 영속화
    • 엔티티가 영속화 되려면 식별자 값이 반드시 필요하기 때문에,
      em.persist() 시점에 INSERT 쿼리가 수행된다.
    • MySQL (AUTO_INCREMENT)
      @Id
      @GeneratedValue(strategy = GenerationType.IDENTITY)
      private Long id;
  • AUTO
    • 데이터 베이스 방언(dialect)에 따라서 자동으로 전략을 선택
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;
      
      @Id
      @GeneratedValue
      private Long id;

기타 컬럼매핑

@Entity
@Table(name = "orders")
public class Order {

    @Id
    @Column(name = "id")
    private String uuid;

    @Column(name = "order_datetime", columnDefinition = "TIMESTAMP")
    private LocalDateTime orderDatetime;

    @Enumerated(EnumType.STRING)
    private OrderStatus orderStatus;

    @Lob
    private String memo;
}

데이터 중심 설계의 문제점

설계한 엔티티로 DB 스키마를 설계하면 설계한, ERD 형태로 테이블이 생성되기는 하지만, 실제 엔티티 객체사이에는 서로 참조하지 않고 있다.

객체 연관관계 vs 테이블 연관관계

  • 테이블은 외래키로 연관 관계를 맺는다.
  • 객체는 참조(주소)로 연관관계를 맺는다.

핵심 키워드

  • 방향 (단방향, 양방향)

    • 회원 → 주문 또는 주문 → 회원 둘 중 한 쪽만 참조하는 것을 단방향 관계라고 한다.
    • 회원 → 주문, 주문 → 회원 양쪽 모두 서로 참조하는 것을 양방향 관계라고 한다.
    • 테이블에서의 관계는 항상 양방향이다.
  • 다중성 (다대일, 일대다, 다대다)

    • 회원은 여러 주문을 할 수 있기 때문에, 회원(1)과 주문(N)은 일대다 관계이다.
    • 주문은 여러 회원에 의해 발생할 수 있기 때문에, 주문(N)과 회원(1)은 다대일 관계이다.
  • 연관관계 주인 (mappedBy)

    • 객체를 양방향 연관관계로 만들면, 연관관계의 주인을 정해야 한다.
    • 외래키를 관리할 객체를 지정한다. (INSERT, UPDATE, DELETE)
    • 연관관계 주인만이, 외래키를 등록 수정 삭제 할 수 있다. (주인이 아닌쪽은 읽기만 가능하다.)
    • 테이블중 FK 가 있는 쪽이 연관관계 주인이 된다. (회원(1) - 주문(N) → 주문 엔티티가 연관관계의 주인이된다.)

Spring Data JPA

스프링에서 JPA를 편리하게 사용할 수 있도록 지원하는 의존성 입니다.

  • 데이터 소스 및 엔티티 매니저, 트랜잭션 매니저 설정을 자동으로 해줍니다.
  • 데이터 저장계층에 대한 인터페이스를 지원해줘서 CRUD 작업을 편리하게 할 수 있습니다.

메소드 쿼리

JPA repository 인터페이스를 이용하면 레퍼런스의 키워드를 참고한 이름을 기준으로 손쉽게 쿼리를 만들 수 있습니다.

커스텀 쿼리

@Query를 통하여 원하는 쿼리를 직접 짜서 사용할 수 있습니다.

QueryDSL

빌더 패턴을 이용하여 객체의 chaining 방식으로 쿼리를 짤 수 있습니다.

profile
always positive

0개의 댓글