Spring/JPA

    JPA 프록시 (즉시로딩, 지연로딩)

    JPA 프록시 (즉시로딩, 지연로딩)

    Member를 조회할 때 Team도 함께 조회해야 할까? 만약 Member와 Team이 연관관계로 맺어져있다. 이 때, Member를 조회하면 JPA는 Team까지 조회하게 된다. 위 코드처럼 member와 team을 함께 출력하거나 사용하는 메서드가 있을때는 전부 조회하는 것이 좋다. 하지만 member만 사용하는 메서드라면 굳이 team까지 조회해야 할까? 이것은 불필요한 성능을 사용하게 되는 것이다. 지연로딩 LAZY 사용해서 프록시로 조회 그렇다면 불필요한 성능을 피하기위해서 전부 조회하지않으려면 어떻게 해야할까? 바로 지연로딩 LAZY를 사용하는 것이다! Member와 Team이 다대일 관계로 맺어져있는데 이때 FetchType.LAZY 를 사용하는 것이다. 위 사진처럼 동작을 수행한다고 했을때..

    JPA 객체 생성 방법

    JPA 객체 생성 방법

    객체를 생성할 때는 다음 3가지 방법 중 사용하게 된다. 생성자 정적 팩토리 메서드 Builder 패턴 엔티티 상황에 따라서 이 중 한가지를 선택하고, 파라미터에 객체 생성에 필요한 데이터를 다 넘기는 방법을 사용한다. 정적 팩토리 메서드와 Builder패턴을 사용할 때는 생성자를 private 처리를 하는데 JPA가 사용을 해야한다면 protected로 처리한다. 객체 생성이 간단하면 단순 생성자를 사용하지만, 의미가 있거나 복잡하다면 나머지 방법을 사용하는 것이 좋다. 엔티티를 만들 때는 외부에서 값을 쉽게 변경할 수 없게 @Setter 를 사용하지 않는다. Setter는 의도가 분명치 않고, 변경하면 안되는 중요한 값임에도 변경가능한 값으로 착각할 수 있다. (안전성 보장x) 그러면 어떻게 값을 변..

    JPA 연관관계 매핑 기초

    JPA 연관관계 매핑 기초

    엔티티는 다른 엔티티와 연관관계가 대부분 있다. 그럴 경우 어떻게 표현할까? 단방향과 양방향이 있다. 회원 → 팀 ( 회원은 팀을 참조한다 ) 팀 → 회원 ( 팀은 회원을 참조한다 ) 위의 두 가지 관계에서 하나만 성립하는 경우 단방향 관계, 두 가지 관계 모두 참조하면 양방향 관계라고 한다. 단방향 연관관계 객체 연관관계에서는 단방향 관계이기에 member → team 조회는 가능하지만 반대의 경우는 할 수 없다. 그래서 Member.team필드를 통해서 팀을 알 수 있지만, 반대로 팀은 회원을 알 수 없다. 테이블 연관관계에서는 양방향 관계이기에 양 쪽 조회가 가능하다. MEMBER 테이블의 TEAM_ID 외래키로 MEMBER JOIN TEAM 과 TEAM JOIN MEMBER 둘 다 가능하다. 객체..

    JPA 기본키 매핑

    JPA 기본키 매핑

    기본키(primary key) 매핑하는 방법은 2가지로 직접 할당과 자동 생성이 있다. 직접 할당은 엔티티에 @Id 어노테이션만 사용해서 직접 할당한 것이다. 자동 생성은 엔티티에 @Id와 @GeneratiedValue를 추가하고 원하는 키 생성 전략을 선택하면 된다. 위 사진처럼 빨간색 부분만 작성하면 직접 할당, 노란색 부분 전체를 작성하면 자동 생성인 것이다. 자동 생성같은 경우에는 MySQL의 AUTO_INCREMENT 같은 기능으로 생성된 값을 기본키로 사용하는 것이다. (e.g. 1씩 증가하는 숫자값) 직접 할당 기본키를 애플리케이션에서 직접 할당한다. 자동 생성 대리키 사용 방식이다. IDENTITY : 기본키 생성을 DB에 위임한다. SEQUENCE : DB 시퀀스를 사용해서 기본키를 할당..

    JPA 필드와 컬럼 매핑

    JPA 필드와 컬럼 매핑

    📝 필드와 컬럼 매핑 종류 @Column : 컬럼을 매핑 @Enumerated : 자바의 enum 타입을 매핑 @Temporal : 날짜 타입을 매핑 @Lob : BLOB, CLOB 타입을 매핑 @Transient : 특정 필드를 DB에 매핑하지 않음 🧐 @Column 은 무엇인가? 객체 필드를 테이블 컬럼에 매핑하는 어노테이션이다. @Column 속성 name : 필드와 매핑할 테이블의 컬럼 이름. 기본값은 객체의 필드 이름 @Column(name = "name") private String username; //생성된 DDL create table 테이블명 ( name varchar(255) not null, ... ) insertable : 엔티티 저장 시 이 필드도 같이 저장. 기본값은 true...

    JPA 데이터베이스 자동 생성

    JPA 데이터베이스 자동 생성

    JPA는 데이터베이스 스키마를 자동 생성하는 기능을 지원한다. 그래서 DB에 미리 만들어 놓지 않아도 JPA를 통해 코드를 작성해서 자동으로 생성시켜줘서 편하기도 하다. 클래스의 매핑 정보를 보면 어떤 테이블에 어떤 컬럼을, 어떤 제약조건 등을 사용하는지 알 수 있다. JPA는 매핑 정보와 DB 방언을 사용해서 DB 스키마를 생성한다. 📝 사용 방법 // xml 방식 - persistence.xml // application.properties 방식 spring.jpa.hibernate.ddl-auto=옵션 // application.yml 방식 spring: jpa: hibernate: ddl-auto: 옵션 이 속성을 추가하면 애플리케이션 실행 시점에 DB 테이블을 자동으로 생성한다. 📝 속성 옵션 ..

    JPA 영속성 관리 - 정리

    엔티티 매니저 팩토리와 엔티티 매니저 영속성 컨텍스트 소개 영속성 컨텍스트 특징 플러시란? 준영속 상태와 병합 JPA 영속성 관리의 마지막 글이다. 이번 장에서는 위 내용에 대해 정리를 해보자. EntityManagerFactory와 EntityManager 엔티티 매니저는 엔티티 매니저 팩토리에서 생성한다. 자바를 직접 다루는 J2SE 환경에서는 엔티티 매니저를 생성하면 그 내부에 영속성 컨텍스트도 같이 생성된다. 엔티티 매니저를 통해 영속성 컨텍스트를 접근할 수 있다. 영속성 컨텍스트 (Persistence Context) 애플리케이션과 DB 사이에서 객체를 보관하는 가상 DB같은 역할을 한다. 영속성 컨텍스트 덕분에 1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 변경 감지(Dirty C..

    JPA 준영속, 병합

    JPA 준영속, 병합

    영속 상태는 persist() 메서드 또는 find() 메서드를 사용할 때 1차 캐시에 저장되면서 영속성 컨텍스트가 관리하면서 된다고 했다. 준영속 상태는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)됐을 때이다. 이러면 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다. (변경 감지, 지연로딩 등) 📝 준영속 상태로 만드는 방법 1. em.detach(entity) - 엔티티를 준영속 상태로 전환 1차 캐시부터 쓰기 지연 SQL 저장소까지 해당 엔티티를 관리하기 위한 모든 정보 제거 2. em.clear() - 영속성 컨텍스트 초기화 영속성 컨텍스트를 초기화해서 해당 영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만든다. 3. em.close() - 영속성 컨텍스트 종료 영속성 컨텍스..