프록시 EntityManager에는 getReference()라는 메서드가 있다. find()와 같이 객체를 조회하는 메서드이지만, getReference()는 반환 타입이 Proxy이다. Proxy는 보통 전달하는 역할을 할 때 자주 등장하는 단어인데 여기서도 같은 의미로 사용된다. Proxy 객체는 실제 객체와 같은 모양에 Id 값만 들어있는 빈 객체이다. 프록시 객체를 사용하는 이유 연관관계 매핑에서 객체를 조회하면 연관된 객체도 같이 조회하게 된다. 이때 연관된 객체는 사용하지 않더라도 같이 조회되는 문제가 있다. 이런 문제를 해결하기 위해서 실제 연관객체를 사용하는 시점에 쿼리를 보내 데이터를 넣어주게되고, 연관 객체를 가져오기 전까지는 null이 아닌 빈 껍데기 객체를 넣어두어 NPE도 방지하..
영속성 전이 연관관계 매핑에서 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 영속 상태로 만드는 방법이다. 연관관계 어노테이션의 cascade 옵션을 통해 설정할 수 있으며, 연관관계 매핑과는 무관하게 단순히 영속의 편리함을 제공하는 기능이다. Member와 이 cascade 되어있다면, Member가 영속될 때 Team도 같이 영속된다. 즉, Team이 삭제되면 Member도 삭제된다. 편리한 기능이지만, 안전성을 위해 REMOVE는 지양하고, PERSIST와 ALL 옵션을 권장한다. 고아 객체 고아 객체란 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 뜻하며, 자동으로 삭제된다. 예를 들어 Team의 MemberList에서 Member를 삭제하면 삭제된 Member 객체는 고아 객체가 되며 de..
영속성 컨텍스트는 모든 객체가 아닌 DB 테이블과 연결되는 객체인 엔티티만 관리한다. 오늘은 엔티티를 사용하는 방법과 Spring을 사용하지 않고 순수 자바에서의 JPA 세팅 방법에 대해 정리해보겠다. JPA 세팅 Hibernate Dependency 원하는 버전의 JPA 의존성을 추가해준다. META-INF 폴더 하위에 persistence.xml을 생성해서 하이버네이트 설정을 적용할 수 있다. 이때 설정 정보에 있는 persistence-unit의 name을 통해 EntityManagerFactory 생성 시 적용할 persistence 설정을 주입할 수 있다. EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); 스키..
영속성 컨텍스트 JPA의 내부 동작을 이해하기 위해서는 가장 먼저 영속성 컨텍스트가 무엇인지에 대해 알아야한다. 영속성 컨텍스트는 객체를 관리하고 최종적으로 쿼리를 생성해서 DB에 전달하는 논리 영역이며, EntityManager가 작업을 처리하는 동안 사용되는 메모리 영역이다. EntityManager는 JPA 스펙의 EntityManagerFactory를 통해 생성할 수 있고, 생성된 EntityManager를 통해서 DB에 저장할 객체인 엔티티를 관리할 수 있다. 이때 EntityManger는 영속성 컨텍스트에 올라간 엔티티만 관리하기 때문에 관리할 엔티티를 꼭 영속해주어야하며, 영속 방법은 perist() 메서드를 호출하는 방법이 있으며, find()를 통해 조회된 엔티티도 1차 캐시에 저장되여 ..
JPA Java Persistence Application Programming Interface의 약자로 java에서 객체를 DB에 저장하기 위한 프로그래밍 명세라고 이해하면 된다. JPA는 Java 진영의 ORM 표준으로 인터페이스이기 때문에 실제 구현된 것이 아닌 어떻게 구현되어야 하는지가 명세되어있을 뿐이다. 따라서 실제 사용을 위해서는 JPA의 구현체를 사용해야하는데 보편적으로 가장 많이 쓰이는 구현체가 바로 Hibernate이다. ORM Object Relactional Mapping의 약자로 객체를 관계적으로 매핑하는 기술로 객체와 관계형 데이터베이스의 패러다임 불일치 문제를 해결하고 기존의 매퍼 방식(JDBC Template, MyBatis 등 직접 SQL을 작성하는 방식) 보다 더 객체지..
spring boot 실행 시 data.sql로 데이터 세팅하기 schema.sql, data.sql 파일을 resource 디렉토리의 루트 경로에 작성하면 ScriptUtils에 의해 sql script를 실행하게된다. 기본 이름은 schema, data이지만 @Sql을 사용하면 다른 이름의 .sql 파일을 지정해줄 수 있다. 위 과정이 스프링 부트 2.4 버전까지는 하이버네이트의 ddl-auto 설정대로 테이블을 생성하게 된 후 실행되었다. 하지만 2.5 버전부터 스크립트가 먼저 실행된 후 JPA ddl-auto가 실행된다. 그렇기 때문에 ddl-auto가 create로 되어있어 data.sql로 insert한 데이터가 다 지워지게 될 수 있다. 이런 경우 defer-datasource-initial..