
Spring Boot + Redis Spring Boot 에 Redis 를 적용하면서 알게된 내용들을 정리해보자. Redis 특징 Collection(List, Set, Sorted Set, Hash) 지원 Race condition 방지 Redis 는 Single Thread 로 Atomic 보장 persistence 지원 서버가 종료되더라도 데이터 리로드 가능 Spring Data Redis Ready build.gradle Redis 는 Key-Value 형식을 갖는 자료구조 Spring Data Redis 는 RedisTemplate , Redis Repository 를 사용하는 두 가지 접근 방식 제공implementation 'org.springframework.boot:spring-b..

동시성 문제와 스레드 로컬 동시성 문제 다수의 스레드가 동시에 같은 인스턴스 필드 값을 변경하면서 발생하는 문제 스프링 빈처럼 싱글톤 객체의 필드를 변경하며 사용할 때 주의 Sample Service @Slf4j public class FieldService { private String nameStore; // 싱글톤 객체의 공용 필드 public String logic(String name) { log.info("저장 name={} -> nameStore={}", name, nameStore); nameStore = name; sleep(1000); log.info("조회 nameStore={}", nameStore); return nameStore; } } Test @Slf4j public clas..

Spring Batch Test Spring Batch를 테스트해 보는 시간을 가져보려고 한다. Spring Batch와 아직 어색어색하니까..😬 조금씩 친해지면서 테스트 관련 내용을 업데이트할 예정이다.🙄 준비 배치 테스트를 위해 spring-batch-test 의존성이 필요 testImplementation("org.springframework.batch:spring-batch-test") 통합 테스트 통합 테스트에 필요한 어노테이션들을 먼저 간략히 살펴보면, 일반 스프링 테스트 코드를 작성하면서 많이 보았던 익숙한 어노테이선들도 있을 것이다. @Slf4j 로깅을 위해 선언 @ExtendWith(SpringExtension.class) Junit5의 라이프사이클에 Test에서 사용할 기능 확장을 위해..

Spring Batch 향로님 Spring Batch 가이드 보고 따라하기 jojoldu/spring-batch-in-action 배치 기능 활성화 보통 실시간 처리가 어려운 대용량 데이터나 대규모 데이터일 경우 배치를 활용 배치기능 활성화를 위해 프로젝트 Application 클래스에 @EnableBatchProcessing 를 추가해주자. @EnableBatchProcessing @SpringBootApplication public class SpringBatchTestApplication { public static void main(String[] args) { SpringApplication.run(SpringBatchTestApplication.class, args); } } Job 생성하기 ..

@Transactional 잘 사용해보기 @Transactional 을 사용하고는 있지만.. 잘 모르고 저스트 그냥 사용하고 있다 보니 간단하게라도 탐구를 해볼 필요성을 느끼게 되었다. 그래서.. 오늘도 어김없이 탐정놀이를 해보려고 한다. 🔍🤠🔎 . 시작하기에 앞서, 트랜잭션 구성은 @Configuration, XML 기반 설정 말고도 애노테이션 기반으로 설정할 수 있다. 주로 애노테이션 기반으로 많이 사용되는 것 같다. 애노테이션 방식은 선언적 트랜잭션이라고 불리고, 선언 시 트랜잭션 기능이 적용된 프록시 객체가 생성된다. . @Transactional으로 생성된 프록시 객체는 @Transactional이 적용된 메소드가 호출될 경우, PlatformTransactionManager를 사용하여 트랜잭션..

JPA 양방향 관계 Entity 저장하기 인간은 습관의 동물이다. 습관에는 대부분 좋은 습관이 많지만 그중에 나쁜 습관도 있다. 그것은 바로.. 원리를 모르고 개발하는 습관이다. 😯 . '요로케할 때 이렇게 했었으니까, 이렇게 해야지~!' 는 더 이상 통하지 않는다.. 사이드 프로젝트를 하며 깨닫는 부분이 많다. . 습관처럼 몸에 익어버린 방법들이 갑자기 뇌 정지가 오며 멈춰버렸을 때, 머릿속이 하얘지고 말았다. 적어도 왜 이렇게 개발했었는지 원리를 알았더라면, 이럴 일은 없었을텐데.. 정말 기본적인 것들 앞에서 갑자기 띠용🙄 할 때가 있다. (최근에 습관성 타이핑으로 노트북 비밀번호 까먹은 거는 진짜 비밀..🤫) . 본론으로, JPA 양방향 관계 Entity를 저장해보자. Situatio..

Spring Boot, Gradle 환경에 Querydsl 설정 방법 Spring Boot, Querydsl 최신 버전을 사용하면서 QueryDSL 적용 방법에 변동이 생긴 듯하다. 참고로, 현재 프로젝트는 spring-boot-2.6.3, gradle-7.3.2 버전을 사용 중이다. . 기존 방식대로 적용을 했을 때, 아래와 같은 에러가 발생하게 되었다. Unable to load class 'com.mysema.codegen.model.Type'. . 그럼.. 이제 어떤 방법으로 QueryDSL 설정을 해주어야 할지 확인해 보자! Gradle 먼저 Gradle 설정 방법이다. // 1. queryDsl version 정보 추가 buildscript { ext { queryDslVersi..

[JPA] JSON 직렬화 순환 참조 해결하기 순환 참조. JPA에서 양방향으로 연결된 엔티티를 JSON 형태로 직렬화하는 과정에서, 서로의 정보를 계속 순환하며 참조하여 StackOverflowError 를 발생시키는 현상 . 직렬화. 객체/데이터를 바이트 형태로 변환하여 네트워크를 통해 송수할 수 있도록 만드는 것 Situation Product 에서 ProductCategory를 조회할 수도 있고, ProductCategory 에서 Product 도 조회할 수 있어야 한다. Controller 에서 Product 목록을 JSON 형태 직렬화하여 반환해야 한다. @Getter @NoArgsConstructor @Entity public class Product extends BaseTimeEntity..