소개
- 주력 언어 또는 기술 : Java, Spring Framework, RxJava, Reactor, Spring WebFlux
- (주)코드스테이츠(https://www.codestates.com)에서 Senior Educational Software Engineer(Backend)로 활동
(From 2022.03 To 2024.01.31)
- 프리랜서 개발자 및 강사로 활동(From 2024.02)
- 저서
안녕하세요? Kevin이라고 합니다. ^^
인프런에서 이렇게 강사로서 여러분들을 만나게 되어서 너무 반갑습니다.
어떤 분야든 마찬가지겠지만 특히나 소프트웨어 개발자는 끊임없이 변화하는 트렌드에 뒤처지지 않도록 항상 자기 자신을 갈고 닦는것이 개발자로써 살아남는 유일한 방법이라고 생각하며 항상 배우는 자세로 즐겁게 소프트웨어 개발을 하고 있는 개발자 중 한 명입니다.
제가 가지고 있는 지식과 경험이 다른 분들에게 조금이나마 도움이 되기를 바라면서 인프런에서 강좌를 시작하였습니다.
앞으로 수강생분들에게 현실적으로 도움이 되는 다양한 강좌로 꾸준히 찾아뵙도록 하겠습니다. 감사합니다.
질문이나 의견은 언제든지 환영하니, 이메일(it.village.host@gmail.com)로 편하게 얘기해주세요.
강의
전체5로드맵
전체1수강평
- 좋은 강의 감사합니다.
김우중
2024.02.01
1
- 너무 옛날기술임
hongregii2
2023.12.12
0
게시글
질문&답변
2024.04.12
Backpressure Example 코드 질문드립니다
안녕하세요? 답변이 조금 늦었습니다. 육아를 병행하고 있어서 답변이 늦어진 점 양해 부탁드릴게요. Backpressure Error 전략은 Downstream 쪽에서 Upstream 쪽의 속도에 대응하지 못할 경우 에러를 발생시키는 전략인데요. 에러가 발생할 때 아래와 같은 에러 로그가 출력됩니다. reactor.core.Exceptions$OverflowException: The receiver is overrun by more signals than expected (bounded queue...) 이 문장에서 bounded queue 가 일종의 버퍼를 의미하는데요. Downstream 쪽에서 내부적으로 데이터를 처리할 때 사용하는 버퍼라고 생각하시면 될 것 같습니다. 그런데 여기서의 버퍼는 Backpressure Buffer 전략에서의 Buffer와 조금 다른 동작을 합니다. Downstream 쪽에서 지연 시간을 짧게 주면 버퍼에 그만큼 더 빠르게 데이터가 쌓이게 되고, 지연 시간을 길게 주었을 때 데이터가 그만큼 천천히 쌓인다고 생각하시면 될 것 같습니다.(내부적으로 버퍼에 쌓이는 동작을 조절한다고 보시면 될 것 같습니다.) Backpressure의 내부 메커니즘을 100 퍼센트 다 이해하고 있다고 한다면 솔직히 거짓말일텐데 아무튼 쉽게 생각해서 다음 데이터를 처리하기 위해 넉넉한 시간을 가질 수 있다면 여유를 가지고 처리를 할 수 있는거라고 생각해주시면 좋을 것 같아요. 데이터를 처리할 준비가 안되어 있는데 무작정 데이터가 들어오면 과부하가 걸릴테니까요. 다만, 이 경우에는 여유는 생기겠지만 처리할 수 있는 데이터의 건 수는 그만큼 줄어들테니 적절한 조건을 찾아야 될테구요. 적절한 답변이 되셨으면 좋겠습니다. 감사합니다.
- 0
- 1
- 37
질문&답변
2024.04.05
Single과 관련해 여쭤보고 싶은 부분이 있습니다!
안녕하세요. 아침에 질문을 확인했는데 일정이 바빠서 답변이 조금 늦어졌네요. ^^ 1. Single은 전통적인 client - server 방식의 요청을 처리하는 데 사용한다고 말씀해주셨습니다. 실제로 회사에서 single.blocking() 이런 방식으로 처리하는 코드를 본 적이 있는데, single을 해당 의도처럼 사용할 경우, 동기처리 방식에 비해 얻는 이점이 있을까요?? 제가 아직 생각하기로는 코드는 리액티브이지만 비동기 방식으로 처리하는 것이 아닌 거 같아서요! --> Single을 전통적인 client - server 방식의 요청을 처리하는데 사용한다 라는 의미는 우리가 일반적으로 사용하는 HTTP request와 response가 하나의 HTTP message로 이루어져 있기 때문에 이걸 처리하기 적합하다는 의미이구요. single.blocking() 방식으로 코드를 본 적이 있다고 말씀해 주셨는데, 여러 개의 비동기 작업이 있어서 이 작업이 다 끝날 때 까지 동기적으로 기다려야 되는 상황이 아닌데 습관적으로 blocking()을 호출하는 방식이라면 바람직하지는 않다고 생각합니다. 즉, 비동기 방식을 습관적으로 동기 방식으로 전환한다면 RxJava 같은 리액티브 라이브러리를 사용하는 의미가 퇴색될 수 있는거라고 생각하시면 될 것 같아요. 또한 강의 영상 3분 정도에서 보여주신 SingleCreateExample 코드에서, 발행자인 Single의 create 메소드의 파라미터인 SingleOnSubscribe 가 구현하고 있는 subscribe가 아래 구독자가 구독하는 subscribe() 와 같은 함수가 맞을까요? 코드적으로는 둘이 연관이 있어 보여서, SingleObserver 와 SingleEmitter 사이의 같은 부모가 있는지 확인 해보았는데 그것두 아니더라구요 ㅠ... 둘이 아예 다른 메소드 인가요?? --> 일단 결론은 다른 메서드인데 서로 연관이 있습니다. (사진): 캡쳐한 이미지의 코드를 보시면 SingleCreate은 Single의 하위 클래스인데요. Single.create()을 호출하면 리턴됩니다. (1)의 SingleOnSubscribe는 (4)에서 subscribe()를 호출하는데 이 때의 subscribe()는 구독자가 구독 즉, subscribe()를 호출하면 데이터를 구독자에게 통지하기 위한 emitter를 전달 받는 역할을 한다고 보시면 될 것 같구요. (2)의 SingleObserver를 포함하고 있는 parent 객체가 (3)과 (4)에 서로 연결이 되는걸 볼 수 있는데요. 이 말은 구독자가 구독하면 발행자가 이 구독을 인지하고 데이터를 구독자에게 전달한다라는 의미와 같다고 보시면 될 것 같습니다. 좀 어렵죠? 코드 내부를 다 이해하실 필요는 없고 리액티브 프로그래밍의 Pub/Sub 모델은 서로 독립적인 관계가 아니라 서로 밀접하게 관계를 맺고 있다라는 사실만 일단 기억하시면 좋을 것 같아요. 4. 코드를 살펴보다가 RxJavaHooks 라는 유틸성 클래스를 발견하게 되었는데, 함수형 인터페이스들이 막 정의되어 있는 것은 알겠는데 어떻게 해석해야 할 지가 감이 안 잡히더라구요 ㅠㅠ... 혹시 코드를 해석하는데 조언을 주실 수 잇으실까요?.. --> Hook이라는 의미는 프로그래밍에서 종종 사용하는 용어인데요. 코드 상의 흐름 중간에 끼어 들어서 추가적인 작업을 한다는 의미입니다. RxJavaHooks를 이용해서 Observable이 생성될 때 로깅, 예외 처리, 디버깅 등의 추가적인 작업을 할 수 있도록 해줍니다. 학습하시는데 도움이 되셨길 바랍니다~
- 0
- 2
- 62
질문&답변
2024.03.29
Backpressure 전략
안녕하세요? 제가 바빠서 답변이 좀 늦었는데, AI 인턴이 먼저 답을 달아주었네요. ^^ 결론부터 말씀 드리자면 drop 되는 데이터는 폐기됩니다. Backpressure의 여러 전략 중 하나라고 생각해 주시면 되구요. 데이터를 drop 시키느냐 그렇지 않느냐는 요구 사항에 따라서 달라 질수 있다고 생각합니다. 일반적으로 데이터 신뢰성이 중요하기 때문에 데이터가 유실되지 않는 쪽이 바람직하겠지만 실시간 데이터 스트리밍 등의 예에서 빠른 응답을 위해 일부 데이터 유실을 허용할 수도 있으며, 시스템의 가용 리소스를 초과하는 데이터의 흐름이 발생했을 때, 과부하가 걸려서 시스템에 문제가 발생하는 것보다는 일부 데이터를 폐기하지만 시스템의 안정성을 유지하는데 도움이 될거라 생각합니다. 답변이 되셨으면 좋겠네요. 감사합니다.
- 0
- 2
- 61
질문&답변
2024.03.03
Flux 와 Mono
안녕하세요? WebFlux라는 이름의 의미에 대해서 질문을 주셨는데요. Reactor라는 리액티브 프로그래밍 기술에서 사용되는 데이터 타입은 크게 Mono와 Flux로 나뉘는데요. Flux는 Mono를 포함하고 있는 개념이기도 해서 아마도 Flux라는 이름을 채용하지 않았나 싶습니다. 단순히 WebFlux라는 이름때문에 Mono를 사용하지 않는다는 의미는 아닙니다. 실제로 일반적인 HTTP 요청/응답에서 가장 많이 사용되는건 Mono입니다. Mono는 데이터를 0건 또는 1건 포함하고 있다고 볼 수 있는데 REST API 기반 애플리케이션을 예로 들면, HTTP 요청 데이터는 한 건의 JSON 데이터이고, 응답 데이터도 한 건의 JSON 데이터인 것이 대부분입니다. Streaming 데이터는 한 건 이상일 수 있기 때문에 Flux를 사용하지만 대부분의 HTTP 요청과 응답은 Mono로 처리됩니다. 제가 드린 답변이 도움 되셨으면 좋겠네요. 감사합니다.
- 0
- 1
- 144
질문&답변
2024.03.03
Spring WebFlux 를 사용하기 적합한 시스템
안녕하세요? Spring MVC 기반의 애플리케이션에 Spring MVC 대신 Spring WebFlux를 사용해도 되는지에 대해서 질문 주셨는데요. 결론부터 말씀드리면 Spring MVC 대신에 Spring WebFlux를 사용해도 상관은 없습니다. 다만, Spring MVC는 기본적으로 Blockin I/O 기반이기 때문에 단순히 Spring MVC 대신에 Spring WebFlux를 사용하더라도 네트워크 요청이나 DB 요청까지 Non-Blocking I/O 기반이 아니라면 완벽하게 Non-Blocking I/O 방식으로 요청이 처리되지는 않을것입니다. Spring MVC로 감당이 되는 서비스인데 굳이 Spring WebFlux로 변경할 필요는 없을 것 같구요. 미래를 위해서 Spring WebFlux를 점진적으로 도입을 하는건 나쁘지 않다고 생각하지만 처음부터 아예 아무런 분석없이 Spring WebFlux를 바로 도입하는건 조금 고민을 해보아야하지 않을까 하는 생각이 듭니다. 실제로 스타트업에서 Spring WebFlux로 Spring MVC를 대체하는 경우를 보기는 했었지만 그런 케이스가 많을지는 잘 모르겠습니다. 답변이 조금 도움되시길 바래볼게요. 감사합니다.
- 0
- 1
- 197