Interceptor 컨트롤러의 핸들러를 호출하기 전과 훙 요청과 응답을 참조하거나 가공할 수 있는 일종의 필터로 특정 컨트롤러의 핸들러가 실행되기 전이나 후에 추가적인 작업을 원할 때 사용 BaseHandlerInterceptor 추가 컨트롤러가 호출되기 전에 실행되는 preHandle(), 핸들러가 실행은 완료되었지만 아직 view가 생성되기 이전에 호출하는 postHandle() 재정의 public class BaseHandlerInterceptor extends HandlerInterceptorAdapter { Logger logger = LoggerFactory.getLogger(getClass()); @Override public boolean preHandle(HttpServletReques..
공통 Response Class 공통적으로 이용될 응답의 규격을 공통 클래스로 정의하여 만들기 위해 사용 공통으로 사용할 응답 클래스인 BaseResponse 클래스 생성 @Data public class BaseResponse { private BaseResponseCode code; private String message; private T data; public BaseResponse(T data) { // 성공 this.code = BaseResponseCode.SUCCESS; this.data = data; } } BaseResponse 클래스의 code에 사용할 enum인 클래스인 BaseResponseCode 생성 public enum BaseResponseCode { SUCCESS(200..
트랜잭션과 락 트랜잭션과 격리 수준 트랜잭션은 ACID라 하는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장해야 함 문제는 격리성인데 트랜잭션 간에 격리성을 완벽히 보장하려면 트랜잭션을 거의 차례대로 실행해야 함 이렇게 하면 동시성 처리 성능이 매우 나빠지므로 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나누어 정의함 ACID 원자성 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하거나 모두 실패해야 함 일관성 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 함 예) 데이터베이스에서 정한 무결성 제약 조건을 항상 만족 격리성 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리해야 ..
성능 최적화 JPA로 애플리케이션을 개발할 때 발생하는 다양한 성능 문제와 해결방안 N+1 문제 읽기 전용 쿼리의 성능 최적화 배치 처리 SQL 쿼리 힌트 사용 트랜잭션을 지원하는 쓰기 지연과 성능 최적화 N+1 문제 JPA로 애플리케이션을 개발할 때 성능상 가장 주의해야 하는 것이 N+1 문제 // 회원 엔티티 @Entity public class Member { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "member", fetch = FetchType.EAGER) // 1:N 양방향 연관관계, 즉시 로딩 private List orders = new ArrayList(); ... } // 회원의 주문 정보 @Entity @Table(na..
예외 처리 JPA 표준 예외 정리 JPA 표준 예외들은 PersistenceException의 자식 클래스이며 이 예외 클래스는 RuntimeException의 자식임 따라서 JPA 예외는 모두 언체크 예외이며 크게 2가지로 나눌 수 있음 트랜잭션 롤백을 표시하는 예외 트랜잭션 롤백을 표시하는 예외는 심각한 예외이므로 복구해서는 안 됨 이 예외가 발생하면 트랜잭션을 강제로 커밋해도 트랜잭션이 커밋되지 않고 대신에 RollbackException 예외가 발생 트랜잭션 롤백을 표시하지 않는 예외 트랜잭션 롤백을 표시하지 않는 예외는 심각한 예외가 아니므로 개발자가 트랜잭션을 커밋할지 롤백할지를 판단하면 됨 스프링 프레임워크와 JPA 예외 반환 서비스 계층에서 JPA의 예외를 직접 사용하면 JPA에 의존하게 ..
컬렉션 JPA는 자바에서 기본으로 제공하는 Collection, List, Set, Map 컬렉션을 지원하며 @OneToMany, @ManyToMany를 사용해서 일대다나 다대다 엔티티 관계를 매핑할 때, @ElementCollection을 사용해서 값 타입을 하나 이상 보관할 때 사용 자바 컬렉션 인터페이스의 특징 Collection : 자바가 제공하는 최상위 컬렉션으로 하이버네이트는 중복을 허용하고 순서를 보장하지 않음 Set : 중복을 허용하지 않는 컬렉션으로 순서를 보장하지 않음 List : 순서가 있는 컬렉션으로 순서를 보장하고 중복을 허용 Map : Key, Value 구조로 되어 있는 특수한 컬렉션 JPA와 컬렉션 하이버네이트는 엔티티를 영속 상태로 만들 때 컬렉션 필드를 하이버네이트에서 준..
트랜잭션 범위의 영속성 컨텍스트 순순하게 JS2E 환경에서 JPA를 사용하면 개발자가 직접 엔티티 매니저를 생성하고 트랜잭션도 관리해야 함 하지만 스프링이나 J2EE 컨테이너 환경에서 JPA를 사용하면 컨테이너가 제공하는 전략을 따라야 함 스프링 컨테이너의 기본 전략 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용하며 이는 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다는 뜻으로 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료하여 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근함 스프링 프레임워크를 사용하면 보통 비즈니스 로직을 사용하는 서비스 계층에서 @Transactional 어노테이션을 선언해서 트랜잭션을 시작하며 외부..
Web 확장 스프링 데이터 프로젝트는 스프링 MVC에서 사용할 수 있는 편리한 기능을 제공 설정 스프링 데이터가 제공하는 Web 확장 기능을 활성화하려면 SpringDataWebConfiguration을 스프링 빈으로 등록하면 됨 또는 JavaConfig를 사용하면 EnableSpringDataWebSupport 어노테이션을 사용 설정을 완료하면 도메인 클래스 컨버터와 페이징과 정렬을 위한 HandlerMethodArgumentResolver가 스프링 빈으로 등록됨 // 스프링 빈 등록 // JavaConfig 사용 // org.springframework.data.web.config.EnableSpringDataWebSupport 어노테이션 사용 @Configuratrion @EnableWebMvc @..