Application

    [JPA] 값 타입, 임베디드 타입, @Embeddable

    JPA의 데이터 타입을 크게 분류하면 엔티티 타입과 값 타입으로 나눌 수 있다. 엔티티 타입 @Entity로 정의하는 객체. 식별자(@Id)를 통해 지속해서 추적할 수 있음. 값 타입 int, Integer, String처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체. 엔티티 타입과는 달리 식별자가 없어 추적할 수 없다. 임베디드 타입 (복합 값 타입) 새로운 값 타입을 직접 정의해서 사용하는 타입. @Entity // 엔티티 타입 public class Member { @Id @GeneratedValue private Long id; @Embedded private Period period; } @Embeddable // 값 타입 (임베디드 타입) public class Period { priva..

    [JPA] 영속성 전이 Cascade란?, 고아 객체 제거 OrphanRemoval란?

    JPA에 대해서 헷갈렸던 개념들을 위주로 정리하는 글입니다. 자바 ORM 표준 JPA 프로그래밍 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶으면 JPA에서는 CASCADE 옵션으로 영속성 전이를 제공. 영속성 전이: 저장 CascasdeType.PERSIST @Entity public class Parent { ... @OneToMany(mappedBy = "parent", cascade = CascadeType.PERSIST) private List children = new ArrayList(); ... } private static void save(EntityManager em) { Child child1 = new Child(); Child child2 = n..

    [JPA] 프록시란? 지연로딩 vs 즉시 로딩란?

    JPA에 대해서 헷갈렸던 개념들을 위주로 정리하는 글입니다. 프록시란? 객체는 객체 그래프를 통해 연관된 객체들을 탐색한다. 그런데 객체가 데이터베이스에 저장되어 있으므로 연관된 객체를 마음껏 탐색하기는 어렵다. JPA 구현체들은 이 문제를 해결하기 위해 프록시라는 기술을 사용한다. 프록시를 사용하면 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회할 수 있다. 하지만 자주 함께 사용하는 객체들은 조인을 사용해서 함께 조회하는 것이 효과적이다. JPA는 즉시 로딩과 지연 로딩이라는 방법으로 둘을 모두 지원한다. (fetchJoin의 방법도 있음) 프록시 클래스는 실제 클래스를 상속 받아서 만들어져 실제 클래스와 겉 모양이 같음. 프록시 객체는 실제 ..

    [JPA] 영속성 컨텍스트란?

    JPA에 대해서 헷갈렸던 개념들을 위주로 정리하는 글입니다. JPA 내부 동작 원리를 알려면 영속성 컨텍스트를 알아야 함. EntityManagerFactory는 여러 스레드에서 동시에 접근해도 안전하지만, 생성하는 비용이 상당히 크다. 따라서 EntityManagerFactory에서 요청이 올 때마다 생성 비용이 거의 없는 EntityManager를 생성한다. (EntityManager는 Thread Safe하지 않아, 여러 스레드가 동시에 접근하면 동시성 문제가 발생한다 = 요청(스레드)별로 한 개 씩 할당) 이때 만들어진 EntityManager는 내부적으로 Database Connnection을 사용해서 DB를 사용한다. (참고로 EntityManager는 데이터베이스 연결이 꼭 필요한 시점까지 ..

    [Spring] IoC 컨테이너와 DI와 빈의 스코프

    IoC 컨테이너와 DI IoC란? 스프링에서는 오브젝트의 생성, 제거, 사용 및 주입 등의 작업을 개발자가 직접 애플리케이션 코드에 작성하는 대신 독립된 컨테이너가 담당한다. 이를 컨테이너가 코드 대신 (빈) 오브젝트에 대한 제어권을 가지고 있다 해서 IoC (Inversion Of Control)이라고 한다. IoC 컨테이너 vs 빈 팩토리 vs 애플리케이션 컨텍스트 스프링에서는 IoC를 담당하는 컨테이너를 빈 팩토리 또는 애플리케이션 컨텍스트라고 부르기도 한다. 단순히 오브젝트의 생성과 오브젝트 간의 런타임 관계를 설정하는 DI 관점으로 볼때는 빈 팩토리라고 하지만, 스프링 컨테이너는 단순한 DI 작업외에도 더 많은 일을 한다 그래서 더 큰 관점에서 애플리케이션 컨텍스트라고 부르기도 한다. IoC 컨..