설치:

https://www.elastic.co/kr/elasticsearch

 

Elasticsearch: 공식 분산형 검색 및 분석 엔진 | Elastic

Elasticsearch는 속도, 수평적 확장성, 안정성 및 간편한 관리를 위해 설계된 선도적인 분산형 RESTful 무료 오픈 소스 검색 및 분석 엔진입니다. 무료로 시작하세요....

www.elastic.co

1. Elasticsearch

Elasticsearch는 분산형 검색 및 분석 엔진으로, JSON 기반의 문서들을 색인하여 고속 검색 및 데이터 분석을 제공합니다.

설치 및 실행

  • Elastic의 공식 웹사이트에서 Elasticsearch를 다운로드하고 설치합니다.
  • elasticsearch.yml 설정 파일을 편집하여 필요한 설정을 변경합니다.
  • 터미널에서 bin/elasticsearch를 실행하여 Elasticsearch 서버를 시작합니다.

2. Logstash

Logstash는 다양한 소스에서 로그 및 이벤트 데이터를 수집하고 변환한 다음 Elasticsearch로 전달하는 역할을 합니다.

설치 및 실행

  • Elastic의 공식 웹사이트에서 Logstash를 다운로드하고 설치합니다.
  • logstash.conf와 같은 설정 파일을 만들어 다음과 같이 구성합니다
input {
  file {
    path => "/path/to/your/logfile.log"
    start_position => "beginning"
  }
}
filter {
  # 필요한 경우 필터 설정을 추가
}
output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "log-index"
  }
}

3. Spring

Spring 애플리케이션에서 Elasticsearch와 통합하는 데는 spring-data-elasticsearch를 사용할 수 있습니다.

설치 및 사용

  • Spring 프로젝트에 spring-data-elasticsearch 의존성을 추가합니다.
<!-- Maven -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  <version>3.0.0</version>
</dependency>

 

application. yml

spring:
  elasticsearch:
    uris: http://localhost:9200

 

EntitiyClass

@Document(indexName = "your-index")
public class YourEntity {
  @Id
  private String id;
  private String field1;
  // 필드 추가
}

public interface YourEntityRepository extends ElasticsearchRepository<YourEntity, String> {
  // 맞춤형 쿼리 메소드 정의
}

' > ElasticSearch' 카테고리의 다른 글

log stash란?  (0) 2024.05.04
엘라스틱 서치 란?  (0) 2024.05.04

Logstash는 Elastic Stack의 일부로, 로그, 이벤트 및 기타 데이터 소스에서 데이터를 수집하고 변환하며 다양한 목적지로 전달하는 오픈 소스 데이터 처리 파이프라인입니다. Logstash를 통해 여러 소스에서 데이터 입력을 받아 이를 실시간으로 처리하여 Elasticsearch 같은 데이터 저장소로 전송할 수 있습니다.

Logstash의 주요 기능

  1. 입력(Input):
    • 파일, 데이터베이스, 메시지 큐, 네트워크 등 다양한 소스에서 데이터를 수집할 수 있습니다.
    • 예를 들어 파일에서 로그를 읽어오는 file 플러그인, 메시지 큐 시스템인 Kafka에서 읽어오는 kafka 플러그인 등이 있습니다.
  2. 필터(Filter):
    • 수집한 데이터를 변환, 파싱, 정규화 등의 작업을 통해 원하는 형식으로 변환할 수 있습니다.
    • 예를 들어 grok 필터는 정규 표현식을 사용하여 로그 데이터를 파싱하고 구조화된 데이터를 생성합니다.
  3. 출력(Output):
    • 처리된 데이터를 Elasticsearch, 파일, 데이터베이스, 메시지 큐 등 다양한 목적지로 전송할 수 있습니다.
    • 대표적으로 Elasticsearch에 데이터를 전송하는 elasticsearch 출력 플러그인, 로컬 파일로 데이터를 쓰는 file 플러그인이 있습니다.

 

 
 
 

' > ElasticSearch' 카테고리의 다른 글

엘라스틱 서치와 logstash , 스프링에서 사용법  (0) 2024.05.12
엘라스틱 서치 란?  (0) 2024.05.04

엘라스틱서치(Elasticsearch)는 강력하고 확장 가능한 오픈 소스 검색 엔진이자 분석 엔진입니다. Elasticsearch는 Apache Lucene 기반으로 구축되었으며, 대용량의 텍스트 데이터를 실시간으로 저장, 검색 및 분석하는 데 최적화되어 있습니다.

 

  1. 분산 아키텍처: 데이터는 여러 노드에 걸쳐 분산 저장될 수 있어 대용량 데이터를 처리하는 데 적합합니다.
  2. 실시간 검색 및 분석: 거의 실시간으로 검색 및 분석을 수행할 수 있어 빠른 응답 시간이 요구되는 애플리케이션에 적합합니다.
  3. RESTful API: Elasticsearch는 JSON 기반의 RESTful API를 제공하여 쉽게 통합 및 확장할 수 있습니다.
  4. 복잡한 쿼리 언어 지원: 다양한 형태의 검색, 필터링 및 집계를 위한 강력한 쿼리 언어를 지원합니다.
  5. 커뮤니티 및 생태계: Kibana와 같은 대시보드 도구나 Logstash 및 Beats와의 통합을 통해 ELK 스택을 구축하여 로그 및 이벤트 데이터를 처리하는 등 다양한 사용 사례를 지원합니다.

https://www.elastic.co/kr/elasticsearch

 

Elasticsearch: 공식 분산형 검색 및 분석 엔진 | Elastic

Elasticsearch는 속도, 수평적 확장성, 안정성 및 간편한 관리를 위해 설계된 선도적인 분산형 RESTful 무료 오픈 소스 검색 및 분석 엔진입니다. 무료로 시작하세요....

www.elastic.co

 

' > ElasticSearch' 카테고리의 다른 글

엘라스틱 서치와 logstash , 스프링에서 사용법  (0) 2024.05.12
log stash란?  (0) 2024.05.04

회사에서 업무 중 미완성된 알림 서비스(스케쥴러) 소스 코드 중에 정말 잘 만든 소스 코드를 보게되었습니다.

관련 코드에 문제가 있어서 코드 수정하는겸 , 코드에 대해서 공부할겸 관련해서 코드 모사를 가볍게 해봤습니다.

Method getterMethod=property.getClass().getMethod("getWorkflowEntity");
                   Object targetEntity = getterMethod.invoke(property);
@CallerSensitive
    public Method getMethod(String name, Class<?>... parameterTypes)
        throws NoSuchMethodException, SecurityException {
        checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true);
        Method method = getMethod0(name, parameterTypes, true);
        if (method == null) {
            throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes));
        }
        return method;
    }

 

workflow id 를 통해서 => 부모 workflow의 데이터를 가지고 오려고 하는 의도인듯 했습니다.

 

entity 클래스

@Setter
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "table")
@EntityListeners(AuditingEntityListener.class)
public class PropertyEntity extends BaseEntity {

	@GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
	long seq_id;

	String workflowid;

	String workid;

	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "workflow_seq", referencedColumnName = "seq")
	WorkflowEntity workflowEntity;

	public static PropertyEntity of(String workflowid) {
		return PropertyEntity.builder()
				.workflow_definition_key(workflowid)
			.build();
	}

	public static PropertyEntity of(String workflowid, String workid) {
	   return PropertyEntity.builder()
			 .workflow_definition_key(workflowid)
			   .taskId(workid)
		   .build();
	}

	public static PropertyEntity ofProperty(String workid, String workflowid) throws JsonProcessingException {
		return PropertyEntity.builder()
				.taskId(workid)
				.workflow_definition_key(workflowid)
				.build();
	}
}

 

관련 propertyEntity table이고 WorkFlowEntity db Join을 하여 seq를 통해서 one to one 관계를 가집니다. 

이후 데이터를 invoke를 통해서 workflowEntity 테이블의 모든 데이터를 가져올수 있습니다.

 

개인적으로 봐도 정말 잘 만든 코드여서 비슷하게 다시 구현해서 만들어 봤습니다.

 

' > Spring' 카테고리의 다른 글

Spring Data JPA - 구성  (0) 2024.02.25
Spring Data JPA- repository 인터페이스의 정의  (0) 2024.02.18
Spring Data JPA - 핵심 개념  (0) 2024.02.03
Spring Data JPA에 대해서  (0) 2024.02.03
톰캣의 war 실행되는 원리?  (0) 2024.01.14

처음 회사에서 들어 왔을때 개발 환경 세팅을 하는데 몇가지 문제가 발생했었는데 그중에서 가장 기억에 남았던 부분이 바로 q 파일 설치 관련해서 기억에 남았습니다. 

 

Q 클래스(q 파일)은?

QueryDSL에서 Q-파일은 특정 엔티티에 대한 메타모델을 자동으로 생성된 자바 클래스로 제공합니다. 이러한 파일들은 QueryDSL이 제공하는 타입-세이프한 쿼리 구성을 가능하게 하는 중요한 부분입니다. 이 Q-클래스들을 사용함으로써 개발자는 컴파일 시간에 타입 체크를 받을 수 있으며, IDE의 자동완성 기능을 활용하여 더욱 빠르고 정확하게 쿼리를 작성할 수 있습니다

 

Q-클래스 또는 Q-파일의 역할

  • 메타모델 생성: Q-클래스는 각 엔티티의 속성에 대한 메타데이터를 제공하며, 이를 통해 쿼리를 작성할 때 컴파일 시간에 타입 체크가 가능합니다.
  • 타입-세이프 쿼리 작성: 이 클래스들은 쿼리를 작성할 때 변수명이나 타입 오류를 컴파일 단계에서 잡아내어 런타임 에러의 가능성을 줄여줍니다.
  • 코드 자동 완성 지원: IDE에서 Q-클래스의 속성을 사용할 때 자동 완성 기능을 제공받을 수 있어 쿼리 작성이 더 빠르고 정확해집니다.

Q-클래스의 생성

QueryDSL은 APT(Annotation Processing Tool)를 사용하여 엔티티 클래스를 기반으로 Q-클래스를 자동 생성합니다. 이 과정은 Maven이나 Gradle과 같은 빌드 도구의 설정을 통해 자동화할 수 있습니다.

 

ex)

@Entity
public class Book {
    @Id
    private Long id;
    private String title;
    private String author;
}
public class QBook extends EntityPathBase<Book> {
    public static final QBook book = new QBook("book");

    public final NumberPath<Long> id = createNumber("id", Long.class);
    public final StringPath title = createString("title");
    public final StringPath author = createString("author");

    public QBook(String variable) {
        super(Book.class, forVariable(variable));
    }
}
QBook qBook = QBook.book;
JPAQuery<?> query = new JPAQuery<>(entityManager);
List<Book> books = query.select(qBook)
                        .from(qBook)
                        .where(qBook.author.eq("J.K. Rowling"))
                        .fetch();

 

여기서 문제가 되었던게 서버가 4개로 나눠져있어서 

( A ) <-> ( B ) <-> (C ) <-> (D )    너무 많아.. ㅠ Q 파일이 가끔 제대로 설치가 안될떄가 있었는데 .. 아직 정확한 원인을 봐야할것같은데 원인을 모르겠다.... ㅠㅠ 

 

에러코드

java: cannot find symbol
  symbol:   class QWorkFlowInfoEntity

일단 clean 후 install 해서 해결은 했는데 ... 이게 맞는건가 싶다.. 정확한 queryDsl과 q파일에 대해서 더 정확하게 알아야할것같다.

' > QueryDSL' 카테고리의 다른 글

Query DSL 이란?  (0) 2024.04.20

일단 회사에서 기본적으로 Spring JPA, Query DSL, 등 여러가지 기술들이 쓰기 때문에.. 주말이라도 공부를 안하면 못따라가겠다라고 느낄정도이다. 전 회사에선 ibatis를 기반으로 회사업무를 했다보니.. 이번이직회사에선 상당히 많은걸 알게 된다. 구조가 복잡한 대신 정말 자유도가 넓은 구조라고 느껴졌다. (난 이렇게 못짤것같다고 느낄 정도 였다 경외감이 느껴진다. ㅎㄷㄷ )
 
Query DSL 이란?
QueryDSL은 타입-세이프한 쿼리를 Java 언어로 작성할 수 있게 해주는 프레임워크입니다. SQL, JPA, JDO, 그리고 컬렉션 등 다양한 데이터 소스에 대한 쿼리를 자바 코드로 구현할 수 있게 해주며, 쿼리를 직접 문자열로 작성하는 것보다 오류를 줄이고, 개발 효율성을 높일 수 있습니다.
 

주요 기능

  • 타입-세이프 쿼리: 컴파일 시간에 타입 체크가 가능합니다.
  • 다양한 백엔드 지원: SQL, JPA, MongoDB, Lucene, Hibernate Search, JDO, JDBC 등 다양한 데이터 소스를 지원합니다.
  • 동적 쿼리: 조건에 따라 유연하게 쿼리를 구성할 수 있습니다.

Spring Boot에 QueryDSL 설정하기

maven

 <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>5.0.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>5.0.0</version>
    </dependency

gradle

implementation 'com.querydsl:querydsl-jpa'
implementation 'com.querydsl:querydsl-apt'

엔티티 및 리포지토리 작성

예를 들어, 간단한 Book 엔티티를 생성하고, QueryDSL을 사용하는 리포지토리를 작성

@Entity
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String author;

    // getters and setters
}

QueryDSL을 활용하는 리포지토리 인터페이스를 작성합니다.

public interface BookRepository extends JpaRepository<Book, Long>, QuerydslPredicateExecutor<Book> {
}

쿼리 사용 예

BookRepository를 사용하여 QueryDSL 쿼리를 실행하는 예입니다.

@Autowired
private BookRepository bookRepository;

public List<Book> findBooksByAuthor(String author) {
    QBook qBook = QBook.book;
    Predicate predicate = qBook.author.eq(author);
    return (List<Book>) bookRepository.findAll(predicate);
}

' > QueryDSL' 카테고리의 다른 글

q 클래스 !  (1) 2024.04.20

Keycloak은 오픈 소스 아이덴티티 및 접근 관리 솔루션으로, 사용자 인증과 보안된 리소스에 대한 접근 제어를 제공합니다. 이는 OAuth 2.0, OpenID Connect, SAML 2.0과 같은 표준 프로토콜을 지원하며, 애플리케이션 보안을 강화하기 위해 매우 유용합니다.

 

Keycloak의 주요 기능

  • 사용자 인증: 다양한 방식(소셜 로그인, LDAP, Active Directory 등)으로 사용자 인증을 지원합니다.
  • 세션 관리: 사용자의 세션을 관리하고, 사용자가 여러 시스템에 걸쳐 일관된 접근을 유지할 수 있도록 합니다.
  • 클라이언트 어댑터: 다양한 언어 및 프레임워크를 위한 클라이언트 어댑터를 제공하여, 손쉽게 통합할 수 있습니다.
  • 사용자 및 그룹 관리: 사용자와 그룹을 관리하며, 보안 정책을 구현할 수 있습니다.

Spring Boot와 Keycloak API 연동하기

application.properties

keycloak.auth-server-url=http://localhost:8080/auth
keycloak.realm=your-realm
keycloak.resource=your-client-id
keycloak.public-client=true
keycloak.principal-attribute=preferred_username

 

maven:

<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
    <version>키버전</version>
</dependency>

 

gradle: 

 implementation 'org.keycloak:keycloak-spring-boot-starter:키버전'

 

Spring Security 설정

@Configuration
@EnableWebSecurity
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http
            .authorizeRequests()
            .antMatchers("/admin/*").hasRole("ADMIN")
            .anyRequest().permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }
}

 

api 예시

@RestController
public class TestController {

    @GetMapping("/public")
    public ResponseEntity<String> getPublic() {
        return ResponseEntity.ok("Public API");
    }

    @GetMapping("/admin/info")
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public ResponseEntity<String> getAdminInfo() {
        return ResponseEntity.ok("Admin API");
    }
}

2024.02.18 - [웹/Spring] - Spring jpa - repository 인터페이스의 정의

 

Spring jpa - repository 인터페이스의 정의

2024.02.03 - [웹/Spring] - Spring Data JPA - 핵심 개념 Spring Data JPA - 핵심 개념 2024.02.03 - [끄적이기] - JPA에 대해서 JPA에 대해서 JPA? 자바 퍼시스턴스(Java Persistence, 이전 이름: 자바 퍼시스턴스 API/Java Persist

kwaksh2319.tistory.com

Spring Data JPA 리포지토리 지원은 다음 예시와 같이 JavaConfig와 사용자 지정 XML 네임스페이스를 통해 활성화될 수 있습니다.

@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
class ApplicationConfig {

  @Bean
  public DataSource dataSource() {

    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
    return builder.setType(EmbeddedDatabaseType.HSQL).build();
  }

  @Bean
  public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setGenerateDdl(true);

    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(vendorAdapter);
    factory.setPackagesToScan("com.acme.domain");
    factory.setDataSource(dataSource());
    return factory;
  }

  @Bean
  public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {

    JpaTransactionManager txManager = new JpaTransactionManager();
    txManager.setEntityManagerFactory(entityManagerFactory);
    return txManager;
  }
}

 

앞서 언급된 구성 클래스는 spring-jdbc의 EmbeddedDatabaseBuilder API를 사용하여 내장 HSQL 데이터베이스를 설정합니다. 그런 다음 Spring Data는 EntityManagerFactory를 설정하고 샘플 영속성 제공자로 Hibernate를 사용합니다. 여기에 선언된 마지막 인프라 구성 요소는 JpaTransactionManager입니다. 마지막으로, 예제는 @EnableJpaRepositories 주석을 사용하여 Spring Data JPA 리포지토리를 활성화하는데, 이는 본질적으로 XML 네임스페이스와 같은 속성을 가집니다. 기본 패키지가 구성되지 않은 경우, 구성 클래스가 위치한 패키지를 사용합니다.

 

*  EmbeddedDatabaseBuilder API?

EmbeddedDatabaseBuilder API는 Spring Framework의 일부로, 개발자가 손쉽게 내장형 데이터베이스를 구성하고 사용할 수 있게 해주는 도구입니다. 이 API는 spring-jdbc 모듈에 포함되어 있으며, 주로 테스트나 프로토타이핑 목적으로 사용됩니다. EmbeddedDatabaseBuilder를 사용하면 HSQL, H2, Derby와 같은 인메모리 데이터베이스를 코드 몇 줄로 설정할 수 있습니다. 이 API를 통해 데이터베이스 인스턴스를 생성하고, SQL 스크립트를 실행하여 스키마를 초기화하거나 테스트 데이터를 로드할 수 있습니다.

EmbeddedDatabaseBuilder는 매우 유연하며, 데이터베이스 타입, 초기화 스크립트, 종료 옵션 등을 설정할 수 있는 다양한 메서드를 제공합니다. 이를 통해 애플리케이션이나 테스트 실행 시 필요한 데이터베이스 환경을 쉽게 준비하고 관리할 수 있습니다.

 

* 내장 HSQL 데이터베이스?

HSQLDB(HyperSQL DataBase)는 자바로 작성된 관계형 데이터베이스 관리 시스템(RDBMS)입니다. 이 데이터베이스는 주로 내장 데이터베이스로 사용되며, 애플리케이션에 직접 포함될 수 있습니다. HSQLDB는 작고 빠르며, SQL-92 표준의 상당 부분을 지원합니다. 인메모리 운영 모드를 지원하기 때문에, 애플리케이션 테스트나 개발 과정에서 빠르게 데이터베이스 환경을 구축하고 사용할 수 있습니다.

내장 HSQL 데이터베이스의 주요 장점은 별도의 서버 설치나 관리 없이 애플리케이션 내부에서 직접 데이터베이스를 실행할 수 있다는 것입니다. 이는 개발 및 테스트 과정을 간소화하고, 애플리케이션의 배포와 이식성을 향상시킵니다. HSQLDB는 자바 기반 애플리케이션과의 통합이 용이하며, JUnit 테스트 등에서 데이터베이스 환경을 요구하는 경우 유용하게 사용될 수 있습니다.

 

*Spring 네임스페이스

Spring Data의 JPA 모듈에는 리포지토리 빈을 정의할 수 있는 사용자 지정 네임스페이스가 포함되어 있습니다. 또한 JPA에 특화된 특정 기능과 요소 속성을 포함하고 있습니다. 일반적으로, JPA 리포지토리는 다음 예시와 같이 repositories 요소를 사용하여 설정할 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jpa="http://www.springframework.org/schema/data/jpa"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/jpa
    https://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

  <jpa:repositories base-package="com.acme.repositories" />

</beans>

 

repositories 요소를 사용하면 @Repository로 주석이 달린 모든 빈에 대해 영속성 예외 변환을 활성화하여, JPA 영속성 제공자에 의해 발생된 예외들이 Spring의 DataAccessException 계층 구조로 변환되게 합니다.

 

*  JPA 영속성이란?

자바 애플리케이션에서 객체와 데이터베이스 테이블 사이의 매핑을 관리하는 방법입니다. 이는 자바 표준으로, 개발자가 데이터베이스 작업을 보다 쉽게 할 수 있도록 도와주며, 객체 지향 프로그래밍과 관계형 데이터베이스 사이의 간극을 줄여줍니다.

JPA를 사용하면 개발자는 복잡한 SQL 쿼리를 작성하는 대신, 객체의 상태 변화를 데이터베이스에 자동으로 반영할 수 있습니다. 이를 통해 객체를 생성, 조회, 업데이트 및 삭제하는 작업을 객체 지향적인 방식으로 처리할 수 있습니다. JPA는 이러한 작업을 위한 API와 런타임 환경을 제공합니다.

영속성 컨텍스트라고 불리는 JPA의 핵심 개념은 엔티티의 생명 주기를 관리합니다. 영속성 컨텍스트는 엔티티를 관리하며, 엔티티의 상태 변화를 추적하여 데이터베이스에 반영합니다. 엔티티가 영속성 컨텍스트에 의해 관리될 때, 그 엔티티는 '영속 상태'에 있으며, 이 상태에서는 JPA가 자동으로 데이터베이스와의 동기화를 처리합니다.

이러한 방식으로 JPA 영속성은 개발자가 데이터베이스와의 상호작용을 추상화하고, 데이터베이스 작업을 보다 직관적이고 객체 지향적인 방식으로 수행할 수 있도록 도와줍니다.

 

*사용자 지정 네임스페이스 속성

repositories 요소의 기본 속성을 넘어서, JPA 네임스페이스는 리포지토리 설정에 대한 보다 상세한 제어를 할 수 있도록 추가 속성을 제공합니다.

    표1.  repositories 요소의 사용자 지정 JPA 특정 속성

entity-manager-factory-ref repositories 요소에 의해 감지된 리포지토리와 함께 사용될 EntityManagerFactory를 명시적으로 연결합니다. 보통 애플리케이션 내에서 여러 EntityManagerFactory 빈들이 사용될 경우에 사용됩니다. 구성되지 않은 경우, Spring Data는 ApplicationContext 내에서 entityManagerFactory라는 이름의 EntityManagerFactory 빈을 자동으로 찾습니다.
transaction-manager-ref repositories 요소에 의해 감지된 리포지토리와 함께 사용될 PlatformTransactionManager를 명시적으로 연결합니다. 보통 여러 트랜잭션 매니저 또는 EntityManagerFactory 빈들이 구성된 경우에만 필요합니다. 현재 ApplicationContext 내에서 단일로 정의된 PlatformTransactionManager를 기본값으로 합니다.

주의)

  명시적인 transaction-manager-ref가 정의되어 있지 않은 경우, Spring Data JPA는 transactionManager라는 이름의 PlatformTransactionManager 빈이 존재해야 합니다.

 

*bootstrap mode

기본적으로, Spring Data JPA 리포지토리는 기본적으로 Spring 빈입니다. 이들은 싱글톤 범위를 가지며 즉시 초기화됩니다. 시작하는 동안, 그들은 검증 및 메타데이터 분석 목적으로 JPA EntityManager와 이미 상호작용합니다. Spring Framework는 JPA EntityManagerFactory의 초기화를 백그라운드 스레드에서 지원합니다. 왜냐하면 그 과정은 보통 Spring 애플리케이션의 시작 시간에서 상당한 양을 차지하기 때문입니다. 그 백그라운드 초기화를 효과적으로 사용하기 위해, JPA 리포지토리가 가능한 한 늦게 초기화되도록 해야 합니다.

 

Spring Data JPA 2.1부터, 이제 @EnableJpaRepositories 주석 또는 XML 네임스페이스를 통해 다음 값을 가지는 BootstrapMode를 구성할 수 있습니다:

DEFAULT (기본값) — 리포지토리는 명시적으로 @Lazy로 주석이 달리지 않는 한 즉시 인스턴스화됩니다. 
                    이 지연화는 리포지토리의 인스턴스가 필요하지 않는 클라이언트 빈이 없을 때만
                    효과가 있습니다. 왜냐하면 그것은 리포지토리 빈의 초기화를 요구하기 때문입니다.

LAZY — 모든 리포지토리 빈을 암시적으로 지연된 것으로 선언하고 클라이언트 빈에 주입될 지연 초기화
       프록시를 생성합니다. 
       즉, 클라이언트 빈이 단순히 인스턴스를 필드에 저장하고 초기화하는 동안 리포지토리를 
       사용하지 않는 경우 리포지토리가 인스턴스화되지 않습니다. 리포지토리 인스턴스는 
       리포지토리와의 첫 번째 상호작용 시 초기화되고 검증됩니다.

DEFERRED — 기본적으로 LAZY와 동일한 운영 모드이지만, 
            애플리케이션이 완전히 시작되기 전에 리포지토리가 검증되도록 하여
            ContextRefreshedEvent에 대한 반응으로 리포지토리 초기화를 트리거합니다.

 

*추천 사항

비동기적인 JPA 부트스트랩을 사용하지 않는 경우, 기본 bootstrap mode 를 사용하세요.

JPA를 비동기적으로 bootStrap 하는 경우, DEFERRED는 합리적인 기본값입니다. 이는 EntityManagerFactory 설정이 애플리케이션의 다른 모든 구성 요소를 초기화하는 것보다 더 오래 걸릴 경우에만 Spring Data JPA 부트스트랩이 대기하도록 합니다. 그럼에도 불구하고, 애플리케이션이 준비되었다고 신호하기 전에 리포지토리가 제대로 초기화되고 검증되도록 합니다.

LAZY는 테스트 시나리오와 로컬 개발에 적합한 선택입니다. 리포지토리가 제대로 부트스트랩될 수 있다는 것을 확신하거나, 애플리케이션의 다른 부분을 테스트하는 경우에, 모든 리포지토리에 대한 검증을 실행하는 것은 시작 시간을 불필요하게 증가시킬 수 있습니다. 로컬 개발에서도, 단일 리포지토리만 초기화해야 하는 애플리케이션의 일부분에만 접근할 경우 같은 원칙이 적용됩니다.

 

참조: 

https://docs.spring.io/spring-data/jpa/reference/repositories/create-instances.html

 

Configuration :: Spring Data JPA

By default, Spring Data JPA repositories are default Spring beans. They are singleton scoped and eagerly initialized. During startup, they already interact with the JPA EntityManager for verification and metadata analysis purposes. Spring Framework support

docs.spring.io

 

' > Spring' 카테고리의 다른 글

Reflection api GetMethod  (0) 2024.04.20
Spring Data JPA- repository 인터페이스의 정의  (0) 2024.02.18
Spring Data JPA - 핵심 개념  (0) 2024.02.03
Spring Data JPA에 대해서  (0) 2024.02.03
톰캣의 war 실행되는 원리?  (0) 2024.01.14

+ Recent posts