jpa

    2차 캐시를 이용한 최적화 기록

    2차 캐시를 이용한 최적화 기록

    개인 프로젝트에 2차 캐시를 적용하면서 데이터 최적화를 시도한 기록을 기록합니다. 🔍 자바의 표준 캐시 (JCache) JCache는 자바 애플리케이션을 위한 표준화된 캐싱과 매커니즘을 제공합니다. 캐싱 표준으로 설계되었기 때문에, 벤더 중립적입니다. 즉, JCache API를 사용하여 애플리케이션을 개발하면 다른 캐시 API로의 전환이 용이합니다. JCache는 다음과 같은 표준 인터페이스를 제공하고 공급자를 제공받음으로써 벤더 중립적인 개발을 가능하게 도와줍니다. CacheManager - 캐시 설정, 구성 및 종료를 담당하는 인터페이스 CachingProvider CacheManager의 생명 주기를 생성하고 관리하는 인터페이스 대표적인 공급자로 Ehcache, Hazelcast, Caffeine,..

    [프로젝트 기록] fetch-join을 이용해 쿼리 최적화하기

    [프로젝트 기록] fetch-join을 이용해 쿼리 최적화하기

    프로젝트를 진행하면서 쿼리 최적화한 과정을 기록하려고 한다. SpringBoot3.x , JPA를 사용한 프로젝트이다. 🔍 연관관계 기본적으로 JPA를 사용하여 프로젝트를 진행하면 Delete, Update, 맵핑관계가 설정되어 있는 조회 로직에서 쿼리를 확인하고 최적화를 진행하고 있다. 이번에는 일대다 관계를 가진 엔티티를 조회할 때의 쿼리 최적화를 진행하였다. @AllOpen @Entity class Product( @ManyToOne @JoinColumn var category: ProductCategory, ) { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long? = null } @Entity class ProductCat..

    [JPA] JPA의 장점과 그 원리

    [JPA] JPA의 장점과 그 원리

    이전 포스팅에서 객체지향프로그래밍과 데이터베이스간 패러다임 불일치로 발생하는 문제들을 알아봤다. 이번에는 JPA가 이런 문제를 어떻게 해결하는지 알아보자. 새로운 계층: JPA 레이어 JPA는 데이터베이스와 애플리케이션 사이에서 동작한다. 계층이 하나 더 있기 때문에 최적화 관점에서 시도해 볼 수 있는 것이 많다. 1. 지연 로딩 Customer를 조회할 때 Orders속성에 명시적으로 액세스할 때까지 SELECT 쿼리가 나가지 않는다. @Entity public class Customer { @OneToMany(mappedBy = "customer") private List orders; } 2. Batch Fetching 관련 엔티티를 일괄적으로 로드하여 쿼리 수를 최소화한다. @Entity publ..

    [JPA] JPA의 필요성: 객체와 데이터베이스 간의 격차 해소하기

    객체 지향 프로그래밍의 도전 과제 객체 지향 프로그래밍의 영역에서는 추상화, 상속, 다형성이라는 3박자가 복잡한 시스템의 제어를 조율한다. 그러나 이러한 원칙을 데이터 저장으로 확장하면 수많은 과제가 발생한다. JDBC API 사용 시 불편한 점을 고려하여 그 복잡성을 자세히 살펴보자. 예를 들어 User객체를 조회해보자. // 저장 class UserJdbcTemplate { public User findUserByUsername(String username) { String sql = "SELECT * FROM users WHERE username = ?"; return jdbcTemplate.queryForObject(sql, new Object[]{username}, (resultSet, rowN..

    TimeZone으로 인한 데이터 조회 실패

    TimeZone으로 인한 데이터 조회 실패

    현재 Voca-World라고 하는 언어 학습 웹 서비스를 운영중이다. 최근에 AWS와 Docker를 이용하여 서버를 배포했는데 저장한 영어 단어가 조회되지 않는 현상이 발생했다. 이 문제를 해결한 과정을 기록하려고 한다. 🔍 문제 해결 과정 문제의 원인을 살펴보기 위해 서버의 로그 파일을 확인해 보았다. 단어 저장시 문제가 생겼을 수 있기 때문에 단어 저장 -> 단어 조회 순서로 로그를 확인해봤다. 저장한 시간보다 9시간 늦은 시간으로 표기되었지만 타임존이 다른걸 생각해보면 문제는 없어보였다. 하지만 로그를 편하게 보기 위해 로그의 시간 기록도 한국 시간으로 바꿔주었다. [logback-variables.properties] LOG_PATTERN=[%-5level] %d{yyyy-MM-dd HH:mm:s..