💻
Albert's Til
GitHub
  • 매일매일 조금씩 성장하기
    • README
    • CS
      • Network
      • HTTP
        • NO-CACHE
      • 오류 코드
      • ORM 도구
      • Design Pattern
        • CQRS Pattern
          • Event Sourcing and CQRS pattern
        • Builder Pattern
    • DB
      • MySQL
        • Timeline
        • Pagination
        • Index
        • Database Performance Optimization Strategies
        • B+ tree
        • MySQL Connectors VS MySQL Shell(Scripting) VS MySQL Workbench
        • MySQL Storage Engine Architecture
      • Normalization & Denormalization
      • JPA
        • @Transactional
        • Why JPA?
        • About JPA
        • N+1 Issue
        • Index
        • ElementCollection&CollectionTable
        • orphanRemoval
        • CascadeType
        • Use Subselect
        • Dynamic Instance Creation
        • Paging
        • Order
        • Spefication
        • mappedBy
      • MongoDB
        • ObjectId
      • Why MySQL?
      • ACID properties of transactions
      • Between JPA and JDBC
      • Identifiers in Hibernate/JPA
    • Java
      • Jackson de/serialize
      • Collections.singletonList() vs List.of()
      • Manage dependencies in Gradle
      • Logging Level
      • Bean Validation
      • JVM Internals
        • Threads
          • Frame
        • Shared Between Threads
          • Classloader
            • Class Loader Hierarchy
            • Loading Linking Initialization
      • Java Collection Framework
      • Annotation
      • Generic
      • 디미터 법칙
    • Spring
      • Caching
      • Spring Integration Overview
        • ThreadPollTaskExecutor
        • Messaging Bridge
        • Channel Adapter
        • Poller
        • Configuration and @EnableIntegration
        • Message Endpoints
        • Message Channels
      • HATEOAS
      • @Autowired vs Constructor Dependency Injection
      • Spring Security
        • JWT 토큰 사용한 인가
        • OAuth 2 Login
        • OAuth 2 인증
        • 인가
        • 인증
        • PasswordEncoder
      • IoC Container
      • Filter,Interceptor,AOP,Argument Resolver
      • Spring Annotation
      • About Spring
    • Kafka
      • Error Channel
    • Infra
      • Scale Up || Scale Out
      • Docker
        • Dockerfile
        • Docker Hub Deploy
        • Command
      • Cloud 유형
        • Infrastructure as a Service
        • Platform as a Service
        • Software as a Service
      • 무중단 배포
        • 엔진엑스(Nginx)
      • 코드 자동 배포
        • Technical
      • AWS EC2
        • PEM(Privacy Enhanced Mail) 키
      • AWS RDS
      • AWS S3
    • CodeSquad
      • Spring Boot Project 1주차 회고
      • Spring Boot Project 2주차 회고
      • Spirng Boot Project 3주차 회고
      • Spring Boot Project 4주차 회고
    • Foody Moody 프로젝트
      • Query Performance Comparison
      • HeartCount Asynchronous Issue
      • DeferredResult
      • ResponseBodyEmitter
      • SseEmitter (Spring)
      • Server-Sent Events (SSE)
      • 기술 스택 적용 이유
      • NO-CACHE(HTTP)
      • Transactional
    • DDD
      • AggregateId
    • Test
      • RestAssured
    • Coding and Algorithmic Problems
      • 819. Most Common Word
      • 344. Reverse String
      • 125. Valid Palindrome
      • 937. Reorder Data in Log Files
    • Node
      • Async... Await...
      • Custom Transactional Decorator Challenger
    • Python
      • Python Basic Grammar
        • Comments and Input/Output
        • Variable
        • Data type
        • Operations and syntax
        • List,Tuple,Dictionary,Set
        • Function
        • Conditional statement
        • Loop
    • HTML
      • HTML Basic
      • HTML Basic Tags
      • HTML Form Tags
      • HTML Table Tags
    • CSS
      • CSS Basic
      • CSS Practice
Powered by GitBook
On this page
  • 스펙
  • Spring Data JPA
  • JPA 정적 메타 모델
  • 정적 메타 모델의 용도:
  • 스펙 조합
  • 스펙 인터페이스는 and와 or 메서드 제공
  • and()
  • or()
  • not()
  • where()
  • 리포지터리/DAO 에서 스펙 사용하기
  • 예시
  • 스펙 조합을 위한 스펙 빌더 클래스
  • Reference

Was this helpful?

  1. 매일매일 조금씩 성장하기
  2. DB
  3. JPA

Spefication

스펙

스펙

  • 애그리거트가 특정 조건을 충족하는지를 검사할 때 사용하는 인터페이스

Public interface Speficiation<T> {
    public boolean isSatisfiedBy(T agg)
}
  • agg in 리포지터리

    • 애그리거트 루트

  • agg in DAO

    • 검색 결과로 리터할 데이터 객체

Spring Data JPA

  • Specification 인터페이스

public interface Specification<T> extends Serializable {
    // not,where,and,or 메서드 생략
    @Nullable
    Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb);
}

JPA 정적 메타 모델

  • JPA(Java Persistence API)에서 정적 메타 모델은 엔티티 클래스에 대한 메타 정보를 나타내는 Java 클래스입니다. 이 정적 메타 모델을 사용하면 컴파일 타임에 엔티티 속성을 안전하게 참조할 수 있고, 오타나 잘못된 속성 참조로 인한 런타임 오류를 방지할 수 있습니다.

  • 정적 메타 모델은 @StaticMetamodel 애너테이션을 이용해서 관련 모델을 지정한다.

  • 메타 모델 클래스는 모델 클래스의 이름 뒤에 '_'을 붙인 이름을 갖는다.

  • 정적 메타 모델 클래스는 대상 모델의 각 프로퍼티와 동일한 이름을 갖는 정적 필드를 정의한다. 이 정적 필드는 프로퍼티에 대한 메타 모델로서 프로퍼티 타입에 따라 SingularAttribute, ListAttribute 등의 타입을 사용해서 메타 모델을 정의한다.

정적 메타 모델의 용도:

  1. 안전한 속성 접근: 정적 메타 모델을 사용하면 컴파일 타임에 속성에 대한 오타나 잘못된 참조를 확인할 수 있습니다. IDE의 자동 완성 기능을 활용하여 올바른 속성을 선택하고, 컴파일러의 오류 검사를 통해 잘못된 속성 접근을 방지할 수 있습니다.

  2. 쿼리 작성: 정적 메타 모델은 JPA 쿼리 작성에 사용됩니다. 예를 들어, JPA Criteria API나 JPQL에서 엔티티 속성을 사용하는 경우 정적 메타 모델을 활용하여 안전하게 속성에 접근할 수 있습니다. 이는 동적인 문자열로 속성을 참조하는 것보다 컴파일 타임에 오류를 잡을 수 있으며, 유지보수와 디버깅에 도움이 됩니다.

  3. 프레임워크와 툴의 지원: JPA 구현체나 다른 관련 도구들은 정적 메타 모델을 활용하여 다양한 기능과 최적화를 제공합니다. 예를 들어, 쿼리 성능 향상을 위한 인덱스 생성이나 프로젝션 쿼리 등에서 정적 메타 모델을 활용할 수 있습니다.

스펙 조합

스펙 인터페이스는 and와 or 메서드 제공

public interface Sepcification<T> extends Serializable {
    ...생략
    
    default Specification<T> and(@Nullable Specification<T> other) { ... }
    default Specification<T> or(@Nullable Specification<T> other) { ... }
}

and()

  • 두 스펙을 모두 충족하는 조건을 표현하는 스펙을 생성

or()

  • 두 스펙 중 하나 이상 충족하는 조건을 표현하는 스펙을 생성

not()

  • 조건을 반대로 적용할 때 사용한다

where()

  • 스펙 인터페이스의 정적 메서드로 null을 전달하면 아무 조건도 생성하지 않는 스펙 객체를 리턴하고 null이 아니면 인자로 받은 스펙 객체를 그대로 리턴한다.

// Where 사용하지 않으면
Specification<OrderSummary> spec = 
    nullableSpec == null ? otherSpec : nullableSpec.and(otherSpec);

// Where 문으로 NullPointerException 방지
Specification<OrderSummary> spec = 
    Specification.where(createNullableSpec()).and(createOtherSpec());

리포지터리/DAO 에서 스펙 사용하기

예시

Public interface OrderSummaryDAO extends Repository<OrderSummary,String>{
    List<OrderSummary> findAll(Specification<OrderSummary> spec)
}

스펙 조합을 위한 스펙 빌더 클래스

if와 각 스텍을 조합하는 코드가 섞여 있어 실수하기 좋고 복잡한 구조를 갖는다. 스펙 빌더를 만들어 사용할 수 있다.

Specification<MemberData> spec = SpecBuilder.builder(MemberData.class)
    .isTrue(...,() -> ...)
    .isHasText(...,() -> ...)
    .toSpec();

Reference

Last updated 1 year ago

Was this helpful?

도메인 주도 개발 시작하기: DDD 핵심 개념 정리부터 구현까지