목록Spring/Spring Data JPA (12)
Java / Spring
querydsl 을 사용하여 프로젝트를 진행하면서 이해가 되지 않았던 부분 복습을 위한 기록@Repository@Transactionalpublic class EmployRepositoryImpl extends QuerydslRepositorySupport implements EmployeeRepositoryCustom { private final JPAQueryFactory jpaQueryFactory; public EmployRepositoryImpl(EntityManager entityManager) { super(Employee.class); jpaQueryFactory = new JPAQueryFactory(entityManager); } 먼저 Query..
queryDsl 기능 중, entity 에 직접 접근하지 않고 DTO 클래스로 entity 에 대한 데이터를 조회하는 방법 현재 Entity 클래스와 DTO 클래스가 존재한다. 요구사항에 따라 Member 클래스의 username, age 라는 데이터를 별도로 조회하는 기능을 구현해야 한다고 했을 때 Entity 클래스에 직접 접근하여 jpql 을 custom 할 수 있지만 좋은 설계가 아니다. 가능한 entity 클래스의 데이터를 건드리지 않고 DTO 클래스만을 컨트롤하여 데이터를 조회하는 것이 좋은 설계 방법이다.※ 이유 :1) 성능 최적화필요한 데이터만 조회 : Entity 를 사용하면 Entity 클래스에 정의된 모든 필드를 가져오지만, DTO 를 사용하면 필요한 필드만 조회할 수 있다. 이는 데..
JPA 공부를 하다가 EntityManager 와 EntityManagerFactory 의 차이에 대해 알아 보았다 1. EntityManager 역할 : JPA 의 핵심 인터페이스로, 데이터베이스 작업을 수행하는 객체이다. EntityManager 는 엔티티의 저장, 수정, 삭제, 조회와 같은 구체적인 작업을 처리하며, 영속성 컨텍스트를 관리한다. 생명주기 : EntityManager 는 짧은 생명주기를 가지며, 주로 트랜잭션 단위로 생성되고 트랜잭션 사용이 끝나면 닫히게 된다. 일반적으로 요청이 끝나면 EntityManager 도 닫혀야 한다. 사용 예 : 한번의 데이터베이스 트랜잭션 동안 엔티티의 상태를 관리하거나 쿼리를 실행할 때 사용된다. 2. EntityManagerFactory역할 : Ent..
- 특정 쿼리를 사용자가 직접 정의하여 이름을 부여하고 다른 클래스에서 해당 쿼리문을 입력하지 않고 사용자가 부여한 이름을 호출하여 쿼리를 수행 할 수 있다. (쿼리의 재활용) Named 쿼리 장점 - 정적 쿼리미리 정의해서 이름을 부여해두고 사용할 수 있다애플리케이션 로딩 시점에 쿼리를 검증 할 수 있다. (런타임 오류 확인 가능)@NamedQuery 생성name = "사용자 정의 쿼리 이름"query = "실제 동작 쿼리"@Entity@NamedQuery(name = "Member.findByUsername", query = "SELECT m FROM Member m WHERE m.username = :username ")public class Member { @NamedQuery 적용 ..

JPQL 이란? (Java Persistence Query Language)JPA 는 SQL을 추상화한 JPQL 이라는 객체 지향 쿼리 언어를 제공 한다.SQL과 문법이 유사하고, SELECT, FROM, WHERE, GROUP BY, HAVIG, JOIN 지원JPQL은 엔티티 객체를 대상으로 쿼리SQL은 데이터베이스(DB) 테이블을 대상으로 쿼리try { List result = em.createQuery( "select m From Member m where m.username like '%kim%", Member.class ).getResultList(); tx.commit();} 위의 JPQL 문법 중 Member 는 @Entity 속성이다.Member 는 객..

** 값 타입의 분류1) 기본 값 타입2) 임베디드 타입3) 컬렉션 값 타입 1 기본 값 타입 (String name, int age 등) = DB 이상현상- 생명주기를 엔티티에 의존한다. (= 회원을 삭제하면 이름, 나이 필드도 함께 삭제)- 값 타입은 공유하면 안된다. (= 회원 이름 변경 시, 다른 회원의 이름도 함께 변경되면 안된다) 2 임베디드(복합) 값 타입- 새로운 값 타입을 직접 정의 할 수 있다.- JPA는 임베디드 타입이라고 한다.- 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 한다.- int, String 과 같은 값 타입 - Period 와 Address 객체에 하위 인스턴스들이 Member 엔티티를 참조하기 위해 Member 엔티티에 workPeriod 와 home..

1. 영속성 전이 란?- 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함꼐 영속 상태로 만들고 싶을 때 사용한다. (extends 아님 주의)ex) 부모 객체의 데이터를 영속성 컨테스트에 저장 할 때, 자식 데이터 객체도 함께 영속상태에 저장 된다. ** Test (CASCADE TYPE.ALL) : 먼저 Parent 와 Child 클래스를 각각 생성하고 Child 클래스 속성을 List 를 통해 Parent 클래스와 매핑 + cascade 선언 하였다. code) child 클래스 -> Parent 클래스 (cascade)@Entitypublic class Parent { @Id @GeneratedValue private Long id; private String name; ..

◎ 상속관계 매핑에는 크게 세 가지의 전략이 존재한다.*** 조인 전략 (기본적으로 사용하는 전략) ** 단일 테이블 전략 (데이터 처리가 단순할 때 추천) * 구현 클래스 테이블 전략 (사용 하지 않는 것을 추천)객체 지향에는 아래와 같이 클래스끼리 상속관계 존재한다.위의 그림은 Item을 슈퍼타입으로 Album, Movie, Book을 서브타입으로 모델링한것이다. 슈퍼타입과 서브타입이라는 논리 모델을 실제 물리 모델(테이블)로 구현하는 방법은 3가지다.각각 테이블로 변환 -> 조인 전략통합 테이블로 변환 -> 단일 테이블 전략서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 관계형 데이터베이스에는 상속 관계가 없다. 1. JOIN 전략 JOIN 전략의 장점 테이블 정규화외래키 참조 무..

** 연관관계 다중성 종류 (+ @애노테이션) 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @MayToMany (실무에서 사용 하지 않음) ** 연관관계 □ 테이블 (TABLE)외래키(FK) 하나로 양쪽 조인(JOIN) 가능사실 방향이라는 개념이 없다□ 객체 (Object)참조용 필드가 있는 쪽으로만 참조 가능한쪽만 참조하면 단방향 이다.양쪽이 서로 참조하면 양방향이 된다.** (개념) 연관관계의 주인- 테이블은 외래키(FK) 하나로 두 테이블이 연관관계를 맺는다.- 객체 양방향 관계는 A->B, B->A 처럼 참조가 2군데 이다.- 객체 양방향 관계는 참조가 2군데 있다. 둘 중 테이블의 외래키를 관리할 곳을 지정해야한다.- 연관관계의 주인 : 외..

1. [테이블 연관관계]- 테이블 연관관계에서는 FK (TEAM_ID) 하나로 TEAM 과 MEMBER 의 서로 연관 관계를 모두 알 수 있다. 2. [양방향 객체 연관관계] = List 초기화- Team 클래스에 List 를 넣어줘야 서로 관계를 모두 알 수 있다@Id @GeneratedValue@Column(name = "TEAM_ID")private Long id;private String name;@OneToMany // 일대다 private List members = new ArrayList();@OneToMany(mappedBy = "team") // 일대다private List members = new ArrayList();(mappedBy = "team") : 해당 코드를 추가 하였다. ..