JPA와 스프링부트

·2023년 5월 23일
0
post-thumbnail

mvcc란? 다중버전 동시성 제어

  1. Entity(엔티티)
    데이터베이스(Database, DB) 에 쓰일 필드와 여러 엔티티간 연관관계를 정의한다. 데이터베이스는 엑셀처럼 2차원 테이블이라고 생각하면 되는데, 이 테이블에 서비스에서 필요한 정보를 다 저장하고 활용
    @Entity : 클래스 위에 선언하여 이 클래스가 엔티티임을 알려준다. 이렇게 되면 JPA에서 정의된 필드들을 바탕으로 데이터베이스에 테이블을 만들어준다.
    @GeneratedValue : 기본키 생성을 데이터베이스에게 위임하는 방식으로 id값을 따로 할당하지 않아도 데이터베이스가 자동으로 AUTO_INCREMENT를 하여 기본키를 생성해준다.
    (@Id 와 사용)

1-1. 엔티티 매니저를 통한 모든 데이터 변경은 트랜잭션 안에서 이루어져야함.
따라서 변경이 있을 경우 @Transactional 어노테이션을 사용해줘야함

  1. Repository (like DAO)
  • Entity에 의해 생성된 DB에 접근하는 메서드(ex) findAll()) 들을 사용하기 위한 인터페이스이다. 위에서 엔티티를 선언함으로써 데이터베이스 구조를 만들었다면, 여기에 어떤 값을 넣거나, 넣어진 값을 조회하는 등의 CRUD(Create, Read, Update, Delete)를 해야 쓸모가 있는데, 이것을 어떻게 할 것인지 정의해주는 계층이라고 생각하면 된다.
  • @PersistenceContext : 스프링부트가 해당 어노테이션을 확인하고 주입해줌
  • persist() 시점에는 Entity를 영속성 컨텍스트에 저장하는 것
    https://gmlwjd9405.github.io/2019/08/06/persistence-context.html
  1. Autowired란 (@Autowired)
    필요한 의존 객체의 “타입"에 해당하는 빈을 찾아 주입한다.
    생성자/setter/필드 3가지의 경우에 Autowired를 사용할 수 있다.
  1. 영속성 컨텍스트란?
    영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
em.persist(member);

4-1. 엔티티 매니저를 사용해 회원 엔티티를 영속성 컨텍스트에 저장한다는 의미!

영속성 컨텍스트의 특징 :
엔티티 매니저를 생성할 때 하나 만들어진다.
엔티티 매니저를 통해서 영속성 컨텍스트에 접근하고 관리할 수 있다.

  1. 추상 클래스(Abstract Class) :
    추상 메서드를 선언해 놓고 상속을 통해 자식 클래스에서 메서드를 완성하도록 유도하는 클래스이다. 이러한 특성 탓에 미완성 설계도라고 표현하기도 한다. 추상클래스는 상속을 위한 클래스이기 때문에 따로 인스턴스를 생성할 수 없다.

  2. 인터페이스 :
    인터페이스도 추상 클래스와 비슷하게 다른 클래스를 작성하는데 도움을 주는 목적으로 작성한다.
    다만 인터페이스는 추상 클래스보다 추상화 정도가 높아 추상 클래스와 다르게 구현부가 있는 일반 메서드, 일반 변수 멤버 등을 가질 수 없다. 즉, 인터페이스는 구현된 게 아무것도 없는 기본 설계도라고 할 수 있다. 인터페이스 또한 인스턴스를 생성할 수 없다.

  3. 상속관계 매핑전략

@Inheritance

  • single table : 한 테이블에 다 넣기
  • joined : 조인을 통한 가장 정교화된 테이블
  • table per class : 클래스별로 테이블 생성

@DiscriminatorColumn(name="dtype")

  • 부모 클래스에 선언한다. 하위 클래스를 구분하는 용도의 컬럼이다. 관례는 default = DTYPE

@DiscriminatorValue("XXX")

  • 하위 클래스에 선언한다. 엔티티를 저장할 때 슈퍼타입의 구분 컬럼에 저장할 값을 지정한다.
  • 어노테이션을 선언하지 않을 경우 기본값으로 클래스 이름이 들어간다.
  1. Enum : 열거형
    엔티티 매핑에서 Enum 타입 사용 -> @Enumerated 어노테이션 사용
    -종류 : EnumType.ORDINAL/EnumType.STRING
    - EnumType.ORDINAL : enum 순서 값을 저장
    ㄴ 중간에 다른 값이 들어가면 값이 밀려서 db가 달라지기 때문에 절대 사용하지 않는 것을 추천.

    • EnumType.STRING : enum 이름 값을 저장
  2. @JoinTable 속성

  3. cascade = CascadeType.ALL

private List<OrderItem> orderItems = new ArrayList<>();
persist(orderItemA)
persist(orderItemB)
persist(orderItemC)
persist(order)

private List<OrderItem> orderItems = new ArrayList<>();
persist(order)

처럼 생성/삭제를 한번에 처리하게 해줌.

0개의 댓글