Spring
JPA 기본키 매핑
기본키(primary key) 매핑하는 방법은 2가지로 직접 할당과 자동 생성이 있다. 직접 할당은 엔티티에 @Id 어노테이션만 사용해서 직접 할당한 것이다. 자동 생성은 엔티티에 @Id와 @GeneratiedValue를 추가하고 원하는 키 생성 전략을 선택하면 된다. 위 사진처럼 빨간색 부분만 작성하면 직접 할당, 노란색 부분 전체를 작성하면 자동 생성인 것이다. 자동 생성같은 경우에는 MySQL의 AUTO_INCREMENT 같은 기능으로 생성된 값을 기본키로 사용하는 것이다. (e.g. 1씩 증가하는 숫자값) 직접 할당 기본키를 애플리케이션에서 직접 할당한다. 자동 생성 대리키 사용 방식이다. IDENTITY : 기본키 생성을 DB에 위임한다. SEQUENCE : DB 시퀀스를 사용해서 기본키를 할당..
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는 데이터베이스 스키마를 자동 생성하는 기능을 지원한다. 그래서 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 준영속, 병합
영속 상태는 persist() 메서드 또는 find() 메서드를 사용할 때 1차 캐시에 저장되면서 영속성 컨텍스트가 관리하면서 된다고 했다. 준영속 상태는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)됐을 때이다. 이러면 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다. (변경 감지, 지연로딩 등) 📝 준영속 상태로 만드는 방법 1. em.detach(entity) - 엔티티를 준영속 상태로 전환 1차 캐시부터 쓰기 지연 SQL 저장소까지 해당 엔티티를 관리하기 위한 모든 정보 제거 2. em.clear() - 영속성 컨텍스트 초기화 영속성 컨텍스트를 초기화해서 해당 영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만든다. 3. em.close() - 영속성 컨텍스트 종료 영속성 컨텍스..
JPA 플러시(flush())란?
플러시(flush())란? 영속성 컨텍스트의 변경 내용을 DB에 반영하는 것 변경 감지(dirty checking)하여 수정된 엔티티에 대한 수정 쿼리를 쓰기 지연 SQL 저장소에 등록한다. 그 후 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송한다.(등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시하는 방법 em.flush() - 직접 호출 엔티티 매니저의 flush() 메서드로 영속성 컨텍스트를 강제로 플러시한다. 트랜잭션 커밋 - 플러시 자동 호출 트랜잭션만 커밋하면 DB에 반영되지 않는다. 따라서 트랜잭션을 커밋하기 전에 꼭 플러시를 호출해서 영속성 컨텍스트의 변경 내용을 DB에 반영해야 한다. JPA는 이런 문제를 예방하기 위해 트랜잭션을 커밋할 때 플러시를 자동으로 호출한다. JPQL 쿼리 실..
영속성 컨텍스트(Persistence Context) #2
🧐 영속성 컨텍스트의 특징 영속성 컨텍스트는 엔티티를 식별자 값으로 구분한다. 따라서 영속 상태는 식별자 값이 반드시 있어야 한다. (@Id로 테이블의 기본키와 매핑한 값) 영속성 컨텍스트에 엔티티를 저장하고 트랜잭션을 커밋하는 순간에 DB에 반영하는데 이것을 플러시(flush)라 한다. 1. 엔티티 조회 영속성 컨텍스트 내부에는 1차 캐시를 가지고 있다. 영속 상태 엔티티는 모두 이곳에 저장된다. // 엔티티 생성 (비영속) Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); // 엔티티를 영속 em.persist(member); 이렇게 코드를 작성했을때 다음 사진처럼 1차 캐시에 저장되게 된다. 이 상태에서..
영속성 컨텍스트(Persistence Context) #1
영속성 컨텍스트(Persistence Context)란? JPA를 이해하는데 가장 중요한 용어 "엔티티를 영구 저장하는 환경"이라는 뜻 EntityManager.persist(entity); 이 코드는 DB에 저장하는게 아니라 영속성 컨텍스트라는 곳에 저장하게된다. 즉, persist() 메서드는 엔티티 매니저로 entity를 영속성 컨텍스트에 저장한다는 의미이다. 이 영속성 컨텍스트는 엔티티 매니저를 생성할 때 만들어진다. (여러 엔티티 매니저가 같은 영속성 컨텍스트에 접근 가능) JPA는 기본적으로 트랜잭션 단위로 영속성 컨텍스트가 부여되어 사용된다. (트랜잭션을 선언하지 않았을 때, 스프링 데이터 JPA를 사용한다면 JPA repository 코드 내부에서 트랜잭션을 별도로 사용한다.) 위 처럼 J..