경로 표현식 .(점)을 찍어 객체 그래프를 탐색하는 것을 경로 표현식이라고 한다. 경로 표현식 용어 정리 상태 필드 단순히 값을 저장하기 위한 필드 (ex : m.username) 연관 필드 연관관계를 위한 필드 (단일 값, 컬렉션 값) 단일 값 연관 필드 @ManyToOne, @OneToOne, 대상이 엔티티 (ex: m.team) 컬렉션 값 연관 필드 @OneToMany, @ManyToMany, 대상이 컬렉션 (ex: m.orders) 경로 표현식 특징 상태 필드 : 경로 탐색의 끝으로 탐색을 더 이상 하지 않는다. 단일 값 연관 경로 : 묵시적 내부 조인(inner join)이 발생하며 탐색한다. 즉, 쿼리 튜닝 시 복잡하다. 컬렉션 값 연관 경로 : 묵시적 내부 조인이 발생하며 탐색하지 않는다. ..
컨트롤러 테스트 Mocking 테스트를 위해 실제 객체를 사용하는 것처럼 테스트를 위해 만든 모형(가짜 객체)를 만들어서 사용하는 것을 Mocking이라고 한다. 모킹한 객체를 이용하면 의존성을 단절시킬 수 있어 테스트하기 좋다. Mocking은 @MockMvc를 주입 받아 사용하며, 같이 사용하는 어노테이션으로는 @WebMvcTest 와 @AutoConfigureMockMvc가 있다. MockMvc perform() 해당 메서드를 사용하면, 브라우저에서 서버에 URL을 요청(GET, POST 등)하듯 컨트롤러를 실행시킬 수 있다. 요청을 통해 MockMvcHttpServletRequestBuilder 객체를 리턴하면서 HTTP 요청 프로토콜에 관련 정보(파라미터, 헤더, 쿠키 등)을 설정할 수 있다. ..
목차 객체지향 쿼리 언어 소개 JPQL 기본 문법과 기능 페치 조인 객체지향 쿼리 언어 소개 JPA는 다양한 쿼리 방법을 지원한다. JPQL JPA Criteria QueryDSL 네이티브 SQL JDBC 직접 사용 (Mybatis, SpringJdbcTemplate 등) JPQL 소개 JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공해준다. SQL과 문법이 유사하지만 특정 데이터베이스에 의존적이지 않으며, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 등을 지원해주며, 엔티티 객체를 대상으로 쿼리를 사용한다. 가장 단순한 조회 방법 EntityManager.find() 객체 그래프 탐색 (a.getB().getC()) 검색 예시 String jpql ..
목차 기본 값 타입 임베디드 타입 (복합 값 타입) 값 타입 불변 객체 값 타입 비교 값 타입 컬렉션 예제 기본 값 타입 JPA 데이터 타입 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적 가능 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식 가능 값 타입 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체 식별자가 없고 값만 있으므로 변경 시 추적 불가 값 타입 분류 기본 값 타입 자바 기본 타입 (int, double) 래퍼 클래스 (Integer, Long) String 임베디드 타입 (복합 값 타입) 컬렉션 값 타입 기본 값 타입 생명주기가 엔티티에 의존한다. 회원을 삭제하면 나이, 필드도 함께 삭제와 같다. 기본 값 ..
목차 프록시 즉시 로딩과 지연 로딩 지연 로딩 활용 영속성 전이 : CASCADE 고아 객체 영속성 전이 + 고아 객체, 생명주기 예제 프록시 package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("..
목차 상속관계 매핑 @MappedSuperclass 예제 상속관계 매핑 관계형 데이터베이스는 상속 관계가 없고, 슈퍼타입-서브타입 관계가 있다. 상속관계 매핑이란 객체의 상속과 DB의 슈퍼타입-서브타입 관계를 매핑하는 것을 의미한다. 조인전략(각각 테이블로 변환), 단일 테이블 전략, 구현 클래스마다 테이블 전략(서브타입 테이블로 변환) 기법이 있다. 주요 어노테이션 @Inheritance(strategy=InheritanceType.XXX) JOINED : 조인 전략 SINGLE_TABLE : 단일 테이블 전략 TABLE_PER_CLASS : 구현 클래스마다 테이블 전략 @DiscriminatorColumn(name="DTYPE") : 부모클래스에서 컬럼명 설정 @DiscriminatorValue("X..
목차 연관관계 매핑 시 고려사항 3가지 다대일 일대다 일대일 다대다 예제 연관관계 매핑 시 고려사항 다중성 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany 단방향, 양방향 테이블 외래 키 하나로 양쪽 조인 가능 즉, 방향의 개념이 없다. 객체 참조용 필드가 있는 쪽으로만 참조 가능 (단방향) 양방향을 만드려면 단방향을 2개 만드는 방식 연관관계 주인 외래키를 관리하는 곳을 연관관계 주인으로 관리하자. 주인의 반대편은 단순 조회만 가능하도록 설계하는 것이 바람직하다. 다대일 [N:1] 다대일 단방향 가장 많이 사용하는 연관관계이다. 자세한 내용은 이전 포스팅을 참고하자. 다대일 양방향 외래 키가 있는 쪽이 연관관계의 주인이고 양쪽을 ..
JPA 활용 1 - 프로젝트 환경 설정 스프링 부트와 JPA를 통해 생산성 높은 웹 애플리케이션을 개발해보자. 도메인 모델 설계, 엔티티 설계, 테이블 설계를 하고 ORM으로 JPA를 매핑하는 과정을 거쳐 핵심 비즈니스 로직을 개발해보자. 프로젝트 생성 https://start.spring.io/ 에서 프로젝트 생성 plugins { id 'org.springframework.boot' version '2.6.6' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' } group = 'jpabook' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { c..