본문 바로가기

반응형

Spring/JPA & Hibernate

(24)
Transaction Transaction 이란, 더 이상 나눌 수 없는 작업 단위(unit of work)을 말한다. ACID Atomicity transaction의 작업이 부분적으로 성공하는 일이 없도록 보장하는 성질이다. 송금하는 사람의 계좌에서 돈은 빠져나갔는데 받는 사람의 계좌에 돈이 들어오지 않는 일은 없어야 한다. Consistency transaction이 끝날 때 DB의 여러 제약 조건에 맞는 상태를 보장하는 성질이다. 송금하는 사람의 계좌 잔고가 0보다 작아지면 안 된다. Isolation transaction이 진행되는 중간 상태의 데이터를 다른 transaction이 볼 수 없도록 보장하는 성질이다. 송금하는 사람의 계좌에서 돈은 빠져나갔는데 받는 사람의 계좌에 돈이 아직 들어가지 않은 DB 상황을 다..
JPA 데이터 타입 entity type @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 예) 회원 앤티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변셩시 추적 불가 10 -> 20으로 변경하면 값이 완전히 대체 값 타입 분류 1. 기본값 타입 자바 기본 타입 (int, double) 래퍼 클래스 (Integer, Long) String 특징 - 생명주기를 엔티티에 의존 - 값 타입은 공유하면 안됨 기본 타입은 항상 값을 복사함, 둘은 전혀 다른 주소 공간을 사용 ex> 화원 이름 변경시 다른 회원의 이름도 함께 변경되면 안됨 (side effect) - Integer..
영속성 전이 CASCADE 영속성 전이 CASCADE 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들도 싶을 때 사용하는 기능 @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany( mappedBy = "parent" ) private List childList = new ArrayList(); } @Entity public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne @JoinColumn( name = "parent_id" ) private Parent parent; } Pare..
proxy Why proxy? Member를 조회할 때 team도 데이터베이스에서 함께 조회해야 할까? 만약, 비즈니스 로직 상, 맴버를 조회할 때, 그 맴버와 연관된 팀 정보도 함께 조회해야한다면, 팀 데이터까지 조회해야하지만, 그것이 아니라면, 굳이 팀 정보를 가져오는 것은 성능 상 불리할 수 있다. 비즈니스 로직에 의해 유동적일 수 있는 이러한 사항을 JPA는 프록시와 지연로딩을 통해 해결한다. JPA에서 제공해주는 두가지 메소드 1. em.find() 데이터베이스를 통해서 실제 엔티티 객체 조회 ( quary가 실행됨 ) 2. em.getReference() 데이터베이스 조회를 미루는 가짜(프록시)엔티티 객체를 조회( 디비에 quary를 실행하지 않음 ) getReference 메서드는 조회가 필수적으로 필..
@MappedSuperclass @MappedSuperclass public abstract class BaseEntity { private String createdBy; private LocalDateTime createdDate; private String lastModifiedBy; private LocalDateTime lastModifiedDate; } @Entity public class Member extends BaseEntity { @Id @GeneratedValue( strategy = GenerationType.IDENTITY ) @Column( name = "MEMBER_ID" ) private Long id; @Column( name = "USRNAME" ) private String username; @Man..
연관관계 맵핑 영속성 전이 CASCADE 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들도 싶을 때 예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장. @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany( mappedBy = "parent" ) private List childList = new ArrayList(); } @Entity public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne @JoinColumn( name = "parent_id" ) priva..
Entity Mapping @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 필수 주의 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) final 클래스, enum, interface, inner 클래스 사용X 저장할 필드에 final 사용 X 속성: name JPA에서 사용할 엔티티 이름을 지정한다. 기본값: 클래스 이름을 그대로 사용(예: Member) 같은 클래스 이름이 없으면 가급적 기본값을 사용한다. 데이터베이스 스키마 자동 생성 application loading 시점에 자동 DDL 생성 테이블 중심 -> 객체 중심 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성 이렇게 생성된 DDL은 개발 장비에서만 사..
준영속 상태 준영속 상태 영속 상태인 경우, 준영속 상태가 될 수 있다. 영속 상태의 엔티티를 영속성 컨텍스트에서 분리하는 것(detached) 영속성 컨텍스트가 제공하는 기능(1차 캐시, 더티체킹 등)을 사용 못함 영속이란? 엔티티가 영속성 컨택스트에 의해 관리되는 상태를 말한다. 영속 상태로 만드는 2가지 방법 1. em.persist(entity); 를 통해 엔티티를 영속성 컨택스트에 저장 2. em.find(entity); 를 통해 데이터베이스에서 조회하는 경우, 엔티티를 영속성 컨택스트에 저장 // 영속 (db에 조회한 후, 영속성 컨텍스트에 올림) Member member = em.find( Member.class, 150L ); member.setName( "AAAAA" ); // JPA의 관리 대상에서..

반응형