패키지 사이에 의존성을 낮추는 방법 절차지향 로직 사용할 패키지에 인터페이스를 만들고 구현은 도메인에 해당하는 패키지에서 구현 도메인 이벤트 퍼블리싱 도메인 이벤트 퍼블리싱이란? 패키지 사이에 결합도를 낮추기 위해 사용 도메인이 이벤트를 생성하면 이벤트 디스패처가 리스너에게 전달 어떤 동작 이후에 연관된 동작을 요청할 때 사용 ex) 식사를 마친 테이블에 계산이 끝나면 테이블 상태를 변경한다. 구현 방법 Spring Framework에서 제공하는 기능으로 구현하는 방법 Spring Data JPA에서 제공하는 기능으로 구현하는 방법 Spring Data JPA의 이벤트 구현 예제 & 전체 소스 Publisher // 이벤트로 전달할 형식 public class SpringEventPublisher { p..
JPA의 장점 객체에 적절한 책임을 할당하는 객체지향적 개발이 가능하다. 새로운 필드가 추가될 때마다 쿼리를 수정해야 하는 문제가 발생하지 않는다. 생성 방식 create: 기존 테이블 삭제 후 다시 생성 (개발) create-drop: create와 같으나 종료 시점에 테이블 drop (개발) update: 변경된 부분만 반영 (테스트, 개발) validate: entity와 table이 정상 매핑되었는지만 확인 (테스트, 운영) none: 사용하지 않음 (스테이징, 운영) 데이터베이스 스키마 생성 방식 설정 // application.properties spring.jpa.hibernate.ddl-auto={생성_방식} 스키마 자동 생성을 위한 Entity class 작성법 @Entity // (1)..
프록시란? 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데 이것을 지연 로딩이라 한다. 지연 로딩 기능을 사용하기 위해 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라 한다. 프록시 사용 엔티티를 실제 사용하는 시점까지 데이터베이스 조회를 미루고 싶으면 EntityManager.getReference() 메소드를 사용하면 된다. Member member = em.getReference(Member.class, "Member1"); PersistenceUnitUtil.isLoaded(Object entity) 메소드를 사용하면 프록시 인스턴스의 초기화 여부를 확인할 수 있다. boolean isLoad = em.getEnti..
상속 관계 매핑 1. 조인전략 Joined Strategy: 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략 @Entity @Inheritance(strategy = InheritanceType.JOINED) //조인 전략 사용 @DiscriminatorColumn //컬럼명:dtype public abstract class Item { @Id @GeneratedValue @Column(name = "ITEM_ID") private Long id; private String name; private int price; } @Entity //@DiscriminatorValue("A") //DiscriminatorValue를 지정하지 않..
객체의 참조와 테이블의 외래 키 매핑 방향 방향은 객체에만 존재하고 테이블 관계는 항상 양방향이다. 단방향 두 관계 중 한 쪽만 참조하는 것 양방향 두 관계 양쪽 모두 서로 참조하는 것 다중성 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:N)이 있다. 연관관계의 주인 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야 한다. 연관관계의 주인은 외래 키의 위치와 관련해서 정한다. ex) 회원과 팀 관계에서 외래 키가 있는 "다" 쪽인 회원이 연관관계의 주인이 된다. 객체 연관관계와 테이블 연관관계의 차이 객체는 참조(주소)로 연관관계를 맺는다. ex) a.getB().getC() 테이블은 외래 키로 연관관계를 맺는다. ex) A JOIN B 참조를 사용하는 객체의 연관관계는 단방향..
객체와 테이블 매핑 @Entity @Entity가 붙은 클래스를 엔티티라 부른다. 테이블과 매핑할 클래스에 붙는다. 기본 생성자(파라미터가 없는 생성자)는 필수다. @Table 엔티티와 매핑할 테이블을 지정 ex) Table(name="MEMBER") 생략하면 엔티티 이름을 테이블 이름으로 사용한다. 기본 키 매핑 직접 할당 전략 : 기본 키를 애플리케이션에서 직접 할당한다. @Id @Column(name = "Id") private String id; Board board = new Board(); board.setId("id1");//기본 키 직접 할당 em.persist(board); 자동 생성 전략 : 대리 키 사용 방식 IDENTITY : 기본 키 생성을 데이터베이스에 위임 ex) MySQL @..
Entity Manager Factory Entity Manager를 만드는 공장 만드는 비용이 크기 때문에 애플리케이션 전체에서 하나만 만들어서 공유하도록 설계 Entity Manager 만드는 비용이 거의 들지 않는다. 여러 스레드가 동시에 접근하면 동시성 문제가 발생하므로 스레드 간에 절대 공유하면 안 된다. 영속성 컨텍스트(persistence context) Entity Manager를 생성할 때 하나 만들어진다. Entity Manager를 통해 영속성 컨텍스트에 접근하고 관리한다. 영속성 컨텍스트는 Entity를 식별자 값으로 구분하기 때문에 식별자 값이 반드시 있어야 한다. transaction을 commit하는 순간 영속성 컨텍스트에 저장된 entity를 데이터베이스에 반영한다.(flus..