본문 바로가기

반응형

Spring/JPA & Hibernate

(24)
영속성 컨텍스트 (persistence context) 보호되어 있는 글입니다.
트랜잭션 보호되어 있는 글입니다.
Spring Boot JPA 활용1 Spring Boot JPA 활용 1 Field Injection보다 Constructor Injection을 사용하자. 스프링에서 등록된 빈을 사용하기 위한 3가지 DI(Dependency Injection) 방법을 제공한다. 필드 주입(Field Injection) 수정자 주입(Setter Injection) 생성자 주입(Constructor Injection) 그러나, Spring 3점대 이후 버전에서는 필드 주입 방식을 권장하지 않는다. 인텔리 제이에서도 필드 인젝션을 사용할 경우 다음과 같이 경고 메시지를 띄운다. 그리고, Spring 4.3 부터는 Setter 메소드 인젝션보다 생성자 인젝션 방식을 권장한다. 그 이유는 다음과 같다. 단일 책임의 원칙 위반 의존성을 주입하기가 쉽다. @Auto..
Spring Data JPA - H2 연동 Spring Boot Starer 애플리케이션으로 H2 데이터베이스 연동하는 방법 스프링 부트의 경우, persistence.xml 으로 설정을 하지 않아도 된다. Spring boot 의 auto configuration 기능으로 자동 설정을 해주기 때문이다. 단지, main/resources/application.yml 파일에 datasource 관련 정보만 세팅 해주면 된다. spring: datasource: url: jdbc:h2:tcp://localhost/~/store username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: tr..
JPQL(Java Persistence Query Language) - 2 JPQL 경로 표현식 경로 표현식이란 "."을 통해 객체 그래프를 탐색하는 것 상태 필드(state field): 단순히 값을 저장하기 위한 필드 ex> u.username 연관 필드(association field): 연관관계를 위한 필드 단일 값 연관 필드에 대한 탐색 단일 값 연관 필드란? @ManyToOne, @OneToOne, 대상이 엔티티 ex> user 와 user의 team 단일 값 연관 필드 조회 시에는 묵시적 내부 조인(inner join) 발생한다. ex> u.team.name 또한 대상 엔티티의 속성에 대한 탐색이 가능하다. ex> u.team.name List usersTeam = entityManager.createQuery("select u.team from User as u"..
JPQL(Java Persistence Query Language) - 1 JPQL(Java Persistence Query Language) JPQL은 객체지향 쿼리 언어다. 따라서 테이블을 대상으로 쿼리 하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. JPQL은 SQL을 추상화해서 특정데이터베이스 SQL에 의존하지 않는다. JPQL은 결국 SQL로 변환된다. JPQL 문법 select u from User as u where u.age > 10 엔티티와 속성은 대소문자 구분한다. User 는 엔티티 age는 속성 JPQL 키워드는 대소문자 구분하지 않아도 된다. (SELECT, FROM, where) 테이블의 이름이 아닌 엔티티 이름 사용한다. tbUser 가 아닌 User. 문법상 별칭은 필수이다. (as는 생략가능) TypeQuery, Query TypeQuery :..
JPA 쿼리 가능한 선택지 JPQL JPA Criteria QueryDSL Native SQL JDBC API, MyBatis, SpringJdbcTemplate 함께 사용 JPQL 이란? JPA를 사용하면 엔티티 객체를 중심으로 개발이 가능하다. 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다. 하지만 모든 데이터베이스의 데이터를 객체로 변환해서 검색하는 것은 불가능하다. 애플리케이션이 필요한 데이터만 데이터베이스에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요하다. 이러한 문제를 해결하기 위해 JPA는 SQL을 추상화한 JPQL이라는 객체지향 쿼리 언어를 제공한다. SQL과 문법이 유사하고, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 이 지원된다. JPQL은..
연관관계 관리 (즉시 로딩과 지연 로딩) 즉시 로딩 (EAGER) JPA 구현체는 가능하면 조인을 사용하여 SQL 한 번에 함께 조회해온다. 그러나 비즈니스 로직 상, 필요없는 연관 데이터까지 조회할 경우 비효율적임 또한, 즉시 로딩을 적용하면 예상하지 못한 SQL이 발생한다. 또한, JPQL에서 N+1 문제를 일으킨다. 따라서 가급적 지연 로딩을 사용하도록 ( 실무에서는 즉시 로딩은 쓰지 말고 지연 로딩을 적용을 고려할 것 ) @ManyToOne, @OneToOne은 기본이 즉시 로딩 이기 때문에 LAZY로 추가 설정해야 함 @OneToMany, @ManyToMany는 기본이 지연 로딩 public class JpaMain { public static void main( final String[] args ) { EntityManagerFac..

반응형