B-Tree란?B-Tree는 기존 이진 탐색 트리에서 최악의 경우 시간 복잡도가 O(N)이 되는 문제를 해결하기 위해, 노드들이 한쪽으로 치우치지 않도록 균형을 유지하도록 설계된 트리이다. 그렇다면 데이터베이스 인덱스는 왜 B-tree를 선택 했을까? 배열을 사용하지 않는 이유데이터베이스에 수십억건의 대량의 데이터가 저장될 수 있는데, 이를 배열로 관리하면 메모리에 모든 데이터를 한 번에 올려야 하므로 비효율적이다.또한 삽입, 삭제시 최악의 경우 O(N)으로 비효율적이다. 연결 리스트를 사용하지 않는 이유연결 리스트의 경우 배열의 단점인 삽입, 삭제시 시간복잡도가 O(1)로 효율적이다.하지만 연결 리스트의 경우 조회시 최악의 경우 시간 복잡도가 O(N)으로 비효율적이다. 해시 테이블을 사용하지 않는 이유..
Skip List스킵리스트는 여러 레벨의 연결 리스트를 확률적으로 구성해 평균 O(log N)에 탐색·삽입·삭제를 지원하는 자료구조 장점스킵 리스트는 다중 레벨로 구성된 연결 리스트 구조를 가지므로, 일반 연결 리스트의 탐색·삽입·삭제가 O(N)인 것에 비해 평균 O(log N)에 수행된다.범위 탐색이 효율적이다. O(log N + M)B-트리와 달리, 스킵 리스트는 별도의 리밸런싱 과정 없이 노드 간 포인터만 조작하여 삽입과 삭제가 가능하다.단점각 노드가 여러 레벨의 포인터를 갖기 때문에 연결 리스트에 비해 메모리 사용량이 많다.확률적 구조 특성상 최악의 경우에는 일반 연결 리스트와 동일한 O(N)의 시간 복잡도를 가질 수 있다. Redis Sorted Set은 왜 Skip List를 선택 했을까? a..

스레드풀을 사용하면서 생긴 궁금증을 정리해보려 합니다.Thread는 Runnable 객체만 실행할 수 있는데, ExecutorService(스레드 풀)는 어떻게 Callable 객체도 실행할 수 있을까? public Future submit(Callable task) { if (task == null) throw new NullPointerException(); RunnableFuture ftask = newTaskFor(task); execute(ftask); return ftask;}protected RunnableFuture newTaskFor(Callable callable) { return new FutureTask(callable);}ExecutorService에..

최근 SKT 해킹 사건으로 인해 유심 보호 및 교체 신청이 급증하면서 Tworld 접속 시 대기열이 발생했다.이에 따라 Tworld의 대기열 시스템이 어떤 방식으로 구현되어 있는지 추측해보려고 한다. 흐름 1. 대기열 큐 생성2. SSE 연결3. 대기열 큐 상태 조회 대기열 큐 생성 https://care.tworld.co.kr/api/queue{ "ticketId": "535357ec-2a08-4164-b245-5cbcf3511015", "usersInQueue": 45396, "nextPolling": 10, "status": "IN_WAIT_QUEUE"}HTTP/1.1 200 OK...set-cookie: WEB_SESSION=974c2d4a-6a69-45cd-910c-2e23..
문제패스워드 변경을 서비스 레이어에서 처리할 경우, 서비스 레이어를 우회하여 객체를 직접 생성하는 실수가 발생하면 도메인 내부에 검증된 값이 존재함을 보장할 수 없습니다.특히, 패스워드 암호화와 같은 규칙은 실수로 인해 치명적인 결과를 초래할 수 있으므로, 이러한 실수가 발생할 가능성 자체를 없애고 싶었습니다.@Service@Transactional@RequiredArgsConstructorpublic class MemberService { private final MemberRepository memberRepository; private final CustomPasswordEncoder passwordEncoder; public void save(final MemberSaveReque..
현재 서버에서 Scheduler를 사용하는 중이고 Scheduler가 어떻게 동작하는지 알아 볼려고합니다.단일 스레드에서 스케줄링 작업들을 순차적으로 처리@Configurationpublic class ScheduledTasks { private final Logger log = LoggerFactory.getLogger(ScheduledTasks.class); @Scheduled(fixedRate = 1000) // 1초마다 taskA를 실행합니다. public void taskA() throws InterruptedException { Thread.sleep(10000); // 10초 동안 일시 중단합니다. log.info("taskA - {} - {}", L..
저는 현재 국내 가상화폐 거래소에 *스테이블 코인 가격 알림 서비스를 운영하고 있습니다.가상화폐 거래소는 증권시장과 다르게 거래소마다 독자적으로 운영(상장, 거래, 정산 등)하는 방식이라 거래소마다 서로 다른 API를 제공합니다. 문제는 각각의 거래소가 제공하는 Response가 모두 다르기 때문에, 저희 서비스에서 이를 바로 호환하기 어렵다는 점입니다.*스테이블코인은 달러화 등 기존 화폐에 고정 가치로 발행되는 암호화폐를 말한다. 문제점@FeignClient(name = "Bithumb", url = "https://api.bithumb.com/public")public interface BithumbClient { @GetMapping("/ticker/{symbol}_{currency}") ..

Spring Scheduler를 사용할 때, 같은 작업을 하는 스케줄러가 다중 인스턴스 환경에서 중복 실행되는 문제가 있습니다.이 문제를 해결하기 위해 Quartz, ShedLock 등을 고려할 수 있습니다. 저는 그 중 ShedLock을 선택했는데, 그 이유는 해결하려는 문제가 클러스터 안의 서버 노드 중 스케줄링 작업을 선택하거나 예외 처리 등의 기능이 필요한 것이 아니라, 단순히 중복 작업을 방지하는 데 ShedLock이 충분하다고 판단했기 때문입니다단일 환경에서 중복 실행 문제 위에서 설명한 중복 실행 문제는 모두 다중 인스턴스 환경에서 발생할 수 있지만, 단일 환경에서도 중복 실행 문제가 발생할 수 있습니다.단일 환경에서 운영되는 서버라도 Blue/Green 무중단 배포 상황에서 두 개의 인스턴..
기존 배포 환경의 문제점 기존에는 빌드/배포 자동화를 위해서 Github Action에 Self-hosted Runner를 사용했습니다 하지만 Self-hosted Runner를 사용하면서 여러 불편한점이 있었습니다. 환경 변수 관리 문제 첫 번째로, 환경 변수의 관리가 어려웠으며, 어떤 값이 설정되었는지 알기 힘들었습니다. 단일 장애 지점(SPOF) 발생 두 번째로, 러너를 배포하기 위해 서버에 직접 설치해야 했는데, 이는 러너에 문제가 발생할 경우 단일 장애 지점(SPOF)으로 이어질 수 있습니다. 실제로 배포중에 메모리가 부족해서 서버가 다운되는 경우가 종종 있어서 가상 메모리를 추가했었습니다. 예상 치 못한 문제 추가적으로, 러너가 종료될 때 고아 프로세스들이 함께 종료되어서 서버가 다운되는 문제..
코틀린답게 JPA Entity 작성하기 @Entity public class Parents { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ... } 자바에서는 일반적으로 GeneratedValue를 사용해 id를 설정하며, 별도로 id 값을 초기화하지 않습니다. @Entity data class Parents( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long?, ) { } 하지만 코틀린의 Null Safety 특성 때문에 id를 초기화하지 않고 null 상태로 둘려면 ?를 사용하여 null을 허용해야 합니다. 이는 코틀린의 Null Safety..
- Total
- Today
- Yesterday
- java 17
- ValidateException
- feignClient
- @FormProperty
- BasicBinder
- 레이어드 아키텍처
- @ElementCollection
- entity 검증
- ServletContainerInitializer
- defer-datasource-initialization
- User Scenario
- dto 검증
- HTTPInterface
- DispatcherServletInitializer
- Spring Boot 3
- FormProperty
- WebFlux 의존성
- org.springframework:spring-webflux
- 구글 소셜로그인
- CreationTimestamp
- JPA SQL Injection
- Attribute Converter
- 구글 OpenID
- 유저 스토리
- CreatedDate
- 유저 시나리오
- setDateFormat
- HandlesTypes
- @Converter
- dto 위치
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |