💪💪💪 최고가 되고 싶다면, 최고의 강사에게 배워야 합니다 💪💪💪
안녕하세요. UC Berkeley에서 💻 컴퓨터 공학(EECS)을 전공하고, 실리콘 밸리에서 15년 이상을 소프트웨어 엔지니어로 일해왔으며, 현재는 실리콘밸리 빅테크 본사에서 빅데이터와 DevOps를 다루는 Staff Software Engineer로 있습니다.
🧭 실리콘 밸리의 혁신 현장에서 직접 배운 기술과 노하우를 온라인 강의를 통해 이제 여러분과 함께 나누고자 합니다.
🚀 기술 혁신의 최전선에서 배우고 성장해 온 저와 함께, 여러분도 글로벌 무대에서 경쟁할 수 있는 역량을 키워보세요!
🫡 똑똑하지는 않지만, 포기하지 않고 꾸준히 하면 뭐든지 이룰수 있다는 점을 꼭 말씀드리고 싶습니다. 항상 좋은 자료로 옆에서 도움을 드리겠습니다
직무 데이터 엔지니어 / SRE / DevOps / Architect
경력 15년+
현직 실리콘밸리 빅테크
미국 취업 성공기
처음 미국 땅을 밟던 날의 설렘과 불안함이 여전히 생생하게 떠오릅니다! 기대와 흥분도 잠시, 과연 이 곳에 내가 발을 디디고 일할 수 있는 곳이 있을까 두렵기도 했는데요. 책을 읽고 격려의 말을 메모장에 적으며 매일을 견뎠답니다.
어느덧, 저는 실리콘밸리 빅테크에서 매일 34B의 이벤트를 처리하고, 10PB 이상의 데이터를 다루고, 100TB 메모리를 활용하는 거대한 데이터 팀에서 일하고 있습니다. 새로운 도전과 난해한 문제를 끊임없이 마주하지만, 누구보다 민첩하게 신기술을 개발하고 실무에 적용하는 멋진 동료들과 덕분에 정말 즐겁게 업무에 임할 수 있습니다.
그 밖에도 취미로 유튜브/인프런을 통해 빅데이터 및 DevOps/SRE(Site Realiability Engineer) 관련 기술 강의를 제작하며, 각 레벨에서 필요한 지식을 전달하며 함께 성장하는 즐거움으로 일상을 채웁니다.
멘토링 카테고리
제 전문분야인 데이터 엔지니어링과 DevOps을 중심으로 멘토링을 진행합니다. 주로 취업/이직/유학을 많이들 물어보시는데, 사실 이 모든 커리어 전환의 핵심은 각 포지션의 최소~최대 요구조건이 무엇이냐에 달려있습니다.
대략적 가이드라인을 드리면 아래와 같습니다.
- 취업/이직: 현재 기술 실력, 경험, 이력서, 취업이나 이직의 목적
- 유학전략: 나이, 전공, 가고자 하는 대학, 집안의 서포트
막연함 대신 전략과 노하우가 연봉상승의 핵심
충분히 실력과 가능성이 있는 분들이 무엇부터 시작해야 하는지 막연함을 느끼며 아까운 시간만 보낼 때, 적절한 멘토링이 원하는 방향을 찾고 나아가는 추진력이 되는 것을 보았습니다.
현지에서 실제로 취업/이직을 하며 여기까지 오며 쌓은 경험와 노하우, 다양한 동료에게 들은 성공담과 전략을 공유하고, 해외 취업을 위한 용기를 드리려 합니다.
연봉에 대해 많이 물어보시는데, 지역마다 다르지만 실리콘밸리 기준 인턴(주니어) 초급 연봉은 대략 150,000불(1억 8천만원)정도입니다. 현재 제가 받는 연봉은 캘리포니아에서 충분히 자가를 구매할 수 있는 정도라고 보시면 됩니다. 조금만 자랑을 하자면, 집 근처에는 고 스티브잡스의 집이 있고, 아침이면 실리콘밸리를 이끄는 IT기업 리더들이 자전거를 타거나 커피 마시는 모습을 심심치않게 볼 수 있는 재밌는 동네입니다.
멘토링 방향 예시/소요시간
- 기술/커리어 상담
- 현재 기술 수준 파악 + 개인 목표를 위해 필요한 스킬/커리어 세팅 및 전략과 실제 사례 공유 (1시간)
- 시뮬레이션
- 코딩 테스트/피드백 (최소 1시간)
- 모의 영어 면접 (최소 1시간)
- 프로젝트 조언
- 비영리 목적 프로젝트/취업 포트폴리오에 대해서 방향이나 기술 조언 (최소 1시간)
- 기타 상담/조언
- 미국 취업 자체에 대해 아직 확신이 없고, 뭐부터 시작해야 할 지도 모르겠는 경우(최소 1시간)
- 전략과 방향성은 수립했지만 여전히 막막해서 격려가 필요하신 분(최소 1시간)
신청 방법/진행 방식
서로에게 주어진 짧으며 값비싼 시간을 최대한 유용하게 사용하고 싶습니다. 아래의 링크를 통해 멘토링을 작성하시고, 저에게 많은 것을 묻고 최대한의 것을 얻어가시길 바랍니다!
- 양식 작성 (https://forms.gle/NLDqfJzBBbP2arhz8)
- 확인 후 준비 과정 및 시간 조율
- 전달된 Google Meet으로 멘토링 진행
멘토 이력/강의
강의
로드맵
전체 3수강평
- 실리콘밸리 엔지니어와 함께하는 Docker
- 실리콘밸리 엔지니어와 함께하는 Redis
게시글
질문&답변
저만 안 되는 것인가요? ㅠㅠ
안녕하세요 Inhwa Choi님,localhost를 사용할 때 어떤 운영체제에서는 0.0.0.0이 되고, 어떤 운영체제에서는 127.0.0.1이 되는 이유는 운영체제의 네트워크 설정 방식과 특정 소프트웨어의 기본 바인딩 주소 차이 때문입니다.운영체제 자체는 일반적으로 localhost를 127.0.0.1로 해석하지만, 특정 네트워크 설정이나 애플리케이션의 기본 바인딩 방식에 따라 0.0.0.0이 될 수도 있습니다.이를 확실히 구분하려면 /etc/hosts 파일과 애플리케이션의 네트워크 바인딩 옵션을 확인하는 것이 중요합니다.차이는 없으니, 별로 신경쓰지 않으시고 되는 걸로 하시면 됩니다 ㅎㅎ
- 0
- 2
- 19
질문&답변
standalone_celery 에만 작성된 task 들은 호출할 수 없나요?
안녕하세요 jh1one님,좋은 질문입니다. standalone_celery에 작성된 task를 실행하려면 해당 Docker 컨테이너 내부(standalone_celery)에서 실행해야 합니다. Django는 기본적으로 PYTHONPATH를 자동으로 설정해 주기 때문에 Python REPL에서 바로 import할 수 있지만, standalone_celery에서는 강의에서 설명한 대로 다소 어려울 수 있습니다. 그러나 PYTHONPATH를 적절히 설정하면 Python REPL에서도 동일하게 실행할 수 있습니다.그리고 standalone_celery 에 main.py 보시면 어떤 Task가 어디 Queue에 할당되어 있는지 나와있을 겁니다.제 팁으로는 조금 강의 더 들으시다가 Flower API를 사용하시는게 더 쉬우실 겁니다 😄마지막으로 Celery 의 task 에 작성된 함수들이 queue 로 실행된다은 거의 맞는 말입니다.밑에 AI인턴이 설명한대로, Queue에 Task가 설정되고, 그 Queue를 듣고 있는 Celery worker가 Task를 처리합니다.
- 0
- 2
- 40
질문&답변
index join 에 대한 질문
안녕하세요 junha.park님,Elasticsearch에서는 밑에 AI가 얘기한 것처럼 기본적으로 index 간 join을 지원하지 않습니다.Elasticsearch는 RDB처럼 join을 할 수 없기 때문에 데이터 중복을 감수하고 index를 설계하는 것이 일반적입니다. 이를 Document Denormalization이라고 합니다.따라서 dogs와 men 데이터를 하나의 document로 저장하는 방법이 가장 효율적입니다.{ "dog_name": "Buddy", "owner_name": "John", "owner_id": 123 } 이렇게 하면 하나의 index에서 바로 검색이 가능하므로 주인이 있는 개 vs 없는 개 비율을 쉽게 분석할 수 있습니다.또한 밑에 말한 것처럼 Kibana에서 Vega(데이터 시각화 DSL) 또는 Lens를 사용하여 두 개의 index를 조합해서 분석할 수 있다고 하는데 제가 안해봐서 뭐라 말씀을 못 드리겠네요.https://www.elastic.co/guide/en/kibana/current/vega.html 한번 보시면 도움이 될 것 같네요.
- 0
- 2
- 37
질문&답변
Logging 질문
안녕하세요 ansghltjd9님,Django의 runserver를 실행할 때 자동으로 리로드(Auto-reload)가 발생하는 이유는 django.utils.autoreload가 파일 변경을 감지하는 방식 때문입니다.Django의 개발 서버 (runserver)는 코드 변경을 감지하여 자동으로 재시작하는 기능이 있습니다. 이 기능은 django.utils.autoreload 모듈을 사용하여 특정 디렉터리의 파일 변경 여부를 감지합니다. 파일의 변경을 감지하는 주요 방식은 다음과 같습니다.파일의 수정 시간 (mtime) 감지Django는 실행 중인 Python 파일들의 mtime (modified time, 수정 시간)을 주기적으로 확인합니다.mtime이 변경되면 Django는 이를 코드 변경으로 간주하고 자동으로 리로드합니다.sys.modules를 이용한 파일 추적Python이 로드한 모든 모듈 (sys.modules)을 순회하면서 해당 파일의 변경 여부를 확인합니다.로그에서 보시면 ...{ "asctime": "2025-02-14 20:41:50,823", "levelname": "DEBUG", "name": "django.utils.autoreload", "message": "File C:\\Users\\moon\\miniforge3\\envs\\workout\\Lib\\site-packages\\PIL\\__init__.py first seen with mtime 1739352505.781736" }Django가 PIL (Pillow 라이브러리)의 __init__.py 파일을 감지하고, 이 파일의 mtime 값(1739352505.781736)을 처음 인식했다고 로그에 남겼습니다. 보기가 불편하시다면 자동 리로드 기능을 끄고 실행하는 방법도 있습니다.python manage.py runserver --noreload이렇게 하면 django.utils.autoreload가 동작하지 않으므로, 불필요한 리로드를 방지할 수 있습니다.
- 0
- 1
- 28
질문&답변
섹션2 ["환경 vs. 설정 vs. 구성"] 강의 자막 문의
안녕하세요 티읕이응님,예리하시네요 ㅎㅎㅎ 디자이너 님이 실수하신 것 같네요. 말씀하신 점이 맞습니다! 환경 / 구성 / 설정Environment / Configuration / Setting
- 0
- 1
- 31
질문&답변
시스템 디자인 2권이나 머신러닝에 대한 계획
안녕하세요 에반황님,좋은 질문 입니다. 아직까지는 계획에 없습니다. 제가 3권 다 보기는 했는데, 1권 이상은 특정한 산업에 있지 않는 이상 필요가 없어 보이더라구요. 하지만 필요한 자료가 있다 싶으면, 저희의 경험을 중심으로 다시 보충해보겠습니다.
- 0
- 1
- 25
질문&답변
파이썬 data insert to table
안녕하세요 hunter님,현재 코드에서는 executemany()를 사용해 Hive 테이블에 한 줄씩 데이터를 삽입하고 있습니다. 한 줄씩 삽입하는 방식(INSERT INTO VALUES)은 비효율적이며, 파일 단위로 한 번에 적재하는 것이 훨씬 빠릅니다. executemany() 대신 데이터를 CSV 또는 Parquet 파일로 저장한 후, Hive에 로드하는 방식이 더 적절합니다. 그리고 Google Sheets 데이터를 CSV로 변환하여 로드하는 것이 훨씬 빠를 수 있습니다 - get_all_values()는 전체 데이터를 한 번에 가져오므로 데이터가 많을 경우 속도가 느려집니다. 흠... 마지막으로 df.loc[i]를 사용한 반복문은 매우 비효율적이며, 성능을 크게 저하시킵니다. itertuples()을 사용하면 속도가 훨씬 빨라집니다.data = [ (row.a, row.b, row.v, row.d, row.e, row.f, row.g, row.h, row.i) for row in df_hc_list.itertuples(index=False) ]근데, 제가 하이브를 여기서 가르쳐드렸나요? 기억이...
- 0
- 2
- 38
질문&답변
multi node로 띄우는 상황에서 궁금증이 생겨 질문을 남깁니다
안녕하세요 가보자!!님,Docker Compose를 프로덕션 수준으로 구성하려니 해야 할 일이 많네요. Nginx를 설정하여 로드 밸런싱(Client acess)을 구현해야 하고, 인증서 관련 문제(TLS 적용, RBAC 활용, 인증서 개별 적용)도 해결해야 하며, 각 노드별 역할(Master, Data, Ingest, Coordinating Node)도 명확히 지정해야 할 것 같습니다. 또한, 보다 많은 컨테이너가 필요할 것으로 보이네요.아쉽지만 Compose로는 완벽한 Fault Tolerance를 만들기는 힘들어 보입니다.
- 0
- 4
- 43
질문&답변
동시성 관련되어 궁금증이 생겨 질문을 남깁니다
안녕하세요 가보자!!님,네, 그렇습니다.특정 시점에서 조회한 seq no와 primary term을 유지하고, 업데이트 요청 시 함께 보내서 변경된 데이터가 없을 때만 업데이트가 적용되도록 보장해야 합니다.
- 0
- 1
- 35
질문&답변
multi node로 띄우는 상황에서 궁금증이 생겨 질문을 남깁니다
안녕하세요 가보자!!님docker-compose파일을 보면 es01에만 포트 포워딩이 되어있는데! 클라이언트와는 es01만 통신을 하는건가요? primary shard는 es02, es03도 될수 있는거 같아서 질문을 남깁니다.-> 네, 현재 docker-compose.yml 파일에서 es01에만 포트 포워딩이 설정되어 있습니다.# Line 92 ports: - ${ES_PORT}:9200즉, 외부 클라이언트(예: Kibana, 애플리케이션)에서 직접 접근할 수 있는 유일한 노드는 es01입니다.es02와 es03은 클러스터에 참여하지만, 외부에서는 접근할 수 없습니다. 그러나 Primary Shard는 es02, es03에서도 생성될 수 있습니다.Elasticsearch의 기본적인 샤드 할당 방식에 따라 Primary 및 Replica Shard는 모든 노드에서 배치될 수 있기 때문입니다. es01노드를 shut down시키면 service unavailable이 되는데! 이렇게 되면 진정한 의미에서의 Fault Tolerance가 안되는거 아닌가 하는 생각이들어서 질문을 남깁니다.(es01이 shut down되면 시간이 지나도 복구가 안되는 상황입니다..) -> es01을 종료했을 때 클러스터가 복구되지 않는 이유는, es01이 유일한 마스터 노드로 동작하고 있기 때문입니다.현재 설정에서 cluster.initial_master_nodes에 es01, es02, es03이 포함되어 있습니다.- cluster.initial_master_nodes=es01,es02,es03이는 클러스터 초기 부팅 시 es01, es02, es03 중 어느 하나가 마스터로 선출될 수 있도록 보장하는 설정입니다. 그러나, cluster.initial_master_nodes는 클러스터를 처음 시작할 때만 사용되고 이후에는 새로운 마스터 노드를 자동으로 선출하지 않습니다.즉, 클러스터가 실행된 이후에 es01이 마스터 노드가 되었고, es01이 죽으면 클러스터는 새로운 마스터를 자동으로 선출하지 못하게 됩니다.아마 es02와 es03에 - node.roles=master,data 를 넣으시면 아마 마스터 후보에 오를 거 같은데, 제가 한번 해봐야 되겠네요.
- 0
- 4
- 43