분류 전체보기 555

면접 준비 : 낙관적 락, 비관적 락

Q. 낙관적 락과 비관적 락에 대해서 설명해주세요. A. 둘 다 데이터에 락을 걸어서 동시성 문제를 해결하는 방법중에 하나입니다. 낙관적 락은 충돌이 빈번하지 않은 경우에 효과적입니다. 낙관적 락은 커밋과정에서 충돌을 감지하여 Exception을 던지는데 이 때 Exception은 OptimisticLockingFailureException입니다. 이 예외를 처리함으로써 동시성 문제를 해결할 수 있습니다. 비관적 락은 충돌이 빈번한 경우에 더 효과적입니다. 비관적 락은 반드시 동시성 문제가 발생한다는 가정을 하고 락을 걸기 때문에 데이터의 정합성이 보장되지만 낙관적 락에 비해 성능이 조금 부족할 수 있습니다.

면접 준비 : 동기, 비동기와 블로킹, 논블로킹의 차이

Q. 비동기 프로그래밍과 Non-blocking (Architecture) 의 차이에 대해서 설명해주세요. A. 동기 / 비동기 프로그래밍은 클라이언트와 서버간에 커뮤니케이션을 할 때 한번 request를 보내면 그에 상응하는 response가 올때까지 기다려야 한다는 것입니다. 반면에 블로킹 / 논블로킹 아키텍처는 여러개의 프로그램 혹은 스레드가 공유된 자원에 접근할 때 같은 자원에 하나의 스레드만 접근할 수 있도록 접근을 막는 것입니다.

스프링 부트 5.0 Querydsl 설정 변경

스프링 부트가 5.0이 됨에 따라 그런지 모르겠지만 javax.persistence에 있던 EntityManager가 작동하지 않는 상황이 발생했습니다. 이제 EntityManager는 jakarta.persistence로 바뀌게 되었는데 이에따라 querydsl의 설정을 바꿔줘야할 필요가 생겼습니다. 구글링을 해본 결과는 다음과 같습니다. buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'java' id 'org.springframework.boot' version '3.1.0' id 'io.spring.dependency-management' version '1.1.0' // querydsl plugin 제거 //id "com.ewerk..

JPA/QueryDSL 2023.05.30

스프링 부트 5.0 JobBuilderFactory, StepBuilderFactory Deprecated

스프링 부트가 5.0에 들어오면서 기존 Job과 Step을 작성할 때 사용하던 JobBuilderFactory, StepBuilderFactory가 Deprecated 되었습니다. 때문에 기존 방법 대신 아래와 같은 방법으로 사용해야합니다. @Configuration @RequiredArgsConstructor @Slf4j public class MonthClickToZeroBatch { private final EntityManagerFactory emf; private final JobRepository jobRepository; private final PlatformTransactionManager platformTransactionManager; private static final int PA..

Spring/Spring Batch 2023.05.30

온라인 쇼핑몰 ver.2 (5) : 검색 성능 개선하기

1. 기존 검색 방식 LIKE 연산자를 이용한 검색을 했습니다. 2. 기존 검색의 문제점 인덱스 설정을 할 수 없습니다. 인덱스를 설정하면 시간 복잡도가 O(log n)이지만 인덱스를 설정하지 못하기 때문에 시간 복잡도가 O(n)에 바인딩 즉, 풀스캔으로 조회합니다. 3. ver.2에서 개선한 점 Elasticsearch의 역색인을 이용해 검색 성능을 20배 (100만행 기준) 끌어올렸습니다. Elasticsearch 고난 항상 느끼는 것이지만 NoSQL은 진입장벽이 어마어마한 것 같습니다. RDBMS에 너무 익숙해진 것도 있겠지만 하나부터 열까지 새롭지 아니한게 없었습니다. RESTful API로 테이블 (인덱스)를 만들고 모든 CRUD 또한 RESTful API를 따르고 있었습니다. 또한, GUI도 ..

Elasticsearch 에 MySQL 데이터 동기화하기 (데이터 마이그레이션)

이번 포스팅에선 Elasticsearch의 데이터와 MySQL 데이터를 동기화하는 방법에 대해서 포스팅해보도록 하겠습니다. 우선 제가 이 방법이 필요했던 이유는 기존 프로젝트에서 이미 수백개의 데이터가 있는데 이걸 Elasticsearch와 연동시켜야 제가 원하는 검색성능이 나올 것 같아서 알아보게 되었습니다. 마이그레이션 하느라 조금 고생했는데 한번 보시죠! Elasticsearch 마이그레이션 Elasticsearch에서 데이터를 마이그레이션 하는 방법에는 몇가지가 있습니다. 일일이 집어넣기 Logstash 사용하기 go-mysql-elasticsearch 사용하기 저야 수백개가 되는 데이터니까 잘만하면 일일이 집어넣는게 가능하겠지만 현실에선 불가능하겠죠? 또 logstash를 사용하는 방법이 있는데..

Elasticsearch 스프링에서 사용하기

이번 포스팅에선 이제 제가 공부하는 스프링에서 사용해봐야죠. 우리는 앞선 포스팅에서 Elassticsearch의 전반적인 내용과 CRUD를 해봤습니다. 스프링에선 Elasticsearch를 어떻게 사용하고있을까요? 한번 알아보죠! 스프링에서 Elasticsearch 사용하기 // elasticsearch implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch' implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client' 우선 의존성을 추가해줍니다. ElasticsearchConfig.java package com.hello.capston...

온라인 쇼핑몰 ver.2 (4) : 동시성 문제 해결하기

기존 동시성 문제 기존에도 동시성 문제가 발생한다는 것을 느낌적으로 알아차렸습니다. 이에 Synchronized 키워드를 이용해 동시성 문제를 해결했습니다. 기존 동시성 문제의 문제점 Synchronized 키워드는 다른 동시성 문제를 해결하는 방법보다 성능상 좋지못합니다. ver.2에서 개선한 동시성 문제 JPA의 특징 때문에 Synchronized 키워드는 어울리지 않는다고 판단하여 JPA와 어울리는 낙관적 락 / 비관적 락 중 하나를 선택하였습니다. 우선 테스트 코드를 통해 "동시성 문제가 발생합니다" 라고 증명하는 것부터가 문제였습니다. 그 때 마침 "단위 테스트" 라는 것에 꽂혀서 어디선가 DB를 불러오는 단위 테스트는 안티 패턴이다 라는 말이 생각났습니다. 그래서 Mock 객체를 이용한 단위 ..

스프링에서 동시성 문제 해결하기

프로젝트를 고도화하는 과정에서 동시성 문제에 대해 고민하게 되었습니다. 동시성 문제... 참 쉽지 않더군요... 우선 정말 추상적이고 해결 방법도 정말 많습니다. 이번 포스팅에선 동시성 문제에 대해 짧게 서술하고 해결방안 그리고 문제점까지 확인해보도록 하겠습니다. 동시성 문제 어떤 것을 동시성 문제라고 할까요? 사실 동시성 문제는 제 포스팅에 자세히 나와있습니다. 동시성 문제에 대한 내용도 많이 기술했습니다. 아래의 링크에서 확인해주세요! https://coding-review.tistory.com/362 세마포어와 뮤텍스 프로세스 동기화에 대한 면접질문을 외우다가 문득 생각이 들었습니다. "Critical Section (이하 임계구역) 에 접근하는 것을 제어하기 위해 세마포어나 뮤텍스를 사용합니다."..

Spring/Spring 2023.05.21