분류 전체보기 799

[Gradle] Lombok 사용 시 'cannot find symbol' 에러 해결

개요 Java17, Gradle을 사용하는 SpringBoot 프로젝트를 새로 생성 후, Lombok을 추가하여 코드를 작성했다. 그리고 간단한 테스트 코드를 작성하여 실행하려는데 아래와 같이 cannot find symbol 에러가 발생했다.  분명 Dependency도 잘 추가했고, @Getter 등 Lombok 관련 코드도 클라이언트 코드에서 문제 없이 작성이 가능했는데 말이다. 위 에러는 SpringBootApplication을 실행할 때에도 위 Lombok 관련 코드가 포함된다면 동일하게 발생했다.  원인 두괄식으로 설명하자면, build.gradle에 implementation으로 Lombok의 의존성은 추가했지만, annotationProcessor로는 Lombok을 추가하지 않았기 때문이었..

Dev 2024.10.02

[Reactive Programming] Debugging

개요 동기식 또는 명령형 프로그래밍 방식은 Exception이 발생했을 때, StackTrace를 확인하거나 의심되는 코드에 Breakpoint를 걸어서 문제의 원인을 단계적으로 찾아갈 수 있어 상대적으로 디버깅이 쉽다. 하지만 Reactor 같은 선언형 프로그래밍 방식은 작업의 대부분이 비동기적으로 실행되기 때문에 디버깅이 쉽지 않다. 그래서 Reactor는 디버깅의 어려움을 최소화하기 위해 몇 가지 방법을 제공한다.   Debug Mode를 사용한 디버깅 Reactor에서는 Hooks.onOperatorDebug() 메서드를 사용하여 디버그 모드를 활성화할 수 있다. 우선, 디버그 모드가 아닐 때 에러 메시지가 어떻게 출력되는지 확인해보자. @Slf4jpublic class Example12_1 { ..

[Reactive Programming] Context

Context란? Reactor에서 Context는 Reactor 구성요소(Operator 등) 간에 전파되는 key/value 형태의 저장소이다. ServletContext, SecurityContext 등과 유사한 개념이다. Downstream에서 Upstream으로 Context가 전파되어 Operator 체인상의 각 Operator가 해당 Context 정보를 동일하게 이용할 수 있음ThreadLocal과 유사하지만, Thread와 매핑되는 것이 아닌 Subscriber와 매핑된다. 즉, 구독이 발생할 때마다 구독과 연결된 하나의 Context가 생성된다. 사용 예시@Slf4jpublic class Example11_1 { public static void main(String[] args) th..

[Reactive Programming] Scheduler

스레드(Thread)의 개념 이해 Reactor에서 사용되는 Scheduler는 Reactor Sequence에서 사용되는 스레드를 관리해 주는 관리자 역할을 한다. 이 Scherduler에 대한 설명에 앞서, 스레드에 대한 개념을 간단히 살펴보자면 다음과 같다. 코어(Core)실제 CPU의 코어를 지칭한다. 일반적으로 이 코어의 개수가 많으면 더 많은 수의 명령을 병렬로 빠르게 처리할 수 있다.  물리적 스레드(Physical Thread) / 논리적 코어(Logical Core) 과거에는 한 코어 당 하나의 물리적 스레드가 존재하여 한 코어가 한 번에 하나의 스레드를 처리할 수 있었다. 인텔에서는 코어 하나로 두 스레드를 처리할 수 있는 기술인 하이퍼스레딩 개념을 도입하여 하나의 코어로 두 가지 스레..

[🥇5 / 백준 31423 / 파이썬] 신촌 통폐합 계획

31423번: 신촌 통폐합 계획첫 번째 줄에 대학교의 개수 $N$이 주어진다. $(2 \leq N \leq 500 \, 000)$ 다음 $N$개의 줄의 $i$번째 줄에 대학교 이름을 의미하는 알파벳 소문자로 이루어진 문자열 $s_i$가 주어진다. 주어지는 대학교www.acmicpc.net 문제극단적인 출산율 감소로 인해 신촌 지역 N개 대학교가 하나의 학교로 통합되었다.기나긴 회의 끝에, 통합된 학교의 이름은 N개 대학교의 이름을 이어 붙여서 정해졌다. 회의에서 통합된 학교의 이름을 정한 방법은 다음과 같다. N개 대학교의 이름 s1,s2,⋯,sN을 일렬로 나열한다. 이후 다음의 과정을 N−1번 반복한다. si,sj가 빈 문자열이 아닌 서로 다른 두 정수 i,j를 고른다. si의 뒤쪽에 sj를 이어 붙인..

[Lv.1 / 프로그래머스 / 파이썬] 카드 뭉치

프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr  풀이 goal에 있는 단어를 순회하며 두 카드 뭉치의 맨 앞에 있는 단어가 일치하는 경우 꺼내서 사용한다.두 카드 뭉치 모두에서 일치하는 단어가 없다면 No를 반환한다.goal을 모두 성공적으로 순회했다면 Yes를 반환한다. 두 카드 뭉치의 맨 앞에 있는 것부터 순차적으로 사용해야 하므로 스택으로 변형하여 pop()을 활용하였다. def solution(cards1, cards2, goal): cards1 = cards1[::-1] cards2 = cards2[::-1] for word ..

[Reactive Programming] Sinks

개요  [Reactive Programming] 리액티브 스트림즈(Reactive Streams)리액티브 스트림즈(Reactive Streams)란? 리액티브 스트림즈란 데이터 스트림을 Non-Blocking이면서 비동기적으로 처리하기 위한 리액티브 라이브러리의 표준 사양이다. 그 구현체로는 RxJava, Reactor, Akkmy-coding-notes.tistory.com 위 리액티브 스트림즈를 설명한 게시글에서 Processor에 대해 언급한 적이 있다. Processor는 Publisher와 Subscriber의 기능을 모두 지니는 클래스인데, Reactor에서도 Processor 인터페이스의 구현 클래스인 FluxProcessor, MonoProcessor, EmitterProcessor 등을 ..

[Lv.2 / 프로그래머스 / 파이썬] 마법의 엘리베이터

프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr  풀이 그리디하게 접근해야 하는 문제이다. 알고리즘은 다음과 같다. 처음 주어진 수의 1의 자리 숫자부터 순회한다.1의 자리 숫자와 다음 자리 숫자를 추출1의 자리 숫자가 5보다 크거나, 5이고 다음 자리 숫자가 5 이상이면 올림 처리그 외의 경우에는 내림 처리결과 반환 def solution(storey): result = 0 while storey > 0: num = storey % 10 # 1의 자리 수 추출 next_digit = (storey // 10) % ..

[Reactive Programming] Backpressure

개요 만약 Publisher가 많은 데이터를 Emit 하는데 Publisher의 처리 속도가 현저히 느려 데이터가 계속해서 쌓인다면 오버플로우가 발생할 수도 있을 것이다. Backpressure는 우리말로 배압, 역압이라고 한다. 이름과 같이, Backpressure는 리액티브 프로그래밍에서 Publisher가 수많은 데이터를 Emit하는 상황에서 과부하가 걸리지 않도록 하는 역할을 한다.  Reactor에서의 Backpressure 처리 방식 Reactor에서의 Backpressure 처리 방식은 크게 두 가지가 있다. 1. 데이터 개수 제어Subscriber가 적절히 처리할 수 있는 수준의 데이터 개수를 Publisher에게 요청하는 방식이다. Subscriber를 상속한 BaseSubscriber를..

[Reactor] Cold Sequence와 Hot Sequence

개요 컴퓨터 시스템에서 사용되는 Cold와 Hot의 의미는 보통 Cold는 어떤 변경점 등을 적용할 때 시스템을 새로 시작(재기동)해야 하고, Hot은 새로 시작할 필요가 없는 것을 의미한다. Reactor에서의 Cold Sequence와 Hot Sequence의 Cold, Hot 역시 이와 비슷한 의미를 내포하고 있다. 설명에 앞서 Sequence의 의미를 되짚어보자면, 위 게시글에서 설명한 것과 같이  Publisher가 emit하는 데이터의 연속적인 흐름을 정의해 놓은 것을 의미하며, 코드로는 Operator 체인 형태로 정의된다.  Cold Sequence Cold Sequence는 Subscriber가 구독할 때마다 데이터 흐름이 처음부터 다시 시작되는 Sequence이다. 이를 마블 다이어그램..

반응형