Profile img

Jaeyeol Lee

@kodingwarrior@hackers.pub · 694 following · 508 followers

Neovim Super villain. 풀스택 엔지니어 내지는 프로덕트 엔지니어라고 스스로를 소개하지만 사실상 잡부를 담당하는 사람. CLI 도구를 만드는 것에 관심이 많습니다.

Hackers' Pub에서는 자발적으로 바이럴을 담당하고 있는 사람. Hackers' Pub의 무궁무진한 발전 가능성을 믿습니다.

그 외에도 개발자 커뮤니티 생태계에 다양한 시도들을 합니다. 지금은 https://vim.kr / https://fedidev.kr 디스코드 운영 중

Blog
kodingwarrior.github.io
mastodon
@kodingwarrior@silicon.moe
Github
@malkoG
  • Hackers' Public 행사 무사하게 진행...
  • cosmoslide 게시글 작성하고 공유되는 일련의 과정 만들어보기
3

마스토돈에서 많이 팔로잉된 상위 100,000명을 추린 서비스인데, 어떤 마스토돈 계정 팔로하면 되는지 오마카세처럼 정리할때 참고가 되는 듯. akkoma는 모르겟다 ㅋㅋ!!!

아는 인스턴스 와다다다 검색하니까 뭐가 나오긴 함

https://most-followed-mastodon-accounts.stefanhayden.com

0
0
0

나는 괜히 위험하게 시리 GitHub PAT 토큰 넘겨주는 GitHub MCP 서버말고, gh cli 명령을 알잘딱 실행해주는 MCP 서버를 원한다.......... gh cli도 충분히 완성도 있고, 출력도 json으로 뽑히는 것도 나름 괜찮다. json 데이터 오가는걸로 잘 다듬으면 괜찮은 물건이 나올 것 같은데, 흠.

0
0
1
0

면접 준비를 조지기 위해..... 면접 준비를 위한 ChatGPT 프로젝트 만들고, 이런저런 핑퐁하다가 시스템 프롬프트도 말아넣었다

당신은 Node.js 풀스택 프로덕트 엔지니어를 채용하는 개발팀장입니다.  
당신은 단순히 기술만 다루는 엔지니어가 아니라,  
제품(Product) 관점에서 문제를 정의하고 해결할 수 있는 미드레벨(5-6년차) 엔지니어를 뽑고 있습니다.  

현재 대화 상대자는 Ruby on Rails/Django 백엔드 경험을 주로 쌓아온 5-6년차 개발자로,  
이제 Node.js(NestJS)를 중심으로 한 풀스택 포지션을 준비하려고 합니다.  

당신의 역할은 이 개발자가 프로덕트 엔지니어로서 준비를 잘 해서 면접을 통과할 수 있도록  
실질적인 코칭을 해주는 것입니다. 즉, 실제 면접처럼 질문을 던지고 답변을 검토하며, 부족한 부분을 채워주는 멘토 역할을 해야 합니다.  

**채용 포지션 요구사항**
- Node.js 런타임과 비동기 처리 모델에 대한 깊은 이해
- NestJS 프레임워크 활용 능력 (모듈화, DI, 미들웨어/파이프/가드)
- RDBMS 설계, 성능 최적화, 트랜잭션 처리
- API 서버 설계 및 REST/GraphQL 경험
- 클라우드 환경 운영(AWS/GCP 등)
- 객체지향/함수형 프로그래밍 패러다임 이해
- 시스템 설계 능력 및 트레이드오프 판단
- 협업 능력 (코드 리뷰, 테스트, CI/CD, PM·디자이너와의 커뮤니케이션)
- 문제 해결 및 제품 감각: 사용자 경험과 비즈니스 요구사항을 고려한 기술적 해석

**특별한 멘토링 지침**
- 면접 질문을 던지고, 답변을 검토하며 피드백할 것
- 부족한 약점이 발견되면, 단순히 지적하지 말고  
  → "이 주제를 블로그 글로 정리해보라"는 형태로 학습 과제로 제안할 것  
  → 글의 구체적 주제/구조(예: 예제 코드, 다이어그램, 비교 분석)를 제시할 것
- 이렇게 하면 학습 + 기록 + 포트폴리오가 동시에 쌓여,  
  면접 시 “저는 이 부분이 약해서 이렇게 공부했습니다”라는 어필 자료가 될 수 있음
- 따라서 피드백은 항상 “학습 → 글쓰기 → 실무 활용”의 순환으로 연결해야 함
1

벌써 이번주 일요일이 해커스펍 오프라인 모임이라니... 시간 진짜 빠르다.....

6
0
0

https://docs.gitbutler.com/features/virtual-branches/stacked-branches

뭐지? GitButler에서도 Stacked Diff이 가능하다고???????? Stacked PR 이 무엇이냐면.... PR 간 선형적인 의존관계를, 앞선 PR이 머지되면 뒤에 있는 PR이 자동으로 rebase되도록 해주는 편의기능..

진짜 직관적이게 잘 만들어졌네...

국내 아티클 중에 stacked diff를 잘 설명한 글이 있는 듯 https://sungjk.github.io/2024/03/17/stacked-diffs.html 요것은 GitButler의 문서 https://docs.gitbutler.com/features/virtual-branches/stacked-branches

Gitbutler에서 Stacked Diff (stacked branch) 기능이 어떻게 동작하는지 볼 수 있다.
1

오라일리 ActivityPub 책이 1회독 했을때는 '음, 이런게 있구나' 하고 넘겼던 것 같은데, 한달 뒤에 cosmoslide 한 사이클 돌게 하고 난 뒤에 읽으면 '아, 이게 이거구나' 할만한 포인트가 많을 것 같다.

5

연합우주에 대해서 홍보할 때, "안전지대"라는 표현이 그나마 적정선이라고 생각하고 있는데 "사이버 불링" 자체에서부터 자유롭다, 객관적으로 합의된 기준에서 만들어진 행동강령에 기반해서 모더레이션이 되기 때문에, 혐오발언을 보지 않아도 된다 정도는 건조한 사실이기 때문이다. 그 외에는 어떻게 영업을 해야하나 고민되는 것들이 있다.

그 중에서도 이런걸 굳이 말해야 하나 싶은 요소가 몇가지가 있는데,

  • 심연을 들여다 보지 않아도 된다 => 심연이라하면 사람마다 생각하는 기준이 각자 다르다. 내가 말하고자 하는 의도는 '인간으로서 선을 넘는 사람들은 없다'이지만, 어떻게 해석하느냐에 따라 자칫하면 엘리트주의처럼 프레이밍이 될 수 있다. 다양성은 존중되어야 하고, 어떤 사람이든 호불호에 상관없이 공개적인 공간에서 어울릴 권리가 있다. (물론, 사회적으로 비난받을만한 문제를 일으켰다면 책임은 져야 한다)
  • 눈살이 찌뿌려지는 정치적인 글을 보지 않아도 된다. => 내가 작성했던 아래 인용한 글에서도 언급했다시피, 정치적인 논의가 오가는 건 피할 수 없다. "정치적인 글을 보지 않아도 된다"라고 얘기하는 것은, 오히려 사회 문제에 무관심하고 싶은 사람들을 모으고자 하는 것 같아서 영 내키지는 않는다.
  • 관심도 없는 쪽 주제의 글들을 굳이 볼 필요도 없다. => 이건 위에서 언급한 것에서 좀 더 포괄적인 맥락이기도 한데, 누군가의 취향이나 다양성을 존중하고 싶지 않은 사람들을 유인하는 것 같아서 영 내키지는 않는다.

본인의 선택에 의해서 결과적으로 그렇게 될 수는 있지만, 내가 말하기에는 선뜻 불편한 것이다. 누군가는 좋아할 요소이긴 하겠지만, 사적으로도 이런 얘기는 굳이 안 꺼내고 있다.


머무는 공간으로서 안전지대라고 하면 너무 추상적이지만, 이게 최선인 것 같다. 컨텐츠는............ 계속해서 아이디어를 쥐어짜내면서 이런게 있다라고는 언급은 하고 있지만, 내가 관심있고 몸 담그고 있는 분야는 하나하나 직접 찾아서 오마카세마냥 추천은 가능하다. 하지만, 내가 몸 담지 않은 분야는 이런 인스턴스가 있다 정도로 언급하는게 한계랄까...

사람들이 다른 SNS를 즐겨하는 이유 중 하나가 도파민을 주는 컨텐츠 때문인 것도 있긴 한데, 이 쪽 우선순위가 높은 사람한테는 어떻게 영업을 해야하나... 이건 아직까지는 해결하기 어려운 문제인 것 같다.

연합우주는 "누구나 안전할 수 있는 공간이다.", "기업에 의해 이용경험이 불쾌해질 염려가 없다.", 그리고 "표준이 공개가 되어있어 다양한 실험이 가능한 공간이다" 정도 포인트만 강조해서 홍보하게 되는 것 같다. 좀 더 다양한 방면으로, 그러면서도 내가 찝찝하지 않게 "이쁘게" 포장해서 영업할 수 있는 방법은 더 없을까....

4

와, 스프레드시트 파일이랑 도큐먼트 파일을 직접 만들어주기까지 한다고????

1
0
0

OSSCA 같이 참여하는 분들 취업/이직하는데 조금이라도 도움되고 싶어서 프로필에다가 testimonial 같은거라도 남겨주고 싶은데, 어떻게 할까 고민하다가 마침 떠오른 사이드프로젝트 아이디어를 어딘가에다가 던졌다.

이제 누가 먼저 만드나 경쟁해보시지 하하

4
0
0
0
0
3
2
1
1

트잇타 사담계도 터지고, 뭔 별의별 되도않는 싸불이 너무 당연하다는듯이 일어나버리니까 이렇게 된 이상 연합우주로 트친들을 전부 데려와야겠다는 사명감이 생겼다(?)

8

수많은 논의 및 고민 끝에 대기자 명단에 등록되신 5명 중 2명을 선정했고 그 외의 분들에게는 환불조치를 했습니다. 다음 회차에는 선착순 신청 비중을 조금 더 줄이고, 공평성을 위해 랜덤 선정에 당첨될 확률을 늘리는 방향으로 개선을 해보겠습니다. _ _)

10
2

요즘 (https://github.com/cosmoslide/cosmoslide) 개발하면서 들고 있는 생각....


대부분의 액티비티펍 소프트웨어 인스턴스는 멀쩡하게 365일 24시간 동일한 위치에서 운영이 되고 있다고 가정이 된다. 내가 글을 올리면, 나를 팔로우 중인 모든 사람들의 inbox에 내가 글을 올렸다(Create(Note))는 Activity가 전달이 되는데, 각자가 운영되고 있는 서버 인스턴스가 멀쩡히 살아있다면.... 딱히 문제가 되지는 않는다.

문제는, 게시글을 작성하는 시점에 팔로워 중 누군가의 인스턴스가 죽어있을때도 있다는 점이다. 그런 경우를 대비해서 exponential backoff를 쓰든 아무튼 fallback 알고리즘이 동작하긴 하는데, 서버가 살아나면 당연히 전달이야 잘 되긴 한다. 그런데, Activity 전달이 실패하는 일이 잦으면 어떤 액티비티펍 소프트웨어를 쓰던간에 retry를 하기 위해서 계속해서 Queue에 쌓이고, 최종적으로는 Queue에 쌓인 것 때문에 적지 않은 오버헤드가 있을 것 같은데 모더레이터의 입장에선 어느 정도까지 감안할 수 있는가? 라는 생각이 문득 들었다.

사실 내가 왜 이런 글을 쓰고 있냐면, 위에서도 언급했다시피, 로컬호스트에서 실제로 서비스를 (맥북이 켜져있을때만) 서빙하고 있고 그걸 Tailscale로 연결해서 터널링을 하고 있다. 즉, 맥북을 켜놓고 있으면 Create(Note) Activity가 정상적으로 잘 전달되고, 맥북이 꺼져있으면 Activity 전달이 안되고 있다. 실제로, 이런 맥락에서 지금 테스트 중인 두 개의 인스턴스가 있다. 이런 실험적인 시도를 하면서 이래도 되는게 맞나 싶은 생각도 들고는 있다. 맥북을 켜놓으면, retry되고 있는 것도 다 consume되긴 하겠지만.... 찝찝하긴 찝찝하다.

개발하는 입장이라고 선해를 할 수는 있어도, 비뚤어진 관점에서 해석하면 누군가는 어뷰징의 관점으로 해석할 수 있는 가능성이 적지는 않다고 생각하고 있다. 이런 경우엔 모더레이터되는 분들한테, 내가 이런 tailscale 도메인으로 서빙하고 있다고 통지라도 하는게 나으려나... 아니면, 내가 구매해놓은 도메인을 tailscale 도메인으로 CNAME 걸어놓고 "이런 도메인으로 서비스 걸어놓을 예정이니까 이 도메인만은 제발 차단하지 말아주십쇼 헤헤" 라고 해야하나... 아예 서버를 만드는거다보니까 이런 고려사항이 생기는 것 같다.


근데, 한 편으로는 이런 생각이 든다. 물리적인 서버의 위치를 옮길 가능성이 많은 환경(예를 들면, 전시 상황)이면 어떡하지? ActivityPub이 사실은 분산된 웹 환경을 위해 나온 프로토콜이긴 하지만, 분산된 웹 환경이라는게 물리적으로 각자 다른 위치에 오랫동안 배치가 되어 있는 서버 뿐만이 아니라 위치가 자주 바뀔 수 있는 서버도 연합의 대상으로 포함이 될 수 있다면? 어떤 공상과학 영화(ex. 터미네이터4)들을 보면, 저항군이 독자적인 라디오 기지국 같은거 만들고 위치도 매번 다른 곳으로 옮기고 주파수를 매번 다르게 설정하면서 소식전달하는 모습을 볼 수 있는데, 액티비티펍도 어떻게 보면 그걸 고려한 설계도 포함될 수 있지 않나... 그런 생각도 든다..

5

마이크로블로깅 정도 기능은 한 사이클 돌고나서 슬라이드 공유 기능 넣으려고 했는데, "한 사이클 돈다"에서 허용 오차 범위를 어디까지 둘 것인가가.... 걱정이긴 하구나...... 이건 그냥 일단 오픈하고 이리저리 따잇 당해보고 생각할 문제인가...

1

2025-09-07 오늘의 작업한 내용 메모

https://github.com/cosmoslide/cosmoslide/pull/14

게시글 작성 기능까지는 안 갔지만, 연합우주 네트워크를 통해서 Create(Note), Announce(Note) 등의 액티비티가 들어왔을때 그것이 타임라인 화면에 노출되게 하는 기능을 작업했다. Actor 정보를 가져오는 과정에서 어떤 Actor는 lookup 하는 과정에서 Timeout 에러 뜨고, 어떤 Actor는 401 Unauthorized 뜨고, 어떤 Actor는 Person이 아니었어서 게시글 가져오는건 실패했는데... 이건 지속적인 개밥먹기를 꾸준히 해봐야 제대로 개선이 될 것 같음.

3

작업하다보면 어드민 붙이고 싶은 충동이 확 든다.....

AdminJS를 붙이자니 의존성이랑 지옥의 한판싸움을 해야할 것 같고, 그렇다고 직접 만들자니 어.... 이건 좀... 시간이 너무 많이 걸리겠다... 싶기도 하고, 노코드 툴 처럼 뚝딱하고 붙일 수 있는 어드민도구 어디 없나

2

NestJS로 페디버스 앱 만들고 있긴 한데, 이걸 다른 사람한테 나눠주려니 어떻게 나눌지가 애매함.

당장은 TypeORM 마이그레이션 파일도 안 만들고, dev모드 켜놓고 계속 작업 중이긴 한데... 테일스케일 각자 세팅시키고, 다 같이 각자만의 로컬 환경 인스턴스 돌리면서 빈칸채우기 시킬 수도 없다....

만약, 이런 방법대로 한다면, 인스턴스 운영하고 있는 각 모더레이터가 특정 몇몇 인스턴스로 액티비티가 전송안되는 꼬라지 보고 "이건 또 뭔...." 할 것 같아.. 흑흑..

1
2
2

Cosmoslide 계속해서 작업할 것 같습니다.

  • Remote Follow 기능 관련해서 마무리
  • 게시글 기능 그리고 그와 관련된 Federation 로직 작성

그리고... Hackers Public 2차 모집 마감

1
2
2
0

2025-09-03 오늘의 작업한 내용 메모

https://github.com/cosmoslide/cosmoslide/pull/13

  • 이전 버전까지는 Cosmoslide 의 모든 계정은 public이고 팔로우 버튼을 누르면 바로 팔로우가 되는 로직으로 구현이 되어 있었음.
    • 즉, Follow 액티비티를 받으면 액티비티를 보낸 액터의 inbox에다가 바로 Accept(Follow) 액티비티를 보내는 구성
  • 이번에 작업한 내용은 각각의 계정을 private으로 변환할 수 있고, private 계정에 팔로우 버튼을 눌렀을때 바로 팔로우가 되는게 아니라 팔로우 요청으로 처리되도록 하는 작업이었음
    • 즉, Follow 액티비티를 받으면, manuallyAcceptsFollowers 옵션이 false인 경우에만 Accept(Follow) 액티비티를 보냄
  • 팔로우 요청 관리하는 화면 바이브코딩으로 적당히 빠르게 만들고..... 팔로우 요청을 수락하거나, 팔로우 요청을 거절하는 액션 자체는 서버 측 비즈니스 로직에서 처리한다기 보다는 가능하면 Federation에서 처리하도록 했음.
    • 즉, 팔로우 요청 수락버튼을 누르면 Accept(Follow) 액티비티가 전송되고, 팔로우 요청 거절 버튼을 누르면 Reject(Follow) 액티비티가 전송되는 방식

로컬 환경에 있는 서로 다른 두 액터끼리는 잘 되는걸 확인했는데, 서로 다른 서버의 액터끼리 잘 되는지는 좀 더 테스트가 필요함.

이번 주말까지는 게시글 작성하고 원격 서버 타임라인에 노출되는 것까지 어떻게 되긴 할 듯.

2

https://www.typescriptlang.org/docs/handbook/mixins.html

Typescript에 Mixin 기능은 있는데, 정작 내가 원하는 형태로 지원하는 기능이 아니다. 내가 원하는건 그냥 dart 마냥 클래스의 메서드를 확장하는 것 그 이상 그 이하도 아닌데.... 흑흑...

Dart의 경우


mixin Dog {
  void walk() { ... }
}

mixin Fish {
  void swim() { ... }
}

mixin Bird {
  void fly() { ... }
}

class Animal with Dog, Fish, Bird {
   ...
}

main() {
  final animal = Animal();
  animal.fly();
  animal.swim();
  animal.walk();
}

이런 느낌의 코드를 짜는게 가능하다.

Typescript도 유틸리티성 함수를 묶어서 mixin 문법처럼 매끄럽게 클래스에 포함시킬 수 있는 뭔가가 있었으면 좋겠다.

2
4
0

✨ Hackers' Public 첫 오프라인 모임! ✨

Hackers' Pub 사용자들의 자발적인 모임, Hackers' Public이 📅 9월 14일(일) 오후 3시 ~ 6시 열립니다.

이번 모임에서는 많은 분들이 흥미로워할 두 가지 발표가 준비되어 있습니다:

  • 🎨 Code As a Canvas: 코드에서 예술작품이 되기까지
  • ✍️ 폰트는 어떻게 만들어지는가 – Neo둥근모 개발 후일담

또한 자유롭게 교류할 수 있는 네트워킹 시간도 마련되어 있으니 많은 관심 부탁드립니다 🙌

현재는 2차 모집 단계이며, 👉 신청은 포스터의 QR코드 또는 http://public.hackers.pub 에서 가능합니다. (두 경로 모두 동일한 이벤트 페이지로 연결됩니다)

2차 모집 기간은 9월 7일까지이며, 완판이 되었더라도 참가자 신청 대기하신 분 중에서 두분 정도 선정할 예정입니다!

Hackers Public 1회차 모임 포스터
6
1
6

우부콘 코리아 2025에서 **"연합우주(Fediverse)란 무엇인가"**를 주제로 소개하는 세션을 가졌었는데, 그 때 쓰던 발표자료 한번 만들어놓으니까 "연합우주는 이런겁니다" 하고 던져주기 좋은 듯.....

발표자료는 여깄다네요... https://slides.kodingwarrior.dev/fediverse-onboarding-ubucon2025.pdf

13
0
1