본문 바로가기

반응형

IT/Spring JPA

JPA 성능 최적화 N+1 문제 JPA 성능상 가장 주의해야 되는 문제이다. 먼저, N +1 문제는 지연로딩, 즉시로딩 모든 경우에 발생할 수 있다. 1) 즉시로딩 N+1문제 즉시로딩의 경우 엔티티 매니저를 통해 조회할 경우 즉시 연결 데이터를 조인해서 조회하기때문에 N+1문제가 발생하지 않는다. 하지만, JPQL를 사용할 경우는 다르다. 먼저 JPQL은 즉시 로딩, 지연 로딩를 고려해서 쿼리를 실행하지 않기 때문에 아래와 같이 조회를 할 경우 문제가 발생한다. @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String name; @Embedded private Address addres.. 더보기
JPA 예외처리 및 프록시 심화 익히기 JPA 표준 예외 정리 1) 트랜잭션 롤백을 표시하는 예외 - 심각한 예외로 트랜잭션을 강제로 커밋해도 RollbackException 에러 발생 2) 트랜잭션 롤백을 표시하지 않는 예외 - 심각한 예외가 아니므로 개발자가 트랜잭션을 커밋할지 롤백할지 결정할 수 있음 JPA 표준 예외 정리 1) 트랜잭션 롤백을 표시하는 예외 - 심각한 예외로 트랜잭션을 강제로 커밋해도 RollbackException 에러 발생 2) 트랜잭션 롤백을 표시하지 않는 예외 - 심각한 예외가 아니므로 개발자가 트랜잭션을 커밋할지 롤백할지 결정할 수 있음 스프링 프레임워크의 JPA 예외 변환 서비스 계층에서 데이터 접근 계층의 구현 기술에 직접 의존하는 것은 좋은 설계가 아니듯이 예외도 같다. 서비스 계층에서 JPA 예외를 직접.. 더보기
JPA 영속성 관리 JPA를 사용하면 컨테이너가 트랜젝션과 영속성 컨텍스트를 관리해주므로 애플리케이션을 손쉽게 개발할 수 있음 BUT JPA의 내부 동작을 이해하지 못하면 문제가 발생했을 때 해결하기가 쉽지 않음 먼저, 스프링이나 J2EE 환경에서 JPA를 사용하면 컨테이너가 제공하는 전략을 따라야 한다. 제공하는 기본 전략은 바로 트랜젝션 범위의 영속성 컨텍스트 전략이다. (트랜젝션 범위 = 영속성 컨텍스트 범위) 보통 서비스계층에서 @Transactional 어노테이션으로 트랜젝션을 시작하는데 어노테이션이 있는 메소드를 호출하면 메소드 실행 전에 트랜젝션이 먼저 시작된다. 즉, 서비스단 메소드 호출 -> 트랜젝션 시작 -> 메소드 실행 -> 메소드 종료 -> 트랜젝션 커밋 (영속성 컨텍스트 플러시 발생 -> DB 반영 .. 더보기
JPA 웹 어플리케이션 개발 웹 애플리케이션 만들기 진행 순서 - 프로젝트 환경설정 (프로젝트 구조, 메이븐과 라이브러리 설정, 스프링 프레임워크 설정) - 도메인 모델과 테이블 설계 - 애플이케이션 기능 구현 프로젝트 환경설정 [JPA 사용을 위한 예외적인 설정] 1. 트랙잭션 관리자를 DatasourceTransactionManager가 아닌 JpaTransactionManager로 등록해야 됨 (JPA + JdbcTeplate + Mybatis 함께 사용가능) 2. JPA 예외를 스프링 프레임워크가 추상화한 예외로 변환하는 AOP 적용 3. 스프링 프레임워크에서 JPA를 사용하려면 스프링 프레임워크가 제공하는 엔티티 매니저 팩토리를 등록해야 됨 org.hibernate.dialect.H2Dialect true true true.. 더보기
QueryDSL 사용법 코드로 JPQL을 작성하므로 문법 오류를 컴파일 단계에서 잡을 수 있음 (Cirteria의 장점) 쉽고 간결하며 코드를 통해 쿼리문을 바로 생각해낼 수 있음. (JPQL String의 장점) 1. 필요 라이브러리 추가 com.mysema.querydsl querydsl-jpa 3.6.3 com.mysema.querydsl querydsl-apt 3.6.3 provided 2. 엔티티를 기반으로 쿼리 타입용 쿼리 클래스를 생성해야 됨. com.mysema.maven apt-maven-plugin 1.1.3 process target/generated-sources/java com.mysema.query.apt.jpa.JPAAnnotationProcessor 콘솔에서 mvn compile을 통해 output.. 더보기
생성자 제한하기 연관관계가 다양하게 연결되어 있는 엔티티의 경우 생성 메소드를 구현해서 엔티티를 만드는 것을 권장한다. 이러한 방식을 권장하는 가장 큰 이유는 바로 유지보수 때문이다. 먼저, 엔티티 한 개를 예로 들어보겠습니다. @Entity @Table(name = "orders") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY)//xtoOne 에 대한 지연로딩 설정 @JoinColumn(name = "member_id")//외래키 (조인키가 member_id 가 됨) private Member member; @OneToMan.. 더보기

반응형