Kevin
@kevin
수강생
6,576
수강평
271
강의 평점
4.8
주력 언어 또는 기술 : Java, Spring Framework, RxJava, Reactor, Spring WebFlux
(주) 펜타시큐리티 백엔드 개발자로 활동(From 2015.07 To 2022.01)
(주)코드스테이츠(https://www.codestates.com)에서 Senior Educational Software Engineer(Backend)로 활동
(From 2022.03 To 2024.01.31)
- 프리랜서 개발자 및 강사로 활동(Since 2024.02)
- 저서
안녕하세요? Kevin이라고 합니다. ^^
인프런에서 이렇게 강사로서 여러분들을 만나게 되어서 너무 반갑습니다.
어떤 분야든 마찬가지겠지만 특히나 소프트웨어 개발자는 끊임없이 변화하는 트렌드에 뒤처지지 않도록 항상 자기 자신을 갈고 닦는것이 개발자로써 살아남는 유일한 방법이라고 생각하며 항상 배우는 자세로 즐겁게 소프트웨어 개발을 하고 있는 개발자 중 한 명입니다.
제가 가지고 있는 지식과 경험이 다른 분들에게 조금이나마 도움이 되기를 바라면서 인프런에서 강좌를 시작하였습니다.
앞으로 수강생분들에게 현실적으로 도움이 되는 다양한 강좌로 꾸준히 찾아뵙도록 하겠습니다. 감사합니다.
질문이나 의견은 언제든지 환영하니, 이메일(it.village.host@gmail.com)로 편하게 얘기해주세요.
강의
클립
전체 1로드맵
전체 1수강평
- [기초 1편] OpenClaw.AI 마스터 클래스: Gemini와 Docker로 만드는 나만의 자율형 AI 에이전트
- [기초 1편] OpenClaw.AI 마스터 클래스: Gemini와 Docker로 만드는 나만의 자율형 AI 에이전트
- [Java 실무 프로젝트 입문편] 객체지향 사고력 훈련 - 미니 프로젝트 3종 실습
게시글
질문&답변
auth-profiles.json 내 google_api_key 하드코딩 제거시 오류
결론부터 말하면, 이 현상은 auth-profiles.json은 비워도 되는데, 실제 컨테이너 안에서는 API 키 환경변수를 못 보고 있는 상태일 가능성이 가장 큽니다.해결을 위해서 제일 먼저 WSL2 Ubuntu → Docker 컨테이너 안까지 키가 제대로 전달됐는지 순서대로 확인해 보셔야 합니다.- 추측만 해보면, 진수님이 echo로 확인하셨다는게 아마도 윈도우즈에서 Ubuntu(WSL2의 Ubuntu)를 열어서 API 키가 출력되는걸 확인하셨을 가능성이 높아보여요.- 좀 헷갈리긴 하실텐데 실제로 echo로 확인해야하는 곳은 WSL2에서 돌아가는 Ubuntu가 아니라 도커 컨테이너 내부에서 돌아가는 리눅스 OS(데비안)인데요. 이건 아래에서 어떻게 확인하는지 가이드를 남겨 놓을게요.먼저 정리하고 싶은 점은, 이 강의에서는 Windows 시스템 환경변수는 전혀 쓰지 않고(이건 당연히 그렇게 하셨을거라 생각해요),반드시 WSL2 Ubuntu 터미널에서만 API 키를 export 해서 사용합니다.# WSL2 Ubuntu 터미널 안에서 vi로 ~/.bashrc 열어서 export GEMINI_API_KEY="your-real-key" echo $GEMINI_API_KEY # 여기까지는 WSL 세션 안에서만 유효여기서 echo로 값이 보이면 “WSL2 셸 안에는 잘 들어갔다”는 뜻이지만,OpenClaw는 Docker 컨테이너 안에서 돌아가기 때문에, 컨테이너 내부 환경변수에 이 값이 들어왔는지를 따로 확인해야 합니다.1) docker-compose.yml에서 컨테이너로 환경변수를 넘기는지 확인docker-compose.yml의 environment: 블록에 API 키를 넘겨주는 설정이 있는지 먼저 확인해 주세요. 예를 들어:services: openclaw-gateway: environment: - GEMINI_API_KEY=${GEMINI_API_KEY}이 항목이 없다면, WSL2에서 export를 해도 컨테이너 안으로는 키가 전달되지 않습니다.이 상태에서 auth-profiles.json의 "key": ""로 비워두면, 파일에서도 못 찾고 env에서도 못 찾아서 “API 키가 없다”고 에러를 내는 게 정상 동작입니다.2) 컨테이너 내부에서 실제로 환경변수가 보이는지 확인WSL2의 Ubuntu가 아닌 도커 컨테이너 안의 리눅스(데비안)에서 직접 echo로 확인해 보시면 가장 확실합니다.# WSL2 Ubuntu에서, 컨테이너 안으로 들어가기 docker compose exec openclaw-gateway /bin/bash # 컨테이너 내부로 들어오면 `node@0ec632f45846:/app$` 이런식으로 입력창이 바뀜 # 컨테이너 내부 셸에서 API 키 확인. node@0ec632f45846:/app$ echo $GEMINI_API_KEY여기서 실제 키 문자열이 출력되면 → 컨테이너 내부까지 env가 잘 전달된 상태입니다.아무 것도 안 나오면 → 아직 컨테이너 안에는 키가 없는 상태이고,environment:가 빠졌거나,키를 export한 뒤 컨테이너를 재시작하지 않았거나,export를 다른 셸(다른 WSL 세션)에서 한 경우일 수 있습니다.그리고 정상적으로 WSL2에서 export 하고, docker-compose.yml 파일에서 environment:로 환경변수를 넘겨주는 설정을 했더라도 열려있는 Ubuntu 터미널 창을 완전히 껏다가 다시 열어서 확인하는게 혼선을 줄이는 방법입니다.환경변수 설정을 바꾼 뒤에는:docker compose down그리고, WSL2의 Ubuntu 터미널 창을 완전히 닫고 다시 열어서,docker compose up -d로 게이트웨이를 다시 올리는게 가장 확실합니다.3) auth-profiles.json과의 관계auth-profiles.json에서 "key": ""로 비워두면,“프로파일 파일에는 키를 하드코딩하지 않고, 환경변수에서 가져오겠다”는 의미가 됩니다.그래서:컨테이너 안 환경변수에 GEMINI_API_KEY 가 제대로 들어와 있으면 → key: "" 상태에서도 정상적으로 동작합니다.반대로 컨테이너 안에서 echo $GEMINI_API_KEY가 비어 있다면 → OpenClaw 입장에서는 “정말로 키가 없다” 상태라서, key에 직접 값을 넣을 때만 작동하는 것처럼 보이게 됩니다.정리하면,WSL2 Ubuntu에서만 export 하는 것이 맞고, Windows 환경변수는 사용하지 않습니다.docker-compose.yml의 environment:로 API 키를 컨테이너에 넘겨주는지 확인해 주세요. 그 다음 docker compose exec openclaw-gateway /bin/bash로 컨테이너 안에 들어가서 echo $GEMINI_API_KEY 명령이 실제 키를 출력하는지 확인해 보시면, 왜 key: ""에서 오류가 나는지 바로 원인을 찾을 수 있을 거예요.이렇게 확인해 보시고, 컨테이너 안 echo 결과와 docker-compose.yml의 environment: 부분을 스크린샷으로 보내주시면, 필요한 경우 그 상태를 기준으로 한 번 더 같이 봐 드릴게요.
- 0
- 2
- 24
질문&답변
docker - WSL 2 distro could not be found 오류
진수님, 안녕하세요? 아래 AI 인턴이 답을 잘 해놓았는데 다시 한번 답변 남겨놓겠습니다.같은 증상을 겪는 경우가 꽤 있어서, 걱정하실 만한 오류는 아니에요.한마디로 말하면, 재부팅 이후에 “Docker Desktop ↔ WSL2(Ubuntu)” 연결이 잠깐 끊겼다가, Refetch로 다시 붙은 상황입니다. WSL2 Ubuntu 안에서 docker compose up -d를 실행할 때The command 'docker' could not be found in this WSL 2 distro.We recommend to activate the WSL integration in Docker Desktop settings.이 메시지가 뜨는 이유는, WSL 쪽에서 docker 명령을 못 찾을 때 나오는 표준 안내입니다.주로 다음 상황에서 발생합니다.Docker Desktop은 켜져 있는데, 해당 Ubuntu 배포판에 대한 WSL Integration이 꺼져 있거나,Windows/Docker Desktop/WSL 업데이트 이후에 “어느 WSL 배포판과 연동할지” 정보가 잠깐 꼬였을 때.말씀하신 것처럼Docker Desktop → Settings → Resources → WSL integration 에서 Refetch distros를 누르면,Docker가 다시 한 번 “현재 설치된 WSL 배포판 목록”을 스캔하고, 그 배포판(Ubuntu 등)에 docker 클라이언트를 다시 연결해 줍니다.그래서 버튼 한 번으로 해결된 거고, 동작 자체는 정상이에요. 앞으로 같은 증상이 다시 나올 수 있어서(저는 OpenClaw이외에 윈도우즈나 도커 데스크탑은 업데이트를 자주 하는편이 아니라 아직 발생하지 않았을수도 있습니다), 그럴 때는 아래 순서대로 확인해 보시면 됩니다.Docker Desktop이 먼저 실행 중인지 확인합니다. (시스템 트레이 고래 아이콘이 Running 상태인지)WSL2 Ubuntu 터미널에서 docker --version을 쳤을 때, 같은 에러가 나오면 WSL Integration 문제로 봐도 됩니다.Docker Desktop → Settings → Resources → WSL integration에서“Use WSL 2 based engine”이 켜져 있는지,사용 중인 Ubuntu 배포판 옆 토글이 켜져 있는지 확인하고, 이상하면 Refetch distros 후 다시 체크합니다.필요하면 PowerShell에서 wsl --shutdown으로 WSL을 한 번 완전히 끄고, Docker Desktop을 재시작한 뒤 Ubuntu 터미널을 다시 열어 봅니다.정리하면, 이번 오류는 환경설정이 망가진 게 아니라, 재부팅/업데이트 이후에 WSL 연동이 잠깐 끊긴 것에 가깝고,지금처럼 WSL Integration 탭에서 다시 연결해 주면 정상입니다. 같은 현상이 반복되면 위 체크리스트를 한 번씩 따라가 보시면 됩니다.감사합니다.
- 0
- 2
- 37
질문&답변
도커 오류발생
안녕하세요 정호님.질문주신 내용에 대한 답변을 드려보겠습니다. openclaw-gateway 설정은 지금 강의에서 안내드린 구조(demo/config, demo/workspace)랑 잘 맞게 작성해 주셨어요.말씀하신 “Docker Desktop Files 탭에서 접속이 됐다 안 됐다 한다”는 증상은, Mac용 Docker Desktop이 호스트 폴더를 마운트할 때 생기는 이슈일 가능성이 큽니다.현재 .env를 보면:OPENCLAW_CONFIG_DIR=./config OPENCLAW_WORKSPACE_DIR=./workspace이렇게 상대 경로로 되어 있습니다.이 자체는 “반드시 demo 폴더 안에서 docker compose up을 실행한다”는 전제에서는 괜찮은데,Mac에서는 다음 두 가지 때문에 문제가 생길 수 있어요.docker compose up을 실행한 위치가 demo 폴더가 아닐 때예를 들어 상위 폴더에서 docker compose up을 실행하면,Docker 기준 ./config, ./workspace는 다른 실제 위치를 가리키게 됩니다.이 경우, 컨테이너에 마운트된 경로가 계속 바뀌면서 Files 탭에서 폴더가 보였다 안 보였다 할 수 있습니다.demo 폴더 위치가 Docker Desktop의 File sharing 허용 범위 밖일 때Docker Desktop → Settings → Resources → File sharing에서demo 폴더가 위치한 상위 경로(예: /Users/계정명/Projects 등)가 공유 허용으로 등록되어 있지 않으면,./config, ./workspace 바인드 마운트가 실패할 수 있습니다.이 때도 Files 탭에서는 마치 접속이 불안정한 것처럼 보일 수 있습니다.그래서 아래 순서로 한 번 점검해 보시면 좋겠습니다:항상 demo 폴더 안에서만 실행하기cd /Users/내계정명/path/to/demo docker compose down docker compose up -d openclaw-gateway이렇게 하면 .env에 있는 ./config, ./workspace가 항상 demo/config, demo/workspace를 정확히 가리키게 됩니다.Docker Desktop File sharing 설정 확인 (Mac 전용)Docker Desktop → Settings → Resources → File sharing에서demo 폴더가 들어 있는 상위 경로(예: /Users/내계정명/Dev, /Users/내계정명/Documents 등)가 목록에 포함돼 있는지 확인해 주세요.없다면 추가 후 Apply & Restart를 눌러 Docker를 재시작합니다.Files 탭에서 보는 경로 확인컨테이너 내부 기준으로:/home/node/.openclaw → demo/config와 연결 (설정, 내부 workspace 등)/home/node/workspace → demo/workspace와 연결 (실제 강의에서 쓰는 작업 폴더)Files 탭에서 주로 /home/node/workspace 아래를 보시고,demo/workspace에 파일을 하나 만들어서 양쪽에서 같이 보이는지 확인해 주세요.이렇게 했을 때도 Files 탭 접속이 계속 들쭉날쭉하다면,Mac Docker Desktop 버전 문제나, iCloud/보안 소프트웨어 쪽 간섭 가능성도 있을텐데,docker-compose logs -f 명령으로 오류 메시지가 표시되는게 있는지 확인해보시고, 오류 메시지를 보여주시면 다시 한번 분석을 해보겠습니다. 해결 되시길 바랄게요!감사합니다!
- 0
- 3
- 133
질문&답변
예제
Sol님, 안녕하세요?노션 문서를 PDF 문서로 변환하는 과정에서 글자가 잘린것을 확인했습니다.PDF 문서를 업데이트 해놓겠습니다.우선 노션 문서의 링크 자체에 접근 가능하도록 해드릴테니, 아래 링크로 접속하셔서 문서 확인하시면 되겠습니다. Stream API 강의 자료 및 연습문제 링크 https://www.notion.so/section1-class03-Stream-API-e2177c8ca10e469bb80f145ad7a01a3a?source=copy_link불편을 드려서 죄송합니다!
- 0
- 2
- 48
질문&답변
자바 2탄 3탄 커리큘럼 문의
안녕하세요? 추석 연휴는 잘 보내셨나요? 답변이 좀 늦어서 죄송하고 좋은 질문 해 주셔서 감사합니다. ^^질문 주신 부분들에 대해서 제 의견을 잠깐 말씀 드릴게요. "강사님의 강의 철학과 같이 자바 기본 문법들을 배우고 다양한 예제를 단계별로 풀어보며 비로소 왜 이렇게 돌아가는지 메커니즘이 궁금할때 위에 딥한 강의를 찾아보는게 낫다고 생각이 듭니다"--> 프로그래밍 언어를 배울때 일반적으로 두 가지 방식의 학습 방법이 있다는건 잘 알고 계실거에요. 하나는 특정 프로그래밍 언어의 문법 및 사용법 위주의 강의나 책을 모두 완강 또는 완독하고 난 후에 다음 스텝을 밟는것. 또 하나는 일단 아주 최소한의 사용법만 익힌 뒤 간단한거라도 만들어 보면서 막히는 부분이 있으면 다시 책을 찾아보면서 막히는 부분을 해결하면서 앞으로 나아 가는 것.둘 중에 어떤게 더 낫다 그렇지 않다라고 말씀 드리긴 어렵겠지만(사람마다 자신에게 맞는 학습 방법이 다를테니까요) 제 경험상 후자 쪽이 흥미를 잃지 않고 성장하기가 더 쉬운 것 같았습니다.그래서 Java 관련 미니 프로젝트 강의를 만들고 있는 중이구요. 요즘엔 한국인들도 영어로 잘 말하는 분들이 많지만 제가 영어를 배울때만 해도 문법 위주로 영어를 배웠는데 결국 외국인들 만나서 말 한마디 못하고, 외국인이 말하는 내용을 알아 듣지도 못하는 그런 상태가 되어버렸는데요. ^^;프로그래밍 언어도 우리가 배우는 영어라는 언어를 배우는것과 꽤나 비슷한 것 같더라구요.기본 문법이나 고급 기법을 배워도 이걸 이용해서 아주 작은 애플리케이션이라도 만들어보지 않으면 이걸 왜 배우고 어디에 써먹을 수 있는지 깨닫기 어렵다는 사실은 프로그래밍을 배우는 많은 분들이 느끼는 고민이라고 생각합니다.영어로 자신 있게 말할 수 있다는건 Java로 내가 생각하는대로 구현을 할 수 있다는 말과 같은 것 같고, 영어를 잘 알아 듣는다는 건 다른 사람이 짠 코드(Chat GPT 같은 AI 포함)를 잘 이해할 수 있다는 말과 비슷한것 같아요.이런 이유때문에 제 강의 수강생 인원이 적긴하지만 나름 현실적으로 도움이 될만한 괜찮은 강의라고 생각하고 있습니다. ^^; "혹시나 이 소인의 의견을 긍정적으로 보시고 관련된 내용이 반영 된다면 제발 주니어 입장에서 자세한 설명과 쉬운거 부터 단계별로 다양한 문제로 부탁 드립니다"--> 1부 강의의 세 가지 애플리케이션을 다 만들어보셨는지는 모르겠지만 1부 강의에 나오는 애플리케이션만 만들어 보셔도 나중에 웹 애플리케이션을 만들 때 Java의 왠만한 문법들은 잘 사용을 하실거라고 생각해요. 결론은 1부 강의가 제일 쉬운 단계입니다. ^^; 그것보다 더 쉬운건 실무적으로는 도움이 안될 거 같아서 제외한 부분도 있습니다. ^^; 2부 같은 경우에는 이번달에 오픈 예정인데 굉장히 중요한 주제로 프로젝트를 진행할 예정이에요. 태경님 주변을 돌아보면 '주문'과 관련된 서비스가 굉장히 많다는걸 아실 수 있을텐데요. 예를 들면 배달 앱, 쇼핑몰, 오픈 마켓, 티켓 예매 등등 무수히 많은 서비스가 무언가를 주문하는 시스템이죠. 그래서 주문이라는 도메인을 활용해서 어떤 애플리케이션을 직접 만들어보는건 굉장히 중요하다고 생각합니다.참고로 2부 강의는 1부 강의보다는 조금 더 난이도가 있기때문에 1부에서 구현에 대한 기본기를 잘 쌓으신 다음에 수강하시는게 머리가 덜 아프지 않을까 하는 의견드립니다. ^^; 3부는 위에서 태경님께서 잠깐 언급하셨던 Thread를 어떻게 활용할 수 있는지 왜 사용하는지에 대한 부분이 포함된 애플리케이션을 만드는 강의를 2부 강의 오픈 후에 순차적으로 오픈할 예정이에요.JavaFX를 이용해서 UI가 있는 굉장히 재미있는 애플리케이션을 만들어 볼 예정입니다. "마지막으로 ㅇ..이러면 안되지만.. ㅎ..혹시 2, 3탄 ㄹ..론칭 할인 할인 쿠폰을 제공해주실 예정이 있으신가욥..?"--> 쿠폰 제공하는게 그리 어려운 일이 아니라서 가능할 것 같습니다. ㅎㅎ 참고로 오픈때는 할인된 가격으로 오픈을 할 예정이니 가격에 대한 부담은 크지 않을 것 같다는 생각이 드네요.ㅎ그리고 1부 강의보다 2부 강의는 오히려 조금 더 낮게 책정할 예정이에요. 강의 퀄리티가 낮아서가 아니라 Java 입문하시는 분들 입장에서 1부도 중요하지만 2부가 더 중요하다고 판단되어서 혹여나 부담되는 가격때문에 제 강의를 안듣는 케이스를 줄이고 싶은 바램이 있어서 그렇습니다.제가 유명한 강사가 아니다보니 가격이 너무 낮으면 오히려 강의 퀄리티 의심이 따를수는 있겠지만 그건 어쩔 수 없죠. 제 강의 들으신 분들이 잘 판단해 주셔서 좋은 강의라고 말씀해 주시길 바랄 뿐입니다. ㅎㅎ 질문해 주신 부분에 대한 답변이 잘 되었는지 모르겠네요.더 궁금한게 있으시면 언제든지 편하게 말씀해 주세요. 감사합니다~
- 0
- 1
- 60
질문&답변
깃허브 주소 오류
안녕하세요? 불편을 드려서 죄송합니다.'강의 소개 > 학습 자료' 섹션에 총 4개의 Github 링크가 있고, 확인해보니 모두 Public Repository로 잘 연결이 되는데 혹시 어떤 경로로 접속해보니 접속이 안되시는지 여쭤봐도 될까요?
- 0
- 3
- 83
질문&답변
window 예제 1번 request(n) * maxSize 부분을 잘 모르겠습니다.
안녕하세요? 제가 해외에 있어서 답변이 조금 늦어진 점 양해 부탁드리겠습니다. 지금쯤 주무시고 계실것 같은데 여긴 아침이라서 아침 먹고 바로 답변쓰고 있습니다. ^^; 궁금해 하시는 내용이 아마도 window()라는 operator를 어떤 상황에서 적절하게 사용할 수 있는지 라고 생각되어서 이 부분을 말씀드릴게요. 공식 문서에서도 설명이 되어 있지만 window() operator는 upstream의 데이터를 지정된 개수만큼 포함한 flux window로 쪼개어서 downstream에서 처리하도록 한다 라고 나와있습니다.flux window라는건 말 그대로 window라는 단위로 데이터가 포함되어 있는데 이 데이터들을 각각의 flux를 이용해서 개별적으로 처리할 수 있다라는건데요(개별적으로 처리할 수도 있고, List로 변환해서 한꺼번에 처리할 수도 있을테구요).다만, buffer(maxSize) 같은 경우에는 maxSize만큼 데이터를 쪼개서 버퍼에 담지만 Downstream으로 내려줄때 flux가 아닌 List 형태로 내려줍니다.flux로 내려주느냐 List로 내려주느냐는 확연한 차이점이 있습니다.flux를 전달받으면 flux에서 emit되는 개별 데이터를 처리하기 위해 다른 Operator 들을 이용해서 유연하게 처리할 수있고, 비동기적인 처리도 손쉽게 할 수 있기 때문에 buffer 보다 조금 더 상황에 맞는 유연한 처리가 가능하다라고 생각합니다. buffer()는 쪼개어서 List에 담긴 데이터들을 한 번에 모아서 일괄 처리하는데 중점을 둔 operator이기 때문에 window() operator보다는 좀 더 처리가 심플할테구요. 물론 buffer가 아니라 window operator를 이용해서 buffer처럼 데이터를 한번에 일괄 처리할 수도 있을텐데 이 경우에 비동기적으로 처리할 수 있기 때문에 효율성 측면에서 더 나을 수 있다고 생각합니다. 한마디로 buffer는 쪼개어진 데이터에 대한 단순 일괄 처리, window는 단순 일괄 처리 이상의 작업들(비동기 처리, 데이터의 복잡한 가공처리, 지연 처리 등)을 처리할 때 사용한다. 이렇게 생각하시면 될 것 같아요. 답변이 도움 되셨으면 좋겠네요.감사합니다! 좋은 꿈 꾸세요~
- 0
- 2
- 52
질문&답변
subscription signal 에 upstream 으로 이동하는 순서
안녕하세요. 좋은 질문 주셔서 감사드립니다.아래 링크를 보시면 Reactor에서 signal이 어떤 흐름으로 발생하는지 정리가 잘 되어 있는데, 한번 읽어보시면 도움이 되실 것 같아요.https://itvillage.tistory.com/entry/Reactor-Sequence%EC%97%90%EC%84%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-signal%EC%9D%98-%EC%A0%84%ED%8C%8C-%ED%9D%90%EB%A6%84일단 핵심만 간략하게 말씀드리면, Reactor의 Operator는 기본적으로으로 Operator 하나를 Operator 체인에 연결할 때 마다 내부적으로 subscribe()가 한번씩 발생되면서 Upstream 쪽으로 subscription이 전파되는 식으로 전파가 끝나면 데이터가 Downstream 쪽으로 emit 되는 형태로 동작을 하는데요.이 흐름에 맞춰서 Context의 동작도 발을 맞추는 거라고 생각을 합니다.그런데 어떤 Operator 들(특히 Thread 관련된)은 내부 동작이 꽤 복잡해서 위 아래로 왔다 갔다하는 흐름도 보입니다.아무튼 링크에 적힌 내용들 천천히 읽어보시면 도움되실 것 같습니다.감사합니다~
- 0
- 2
- 80
질문&답변
Webflux의 Non-Blocking 특성에 대해 문의 드립니다.
안녕하세요. Non-Blocking에 관해서 질문을 주셨는데요.WebFlux에서 Non-Blocking이라는 개념은,Java에서 쓰레드를 추가로 할당해서 동시성의 형태로 여러 요청을 번갈아 처리하는 구조라기보다는,요청을 처리하는 쓰레드(이벤트 루프)가 특정 작업에 묶이지 않고 자유롭게 움직일 수 있는 상태, 즉 Blocking 되지 않은 상태를 말합니다.즉, Reactor 체인에서 별도의 쓰레드를 사용하지 않아도, Reactor-Netty 서버는 각 요청을 처리하는 흐름이 Blocking되지 않으면 하나의 이벤트 루프 ㅆ레드로도 여러 요청을 빠르게 처리할 수 있습니다.하지만 만약 어떤 요청이 순차적으로만 처리되고, 다른 요청이 기다리는 현상이 발생한다면,그건 보통 요청 처리 로직에서 Blocking 연산이 있거나, CPU 연산이 오래 걸려서이벤트 루프가 다음 요청으로 넘어가지 못하고 쓰레드가 점유된 상태일 가능성이 큽니다.즉, WebFlux의 Non-Blocking은 쓰레드가 작업 도중 Blocking 되지 않게 만드는 처리 방식임을 이해하는 것이 중요하다고 생각합니다.아직 3부를 제작하지 않은 상태여서 Spring MVC와 Spring WebFlux를 비교하는 샘플 테스트에서는 클라이언트에서 단순 for문을 이용해서 요청 처리를 시뮬레이션 했는데요.만약에 실무적으로 쓰레드가 Blocking 되지 않는다 라는 사실을 확인하려면 여러 클라이언트가 동시 다발적으로 요청을 보내는 상황을 만들어야 하고, 서버측 WebFlux 애플리케이션에서도 DB 등의 I/O까지 Fully Non-Blocking하게 처리하는 상황을 만들어서 테스트 해야하는데, 말씀하신 코드를 지금 다 만들기에는 사실상 무리가 있어서 3부 강의 때 말씀드려야 할 것 같아요.이점 양해 부탁드리고, Non-Blocking의 의미는 쓰레드가 Blocking 되지 않게 하는것이지 우리가 알고 있는 멀티 쓰레드 작업 처리 방식처럼 동시에 요청을 처리하는것은 아니라는 사실은 꼭 기억을 해주시면 감사드리겠습니다.
- 1
- 3
- 196
질문&답변
Downstream Mono, Flux가 subscriber인가요?
안녕하세요? Downstream Flux, Mono에 대해서 질문을 주셨는데요.아래 간단한 코드를 예로 들면(Mono도 같은 원리라고 보시면 됩니다.)Flux .just(1, 2, 4) .filter(num -> num % 2 == 0) .subscribe(result -> System.out.println(result));just()는 일반적으로 최초로 데이터를 emit하기 때문에 생산자, Publisher, 발행자로 이해하면 됩니다.그런데 filter() 입장에서는 just()가 Upstream Flux가 되고, 반대로 just() 입장에서는 filter()가 Downstream Flux가 됩니다.이렇게 부르는 이유는 just()와 filter() 같은 Operator들이 리턴하는 리턴 타입이 Mono 또는 Flux이기 때문입니다.즉, filter() 입장에서는 윗쪽에 있는 just()가 리턴하는 Flux를 이용해서 다음 흐름을 이어가기 때문에 just()가 Upstream Flux가 되는 것입니다. 그리고 Subscriber는 내부적으로 좀 복잡한 과정을 거치는데 다 이해하실 필요는 없고, 일반적으로 .subscribe(...) 여기에서 ... 에 해당되는 람다 표현식이 Subscriber라고 이해하셔도 무방할 것 같습니다. 혹시 제 설명이 좀 어려우시다면 just()와 filter() 같은 Operator 내부로 들어가셔서 리턴 타입을 직접 눈으로 확인하시면 좋을 것 같아요. 감사합니다!
- 0
- 1
- 149







