JPA

· 프로젝트
Version check Spring boot 2.74 MySql 8.0.33 Maven 기본 설정 1. Maven 추가 org.springframework.boot spring-boot-starter-data-jpa mysql mysql-connector-java 8.0.33 runtime mysql은 사용 버전에 따라 다르게 작성해줘야 한다. mysql에서 SELECT VERSION(); 을 입력하면 현재 사용하고 있는 버전이 출력된다. 2. application.properties 작성 # jpa common spring.jpa.show-sql=true spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect spring.jpa...
· JPA
목표 값 타입 컬렉션에 대해 알아보고 이를 코드를 통해 저장, 조회, 수정해본다. 값 타입 컬렉션 - 값 타입을 하나 이상 저장할 때 사용한다. - @ElementCollection, @CollectionTable을 사용한다. - 데이터베이스는 컬렉션을 같은 테이블에 저장할 수 없다. - 컬렉션을 저장하기 위한 별도의 테이블이 필요하다. (일대다 등의 매핑을 통해 서로 연관되도록 할 것임) @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name="MEMBER_ID") private Long id; @Column(name="USERNAME") private String username; ...(생략)... @Element..
· JPA
값 타입이란? String, int와 같은 특정 값을 저장하는 타입 - 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념으로, 단순하고 안전하게 다룰 수 있어야한다. 값 타입 공유 참조 - 임베디드 타입같은 값 타입을 여러 엔티티에서 공유할 수 있다. - 단, 여러 엔티티에서 공유하는 경우 하나의 엔티티에서 값을 변경하면 의도치않게 함께 공유했었던 엔티티에서의 값도 변하는 부작용(side effect)이 발생할 수 있다. Address address = new Address("city", "strett", "10000"); Member member = new Member(); member.setUsername("member1"); member.setHomeAddress(address); em.pers..
· JPA
임베디드 타입이란? 기본 값 타입을 모아서 만든 새로운 복합 값 타입으로 JPA에서 임베디드 타입이라고 한다. 장점 1) 재사용도 높음 2) 높은 응집도 3) 해당 값 타입만 사용하는 의미있는 메소드를 만들 수 있음(2번 장점과 연관) 4) 임베디드 타입을 포함한 모든 값 타입은,값 타입을 소유한 엔티티에 생명주기를 의존함 임베디드 타입과 테이블 매핑 - 임베디드 타입은 엔티티의 값이다. - 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블을 같다. - 객체와 테이블을 아주 세밀하게 매핑하는 것이 가능하다. - 잘 설계한 ORM 애플리케이션은 매핑한 테이블의 수보다 클래스의 수가 더 많다. @Entity @Getter @Setter public class Member { @Id @GeneratedVal..
· JPA
@Column - name : 필드와 매핑할 테이블의 컬럼 이름 [Default : 객체의 필드 이름] - insertable, updateable : 등록, 변경 가능 여부 [Default : true] - nullable(DDL) : null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다. [Default : true] - unique(DDL) : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. [Default : false] (하지만 Column에서의 unique 제약은 값에 이상한 값이 들어가기 때문에 잘 사용 안함) - columnDefinition(DDL) : 데이터베이스 컬럼 ..
· JPA
@Entity - @Entity가 붙은 클래스는 JPA가 관리, 엔티티라 한다 -JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션이 필수 주의점 - 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자) - final 클래스, enum, interface, inner 클래스에는 사용할 수 없음 - DB에 저장하고 싶은 필드에는 final을 사용하면 안됨 @Entity 속성 name - JPA에서 사용할 엔티티 이름을 지정 - 기본값 : 클래스 이름을 그대로 사용 - 같은 클래스 이름이 없으면 헤깔릴 수 있으므로 가급적 기본값 사용 @Table : 엔티티와 매핑할 테이블 지정 - name 속성을 통해 매핑할 테이블 이름을 지정해줄 수 있음 데이터베이스 스키마 자동 ..
· JPA
준영속 상태 -> 영속 상태 변환될 때 em.persist(member); em.find(Member.class, "member1"); 영속 상태 -> 준영속 상태 1) 영속 상태의 엔티티가 영속성 컨텍스트에서 분리되는 것 2) 영속성 컨텍스트가 제공하는 기능(1차 캐시, 변경 감지 등)을 사용 못함 준영속 상태로 만드는 방법 1) em.detach : 특정 엔티티만 준영속 상태로 전환 Member member = em.find(Member.class, 150L); // id가 Long타입이므로 뒤에 L붙임 member.setName("AAAAA"); em.detach(member); tx.commit(); // 아무리 커밋해도 변경 내용이 DB에 저장되지 않음 2) em.clear() : 영속성 컨텍스..
· JPA
플러시란? 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것 플러시 발생하는 생기는 일 1) 변경 감지 2) 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 3) 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리) 영속성 컨텍스트를 플러시하는 방법 1) em.flush() : 직접 호출 2) 트랜잭션 커밋 : 플러시 자동 호출 3) JPQL 쿼리 실행 : 플러시 자동 호출 영속성 컨텍스트의 쓰기 지연 SQL 저장소에 쌓여있는 쿼리들을 DB에 반영시키는 명령이다. JPQL 쿼리 실행시 플러시가 자동으로 호출되는 이유 em.persist(memberA); em.persist(memberB); em.persist(memberC); query = em.createQuery("se..
· JPA
영속성 컨텍스트의 이점 1) 1차 캐시 2) 동일성(identity) 보장 3) 트랜잭션을 지원하는 쓰기 지연(transcational write-behind) 4) 변경감지(Dirty Checking) 5) 지연 로딩(Lazy Loading) 1. 1차 캐시(엔티티 조회) Member member = new Member(); member.setId("member1"); member.setNAme("memberA"); em.persist(member); Member findMember = em.find(Member.class, "member1"); Member findMember2 = em.find(Member.class, "member2"); 위의 findMember는 member 객체가 영속 상태이기..
째로스
'JPA' 태그의 글 목록