Java & Kotlin/Spring Data16 Redis를 데이터베이스 답게 사용하는 다양한 방법 안녕하세요. POD 백엔드팀 고희광입니다.이전에 redis를 이용한 분산락 적용으로 이벤트 참여 동시성 이슈를 개선한 것과 더불어 다양한 방법으로 redis를 활용하는 방법을 소개하고자 합니다.먼저 사내에서 redis를 사용하는 사례에는 대표적으로 세가지가 있습니다.JWT 토큰 저장캐시 저장분산락흔히 redis가 뭔지 물어보면 메모리기반이라 빠르다, 싱글스레드이다 등의 답변을 받습니다.하지만 redis가 휘발성 데이터만 저장한다 생각하며 NoSQL 데이터베이스라는 성격을 띄고있는 것에 관심가지지 않는 것 같아 몇가지 사례를 예로 들고자 합니다.이벤트 중복 참여 제한하기이벤트 중복 참여의 경우 분산락을 통해 중복참여 체크 로직에서 걸러지게 되어있습니다.하지만 락을 사용하지 않은 경우 한 회원의 연속된 쿠폰.. 2025. 1. 23. [JPA] illegally attempted to associate proxy with two open Sessions 에러 illegally attempted to associate proxy with two open Sessions 에러 SpringBatch와 Jpa를 사용하면서 illegally attempted to associate proxy with two open Sessions에러를 만나게 됐다. 당연하지만 처음 보는 에러는 정말 당황스럽다. illegally attempted to associate proxy with two open Sessions 에러는 두개 session에서 같은 proxy를 다루려 하면서 나타나는 에러다. public MatchInfo process(MatchInfo matchInfo) throws Exception { initializeUnitsAndAugments(matchInfo);.. 2022. 7. 1. [JPA] Cascade persist와 연관관계 Cascade.persist와 연관관계 JPA를 배우고, 개발을 진행하면서 자주 사용하지 않을거라 생각한 cascade.persist에 대해 정리하려 한다. [JPA]영속성 전이 CASCADE에서 정리했다시피 Cascade.persist 옵션은 부모를 영속화할 때 자식도 영속화하는 옵션이다. 예를 들어 부모 Entity에 oneToMany관계인 자식 Entity를 List로 넣어두고, 부모 Entity를 영속화(persist)한다면 자식 Entity도 연쇄적으로 persist되는 것이다. 주의하고자 하는 부분 하지만 단순히 부모 Entity에 자식 Entity를 넣어주는것 만으로는 정확한 Persist가 이루어지지 않는다. 자세하게 예를 들어보자. 먼저 Home과 Person은 1 : N 관계로 Casc.. 2022. 6. 24. [QueryDSL] oneToMany 관계에서 여러 개의 fetchJoin 사용하기 oneToMany 관계에서 여러 개의 fetchJoin 사용하기 QueryDSL을 사용하면서 Data Jpa에서 해결하기 복잡한 쿼리를 쉽게 사용하고 있다. 하지만 하나의 엔티티가 두개 이상의 자식 엔티티에 oneToMany 관계로 구성되어있을 때 해당 자식 엔티티를 모두 fetchJoin하려 할 때 문제가 발생했다. 문제 현재 Home 엔티티는 Person과 Dog 엔티티와 OneToMany 연관관계로 구성되어있다. @Test void oneToManyFetchJoinTest() throws Exception { //given Home home1 = Home.builder() .name("home1") .build(); em.persist(home1); Home home2 = Home.builder().. 2022. 6. 24. [QueryDSL] gradle querydsl 설정하기 gradle querydsl 설정하기 springboot 프로젝트에 querydsl을 설정하면서 기존 설정방식이 조금 효율적이지 못하며, 자동화의 필요성을 느껴 개선하였다. 기존 방식 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { ... id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" ... } dependencies { ... implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}" ... } ... def queryds.. 2022. 5. 15. [QueryDSL] 페이징 연동하기 페이징 연동하기 Spring Data JPA에서 Page와 Pageable을 이용하고, QueryDSL을 이용하여 페이징을 사용해보자. 가장 효율적인 방법 이전까지의 페이징 방법중 하나는 fetchCount()와 fetchResult()를 이용하는 방법이였다. 하지만 이는 단순히 count 처리하는 용도이기 때문에 QueryDSL에서는 이를 지원하지 않기로 결정했다고 한다. 따라서 count와 result를 더 효율적으로 이용하는 방법을 사용하자. List content = queryFactory .select( new QMemberTeamDto( member.id.as("memberId"), member.username, member.age, team.id.as("teamId"), team.name.a.. 2022. 5. 15. [QueryDSL] Spring Data JPA와 QueryDSL 사용하기 Spring Data JPA와 QueryDSL 사용하기 지금까지 본 QueryDSL은 EntityManager을 직접 받아 개별적으로 JPA 환경에서 사용하는 것이였다. 이제 Spring Data JPA와 함께 사용하여 더 효율적으로 QueryDSL을 사용해보자. 사용자 정의 리포지토리 사용자 정의 리포지토리의 구성 기존 Spring Data Repository는 MemberRepository interface가 JpaRepository interface를 상속받는다. QueryDSL 사용을 위한 MemberRepositoryCustom interface를 생성하고, QueryDSL을 사용할 메서드를 생성한다. MemberRepository interface는 MemberRepositoryCustom i.. 2022. 5. 15. [QueryDSL] 벌크연산과 SQL Funtion 벌크연산과 SQL Function 쿼리를 이용하면 일정한 조건에 해당하는 데이터에 공통적으로 수정해야 하는 일이 있다. 이 때 벌크 연산을 이용한다. 벌크연산 long count = queryFactory .update(member) .set(member.username, "비회원") .where(member.age.lt(28)) .execute(); member의 age가 28 이하인 경우 username를 비회원으로 수정하는 벌크연산이다. query와 동일하게 update, delete등을 이용한다. 벌크연산의 주의할 점은 spring data jpa와 다르게 영속성 컨텍스트에 있는 엔티티를 무시하고 데이터베이스에 직접 실행된다. 그렇기 때문에 배치 쿼리를 실행하고 나면 영속성 컨텍스트를 초기화 하는.. 2022. 5. 15. [QueryDSL] 동적쿼리 동적쿼리 QueryDSL에서 동적 쿼리를 이용하는 방식에는 BooleanBuilder과 Where 다중 파라미터 사용 방법이 있다. BooleanBuilder 사용 BooleanBuilder builder = new BooleanBuilder(); if (usernameCond != null) { builder.and(member.username.eq(usernameCond)); } if (ageCond != null) { builder.and(member.age.eq(ageCond)); } return queryFactory .selectFrom(member) .where(builder) .fetch(); BooleanBuilder을 이용하면 where절에 들어갈 값을 미리 생성할 수 있다. 이 때 동.. 2022. 5. 14. 이전 1 2 다음