728x90

JVM 82

PostgreSQL Array 타입 JPA 연동

Hibernate는 기본적으로 PostgreSQL의 Array 데이터 타입을 지원해 주지 않는다. vladmihalcea 라이브러리를 추가implementation("com.vladmihalcea:hibernate-types-60:2.20.0")type-60은 하이버네이트 6.0 이상부터 지원하는 라이브러리다. 각자 상황의 맞는 버전을 추가하면 된다.  스키마create table job_offer( job_offer_id bigserial primary key, days varchar(50)[] not null,); 엔티티@Entity@NoArgsConstructor@Getterpublic class JobOffer extends BaseTime { @I..

JVM/JPA 2023.11.12

Spring 3.0 이상 Querydsl 설정

// 1. 플러그인 섹션 plugins { // Spring Boot 플러그인: Spring Boot 프로젝트를 설정하여 자동 구성을 제공 id("org.springframework.boot") version "3.1.0" // Spring Dependency Management 플러그인: 종속성 버전을 효과적으로 관리하여 일괄적으로 업데이트 id("io.spring.dependency-management") version "1.1.0" // Kotlin JVM 플러그인: Kotlin을 JVM에서 실행 가능하도록 하는 플러그인 kotlin("jvm") version "1.8.21" // Kotlin Spring 플러그인: Kotlin에서 Spring Framework를 쉽게 사용할 수 있도록 지원 kot..

JVM/Kotlin 2023.09.27

Spring Gateway, Eureka 연동

워크 플로우 클라이언트의 요청은 게이트웨이가 받아서 유레카 서버에 서비스의 주소를 받아서 라우팅한다. 서비스 인스턴스가 여러개일 경우 라운드로빈 방식(한번씩 돌아가면서 호출)으로 라우팅 된다. API Gateway 설정 server: port: 8000 # 유레카 클라이언트로 등록한다. eureka: client: register-with-eureka: true fetch-registry: true service-url: defaultZone: http://localhost:8761/eureka spring: application: name: apigateway-service cloud: gateway: routes: - id: first-service # 유레카 서버에 등록된 서비스의 애플리케이션 이름..

JVM/SpringCloud 2023.09.03

@Value 어노테이션 사용시 발생 오류

오류 FeignClient 사용시 url 부분에서 An annotation argument must be a compile-time constant 오류가 발생하였다. 코틀린에는 문자열에 연결을 위해 사용하는 구문이기에 ${} 이는 동적 할당에 해당하는 구문 오류라는 것. @FeignClient(name = "naverAPIClient", url = "${oauth.open-api.naver}") interface NaverAPIClient { } 해결 이스케이프 문자를 사용하면 간단히 해결된다. @FeignClient(name = "naverAPIClient", url = "/${oauth.open-api.naver}") interface NaverAPIClient { }

JVM/Kotlin 2023.08.27

Spring Cloud Gateway

Spring Cloud GatewaySpring Cloud Gateway는 마이크로 서비스 아키텍처에서의 진입점으로 사용되는 서비스이다. 이 서비스는 다양한 기능을 제공하여 마이크로 서비스 간의 통신과 관리를 용이하게 만든다.Spring Cloud Gateway는 비동기 방식으로 동작하며, Netty를 사용하여 효율적인 네트워크 통신을 지원한다.Predicates는 요청을 어떤 서비스로 라우팅할지 결정하는 역할을, Filter는 요청 및 응답에 대한 추가적인 로직을 수행하며, 이 두 가지를 조합하여 유연한 라우팅 및 처리를 가능케 한다.사용자의 인증 및 권한 부여를 관리하여 보안을 강화한다마이크로 서비스의 동적인 변화에 대응하기 위해 서비스 검색을 통합하여 서비스 간의 통신을 간편하게 처리한다.응답 캐싱..

JVM/SpringCloud 2023.08.23

Spring Cloud Netflix Eureka

Spring Cloud Netflix Eureka Server Spring Cloud Netflix Eureka는 마이크로서비스 아키텍처에서 서비스 디스커버리와 로드 밸런싱을 지원하기 위한 모듈 중 하나이다. 각각의 서비스는 Eureka 서버에 자신의 정보를 키-값 형태로 등록하고, 다른 서비스들도 이를 검색할 수 있다. org.springframework.cloud:spring-cloud-starter-netflix-eureka-server 라이브러리를 필요로한다. @EnableEurekaServer import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplica..

JVM/SpringCloud 2023.08.23

2차 캐시

애플리케이션 범위에서 공유하는 캐시를 Shared Cache, Secon Level Cache, L2 Cache라고 부른다. DB에서 조회한 데이터는 2차 캐시에 보관되고, 2차 캐시는 해당 엔티티의 복사본을 만들어 1차 캐시에 반환한다. 하지만 스프링이 지원하는 캐시를 서비스 계층에서 사용하는 것이 더 효과적이다. Entity에 @Cacheable을 붙여주면 캐시 모드를 설정할 수 있다. spring: jpa: properties: javax: persistence: sharedCache: mode: ENABLE_SELECTIVE hibernate: generate_statistics: true format_sql: true cache: use_second_level_cache: true region:..

JVM/JPA 2023.07.05

낙관적 락과 비관적 락

JPA는 데이터베이스에 대한 동시 접근으로부터 엔티티에 대한 무결성을 유지할 수 있게 해주는 동시성 제어 메커니즘을 지원한다. 이 메커니즘에는 낙관적 락과 비관적 락이 존재한다. JPA는 데이터베이스의 트랜잭션 격리 레벨을 READ COMMITTED 정도로 가정한다. 낙관적 락 (Optimistic Lock) 대부분의 트랜잭션이 충돌이 발생하지 않을 것이라고 낙관적으로 가정하는 방법이다. 따라서 데이터베이스가 제공하는 락 기능을 사용하지 않고, 엔티티의 버전을 통해 동시성을 제어한다. 즉, 애플리케이션 레벨에서 지원하는 락이다. @Version JPA는 @Version 어노테이션을 제공하는데, 이를 사용하여 엔티티의 버전을 관리할 수 있다. @Version 적용이 가능한 타입은 Long(long), In..

JVM/JPA 2023.07.05

트랜잭션을 지원하는 쓰기 지연

JDBC가 제공하는 SQL 배치 기능을 사용하면 쓰기 SQL을 모아서 데이터베이스에 한번에 보낼 수 있다. hibernate.jdbc.batch_size 속성의 값을 50으로 주면 최대 50건씩 모아서 SQL 배치를 실행한다. 하지만 SQL 배치는 같은 SQL일 때만 유효하다. 중간에 다른 처리가 들어가면 SQL 배치를 다시 시작한다. JPA의 쓰기 지연 기능은 데이터베이스 락이 걸리는 시간을 최소화해서 동시에 더 많은 트랜잭션을 처리할 수 있는 장점이 있다.em.persist(new Member()); //1 em.persist(new Member()); //2 em.persist(new Member()); //3 em.persist(new Member()); //4 em.persist(new Chil..

JVM/JPA 2023.07.04

SQL 쿼리 힌트 사용

SQL 힌트(데이터베이스 벤더에게 제공하는 힌트)를 사용하려면 하이버네이트를 직접 사용해야 한다. 오라클이 아닌 다른 데이터베이스에서 SQL 힌트를 사용하려면 각 방언에서 org.hibernate.dialect.Dialect.getQueryHintString() 메소드를 오버라이딩해서 기능을 구현해야 한다. Session session = em.unwrap(Session.class); List list = session.createQuery("SELECT m FROM Member m") .addQueryHint("FULL (MEMBER)") .list();

JVM/JPA 2023.07.04
728x90