
Woojin Kim
여보세요? 빌? 제가 바로 사회인데요. 저에게 환원된 돈은 어디있지요?

一般 Kyungmi Ahn ꉂꉂ(ᴖᗜᴖ*)
280조 기부하고도 2.8조가 남음
@[email protected] · 14 following · 12 followers
A software engineer in Seoul, and a father of a kid.
여보세요? 빌? 제가 바로 사회인데요. 저에게 환원된 돈은 어디있지요?
280조 기부하고도 2.8조가 남음
최근 가장 피가 거꾸로 솟는 에피소드 https://youtu.be/g0r_-7dWQo4?si=3plVYHddRvsStmw0 심지어 기사 기록도 열심히 지우는 것으로 추정해 볼 수 있는 ㅈㅅ 신문...
@[email protected] · Reply to 나나나나미's post
글에서 한가지 걸리는 게 지난 1월 트럼프가 ‘유죄이지만 형벌을 부과하지 않는다’는 선고를 받은 게 "민주적 권력형성 과정에 대한 존중"이라는 표현. 당시 머천 판사는 트럼프는 유죄이지만 대통령이라는 지위 때문에 유의미한 형벌을 부과하지 못한다는 결론을 내렸다. 시스템을 '존중'했다기보다는 사회 혼란을 줄이기 위해 범죄자를 그대로 두는 선택을 했다고 봐야 할 것 같다. https://www.hankookilbo.com/News/Read/A2025011023380004459
대법관 서경환·신숙희·박영재·이숙연·마용주의 보충의견, 그 ‘허접한’ 기록 https://www.hani.co.kr/arti/opinion/column/1195961.html
"보충의견은 ‘공직선거에 대한 외국의 신속 재판 사례’로 2000년 미국 대선 직후 연방대법원이 내린 판결을 들고 있습니다. [...] 더구나 연방대법원의 이 판결은 역사상 가장 정치적이고 부패한 판결로 비판받는 판결입니다."
그날, 출입국 공무원들이 아수라장을 만들었다
https://h21.hani.co.kr/arti/society/society_general/57263.html
공공의 불법은 항상 무시되고...
생각해보니 이번 연휴에는 일과 직간접 연관이 있는 일을 하지 않고 가족들과 놀고 먹고 집안일하는 것만 하는 데에 성공했다.
@[email protected] · Reply to 洪 民憙 (Hong Minhee)'s post
@hongminhee 기본을 안지키다니 이상한 방식이에요...
여태까지 地下鐵에서 다음 驛이 어딘지 알 수 없을 때마다 머릿속에서 온갖 陰謀論을 떠올렸었는데… 이제라도 다음 驛이 常時 表示된다니 多幸이네. (내가 주로 떠올렸던 陰謀論은 廣告를 더 많이 보게 하려고 다음 驛을 가끔만 表示한다는 것이었다.)
@[email protected] · Reply to 염산하's post
그냥 더 빨리 흘러간다.
@[email protected] · Reply to 염산하's post
단풍잎이 떨어져 물에 흐르지 않았다면...
#독서 아침에는 죽음을 생각하는 것이 좋다. 김영민.
@[email protected] · Reply to 염산하's post
기록에 대해 다룬다는 것도 좋았지만 그냥 마음에 드는 에세이라서 좋기도 했다.
@[email protected] · Reply to 염산하's post
다정과 다감, 황인찬
https://saltwatertree.tistory.com/76
참 오묘한 시다. 다정과 다감이 들어있는지 아닌지 모르겠다. 처음엔 이게 뭔 말인가 싶다가 읽을수록 묘하다.
LLM 기반의 게시글 번역 기능이 추가되었습니다. 우선, 자신이 쓴 게시글이 LLM을 이용해 번역되는 것을 허용하려면, 게시글 공개 설정에서 “LLM 기반 자동 번역 허용” 옵션을 켜 주셔야 합니다. 기존 게시글은 모두 이 옵션이 꺼져 있습니다만, 새로 쓰는 게시글의 경우 기본적으로 켜져 있습니다.
위와 같이 옵션을 켜 준 게시글은 위쪽에 다음과 같이 “다른 언어로 읽기” 메뉴가 표시되게 됩니다. 이 메뉴에 나오는 언어 목록은 언어 설정에서 정할 수 있습니다.
이 중에서 이미 번역이 완료된 언어는 바로 표시되지만, 아직 번역이 완료되지 않은 언어의 경우, 아래와 같이 기다리라는 메시지가 뜨게 됩니다. 게시글의 분량에 따라 번역 시간은 차이가 나지만, 짧으면 30초에서 길면 5분 정도 걸립니다.
번역이 완료되면, 아래와 같이 메시지가 바뀝니다.
번역 기능은 제가 Hackers' Pub을 맨 처음 구상할 때부터 핵심 기능으로 고려하고 있던 것이었습니다. 소프트웨어 프로그래머로서 일정 수준 이상 성장하기 위해서는 반드시 영어를 배워야만 하는 불합리함이나 그리고 일본어나 중국어 등 영어가 아닌 언어로 쓰인 다양한 자료에 대부분의 외국인은 접근하지 못한다는 아쉬움을 오래 전부터 느꼈기 때문입니다. 다행히 얼마 전부터 LLM의 번역 품질이 아주 좋아졌고, 이를 활용하여 꽤 괜찮은 품질의 번역 기능을 Hackers' Pub 같은 작은 웹사이트에서도 구현할 수 있게 되었네요.
참고로 현재 번역에 쓰이는 모델은 Claude Sonnet 3.7입니다. 저렴하다고는 할 수 없는 모델인데요. 시범적으로 운영해 보고, 비용이 너무 부담된다고 여겨지면 Gemini 2.5 Flash 같은 다른 모델로 전환하는 것도 고려하고 있습니다.
아무튼, 모처럼 추가한 번역 기능이니 많은 분들이 유용함을 누리셨으면 좋겠습니다.
아래는 제가 샘플로 미리 만들어 둔 번역본들입니다:
TypeScript로 백엔드 서버를 개발하면서 적절한 ORM 선택은 항상 중요한 결정 중 하나입니다. 최근 제 프로젝트에서 Drizzle ORM과 Kysely를 모두 사용해 볼 기회가 있었는데, 개인적으로는 Drizzle ORM이 더 편리하고 생산성이 높았던 경험을 공유하고자 합니다.
Drizzle ORM은 TypeScript용 ORM으로, 타입 안전성과 직관적인 API를 강점으로 내세우고 있습니다. 스키마 정의부터 마이그레이션, 쿼리 빌더까지 풀스택 개발 경험을 제공합니다.
Kysely는 '타입 안전한 SQL 쿼리 빌더'로 자신을 소개하며, 타입스크립트의 타입 시스템을 활용해 쿼리 작성 시 타입 안전성을 보장합니다.
두 도구 모두 훌륭하지만, 제 개발 경험에 비추어 볼 때 Drizzle ORM이 몇 가지 측면에서 더 편리했습니다.
Drizzle ORM의 스키마 정의 방식은 매우 직관적이고 선언적입니다:
import { pgTable, serial, text, integer } from 'drizzle-orm/pg-core';
export const users = pgTable('users', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
email: text('email').unique().notNull(),
age: integer('age')
});
Drizzle ORM은 이 스키마 정의로부터 자동으로 CREATE TABLE
SQL을 생성할 수 있어, 스키마와 코드가 항상 동기화되어 있습니다.
반면 Kysely는 타입 정의에 더 중점을 두고 있어 스키마와 타입 정의가 분리되는 경향이 있습니다:
interface Database {
users: {
id: Generated<number>;
name: string;
email: string;
age: number | null;
};
}
이 타입 정의는 TypeScript 코드에서 타입 안전성을 제공하지만, 이 타입 정의만으로는 CREATE TABLE
SQL을 생성할 수 없다는 것이 결정적인 단점입니다. 실제로 테이블을 생성하려면 별도의 SQL 스크립트나 마이그레이션 코드를 작성해야 합니다. 이는 타입과 실제 데이터베이스 스키마 간의 불일치 가능성을 높입니다.
Drizzle의 접근 방식이 데이터베이스 스키마와 TypeScript 타입을 더 긴밀하게 연결해주어 개발 과정에서 혼란을 줄여주었습니다.
Drizzle ORM의 마이그레이션 도구(drizzle-kit
)는 정말 인상적이었습니다. 스키마 변경사항을 자동으로 감지하고 SQL 마이그레이션 파일을 생성해주는 기능이 개발 워크플로우를 크게 개선했습니다:
npx drizzle-kit generate:pg
이 명령어 하나로 스키마 변경사항에 대한 마이그레이션 파일이 생성되며, 이를 검토하고 적용하는 과정이 매우 간단했습니다.
반면 Kysely의 마이그레이션은 본질적으로 수동적입니다. 개발자가 직접 마이그레이션 파일을 작성해야 하며, 스키마 변경사항을 자동으로 감지하거나 SQL을 생성해주는 기능이 없습니다:
// Kysely의 마이그레이션 예시
async function up(db: Kysely<any>): Promise<void> {
await db.schema
.createTable('users')
.addColumn('id', 'serial', (col) => col.primaryKey())
.addColumn('name', 'text', (col) => col.notNull())
.addColumn('email', 'text', (col) => col.unique().notNull())
.addColumn('age', 'integer')
.execute();
}
async function down(db: Kysely<any>): Promise<void> {
await db.schema.dropTable('users').execute();
}
이러한 수동 방식은 복잡한 스키마 변경에서 실수할 가능성이 높아지고, 특히 큰 프로젝트에서는 작업량이 상당히 증가할 수 있었습니다.
하지만 Kysely의 마이그레이션에도 두 가지 중요한 장점이 있습니다:
TypeScript 기반 마이그레이션: Kysely의 마이그레이션 스크립트는 TypeScript로 작성되기 때문에, 마이그레이션 로직에 애플리케이션 로직을 통합할 수 있습니다. 예를 들어, S3와 같은 오브젝트 스토리지의 데이터도 함께 마이그레이트하는 복잡한 시나리오를 구현할 수 있습니다. 반면 Drizzle ORM은 SQL 기반 마이그레이션이므로 이러한 통합이 불가능합니다.
양방향 마이그레이션: Kysely는 up
과 down
함수를 모두 정의하여 업그레이드와 다운그레이드를 모두 지원합니다. 이는 특히 팀 협업 환경에서 중요한데, 다른 개발자의 변경사항과 충돌이 발생할 경우 롤백이 필요할 수 있기 때문입니다. Drizzle ORM은 현재 업그레이드만 지원하며, 다운그레이드 기능이 없어 협업 시 불편할 수 있습니다.
참고로, Python 생태계의 SQLAlchemy 마이그레이션 도구인 Alembic은 훨씬 더 발전된 형태의 마이그레이션을 제공합니다. Alembic은 비선형적인 마이그레이션 경로(브랜치포인트 생성 가능)를 지원하여 복잡한 팀 개발 환경에서도 유연하게 대응할 수 있습니다. 이상적으로는 JavaScript/TypeScript 생태계의 ORM도 이러한 수준의 마이그레이션 도구를 제공하는 것이 바람직합니다.
Drizzle ORM에서 테이블 간 관계 설정이 매우 직관적이었습니다:
import { relations } from 'drizzle-orm';
export const usersRelations = relations(users, ({ one, many }) => ({
profile: one(profiles, {
fields: [users.id],
references: [profiles.userId],
}),
posts: many(posts)
}));
이 방식은 데이터베이스 설계의 본질적인, 관계적인 측면을 명확하게 표현해주었습니다.
두 ORM 모두 쿼리 작성을 위한 API를 제공하지만, Drizzle의 접근 방식이 더 직관적이고 관계형 모델을 활용하기 쉬웠습니다:
// Drizzle ORM - db.query 방식으로 관계 활용
const result = await db.query.posts.findMany({
where: eq(posts.published, true),
with: {
user: true // 게시물 작성자 정보를 함께 조회
}
});
// 결과 접근이 직관적이고 타입 안전함
console.log(result[0].title); // 게시물 제목
console.log(result[0].user.name); // 작성자 이름 - 객체 구조로 명확하게 구분됨
console.log(result[0].user.id); // 작성자 ID - 게시물 ID와 이름이 같아도 문제 없음
// Kysely
const result = await db
.selectFrom('posts')
.where('posts.published', '=', true)
.leftJoin('users', 'posts.userId', 'users.id')
.selectAll();
// 결과 접근 시 칼럼 이름 충돌 문제
console.log(result[0].id) // 오류: posts.id와 users.id 중 어떤 것인지 모호함
console.log(result[0].name) // 오류: 둘 다 name 칼럼이 있다면 모호함
Drizzle의 접근 방식이 테이블과 컬럼을 참조할 때 타입 안전성을 더 강력하게 보장하고, 관계를 활용한 쿼리 작성이 더 직관적이었습니다.
특히 여러 테이블 조인 시 동일한 이름의 칼럼 처리 부분에서 Drizzle ORM이 훨씬 더 편리했습니다. 이는 제 개발 경험에서 가장 중요한 차이점 중 하나였습니다.
// Drizzle ORM - 동일 이름 칼럼 처리
const result = await db.query.posts.findMany({
with: {
user: true // posts.id와 users.id가 모두 있지만 자동으로 구분됨
}
});
// 결과에 자연스럽게 접근 가능
console.log(result[0].id); // 게시물 ID
console.log(result[0].user.id); // 사용자 ID - 명확하게 구분됨
console.log(result[0].user.name); // 사용자 이름
// Kysely - 동일 이름 칼럼 처리를 위해 별칭 필요
const result = await db
.selectFrom('posts')
.leftJoin('users', 'posts.userId', 'users.id')
.select([
'posts.id as postId', // 별칭 필수
'posts.title',
'posts.content',
'users.id as userId', // 별칭 필수
'users.name as userName', // 칼럼 이름이 같을 수 있으므로 별칭 필수
'users.email as userEmail' // 일관성을 위해 모든 사용자 관련 칼럼에 접두어 필요
]);
// 별칭을 통한 접근
console.log(result[0].postId); // 게시물 ID
console.log(result[0].userId); // 사용자 ID
console.log(result[0].userName); // 사용자 이름
Drizzle ORM은 테이블과 칼럼을 객체로 참조하기 때문에, 동일한 이름의 칼럼이 있어도 자연스럽게 계층 구조로 처리되며 타입 추론도 정확하게 작동합니다. 반면 Kysely에서는 문자열 기반 접근 방식 때문에 별칭을 수동으로 지정해야 하는 경우가 많았고, 복잡한 조인에서 이런 작업이 번거로워졌습니다. 특히 여러 테이블에 같은 이름의 칼럼이 많을수록 모든 칼럼에 명시적인 별칭을 지정해야 하는 불편함이 있었습니다.
또한 Drizzle ORM은 결과 타입을 자동으로 정확하게 추론해주어 별도의 타입 지정 없이도 안전하게 결과를 사용할 수 있었습니다.
물론 Kysely도 여러 강점이 있습니다:
또한 앞서 언급했듯이, Kysely의 TypeScript 기반 마이그레이션과 양방향(up/down) 마이그레이션 지원은 특정 상황에서 Drizzle ORM보다 우위에 있는 기능입니다.
JavaScript/TypeScript 생태계의 ORM을 이야기하기 전에, 여러 언어 중에서도 Python의 SQLAlchemy는 특별한 위치를 차지합니다. 개인적으로 여태 사용해본 다양한 언어의 ORM 중에서 SQLAlchemy가 가장 기능이 풍부하고 강력하다고 느꼈습니다. 복잡한 쿼리 구성, 고급 관계 매핑, 트랜잭션 관리, 이벤트 시스템 등 SQLAlchemy의 기능은 정말 방대합니다.
Drizzle ORM은 JavaScript 생태계에서 매우 인상적인 발전을 이루었지만, 아직 SQLAlchemy의 경지에는 이르지 못했다고 생각합니다. 특히 다음과 같은 부분에서 SQLAlchemy의 성숙도와 기능 풍부함이 돋보입니다:
두 ORM 모두 훌륭한 도구이지만, 제 개발 스타일과 프로젝트 요구사항에는 Drizzle ORM이 더 잘 맞았습니다. 특히 스키마 정의의 직관성, 강력한 마이그레이션 도구, 그리고 전반적인 개발자 경험 측면에서 Drizzle ORM이 더 생산적인 개발을 가능하게 해주었습니다.
동일 이름 칼럼 처리와 같은 실질적인 문제에서 Drizzle ORM의 객체 기반 접근 방식이 가져다주는 편리함은 실제 프로젝트에서 큰 차이를 만들었습니다.
ORM 선택은 결국 프로젝트 특성과 개인 선호도에 크게 좌우됩니다. 새로운 프로젝트를 시작한다면 두 도구 모두 간단히 테스트해보고 자신의 워크플로우에 더 적합한 것을 선택하는 것이 좋겠지만, 제 경우에는 Drizzle ORM이 명확한 승자였습니다.
앞으로 Drizzle ORM이 더욱 발전하여 SQLAlchemy 수준의 풍부한 기능과 유연성을 제공하게 되길 바랍니다. JavaScript/TypeScript 생태계에도 그런 수준의 강력한 ORM이 있으면 좋겠습니다. 다행히도 Drizzle ORM은 계속해서 발전하고 있으며, 그 발전 속도를 보면 기대가 큽니다.
여러분의 경험은 어떤가요? 다른 ORM 도구나 언어를 사용해보셨다면 의견을 공유해주세요!
@[email protected] · Reply to Woojin Kim's post
@me 똑같은 심 교체 효과라고 하드라구요.
@[email protected] · Reply to 염산하's post
게임에서 말하는 “버프(buff)“와 ‘history buff’ 같은 표현에서의 “buff”는 어원이 다르지만, 철자는 같습니다. 아래에 차이를 정리해드릴게요:
⸻
⸻
⸻
요약: • 둘 다 “buff”이지만, • 게임에서는 능력 강화 효과 • 일상 영어에서는 열정적인 애호가 • 뜻도 다르고, 어원도 다릅니다!
Q: What are some funny problems you had while developing NBLM?
A: In the early days, we used a lot of car manuals and history textbooks to test out our citations. Now, the entire team have become automotive and history buffs (in addition to a host of other weird expertises). 👽
**“buffs”**는 이 문장에서 어떤 분야에 대해 매우 열정적이고, 지식이 많은 사람들을 의미합니다. 종종 취미나 관심사에 대한 애정을 나타낼 때 쓰입니다.
⸻
buffs – 열정적인 팬들, 애호가들, 전문가 수준의 관심을 가진 사람들 예: • history buff – 역사 덕후 / 역사 애호가 • car buff – 자동차에 푹 빠진 사람 / 자동차 마니아
이 단어는 원래 **“buff”**라는 단수형에서 왔고, 다음과 같은 맥락에서 사용됩니다: • He’s a film buff. – 그는 영화광이야. • She’s a fitness buff. – 그녀는 운동에 열정적인 사람이야.
궁금한 단어나 표현이 더 있나요?
https://x.com/notebooklm/status/1904926446084059487?s=46&t=3SSCMzU8n1YA4_S4Nc9Piw
한국, 2025년 언론자유지수 61위 ‘문제 있음’ 국가 불명예
www.mediatoday.co.kr/news/article...
"한국은 문재인정부 5년간 43위→41위→42위→42위→43위를 기록했고, 3년 연속 아시아 1위를 기록한 시기도 있었지만 윤석열정부 들어 첫 번째 발표에서 47위를 기록한 뒤 2년 연속 60위권으로 추락했다. 조사가 시작된 이후 60위권 추락은 이명박-박근혜 정부에 이어 세 번째다. 한국은 언론자유 국가분류에서도 지난해에 이어 올해도 ‘문제 있음’으로 분류됐다."
한국, 2025년 언론자유지수 61위 ‘문제 있음’ 국...
Robert De Niro is expressing his love and support for his daughter Airyn De Niro, after she recently shared publicly for the first time that she is transgender.
https://bsky.brid.gy/r/https://bsky.app/profile/did:plc:hneloew3za25iqabarp6m2ay/post/3lo6han5wzs2z
로버트 드니로, 자신의 딸 아이린 드니로의 트랜스젠더 커밍아웃을 지지
RE: https://bsky.app/profile/did:plc:dzezcmpb3fhcpns4n4xm4ur5/post/3lo4kvwpz622d
@[email protected] · Reply to Jaeyeol Lee's post
@kodingwarrior @hongminhee @ysh 전자책으로는 구매할 수 있는 것 같아요 (인사이트, 알라딘). 그리고 인사이트 전자책(PDF)은 DRM-FREE (인사이트 블로그) 라서 개인적으로 좀 마음 편히 구매합니다
@[email protected] · Reply to 염산하's post
@hongminhee @me 시프트 누르고 입력하면 항상 영어 대문자가 입력되고 혹은 길게 눌러서 알파벳 입력해도 일단 영어 입력 상태가 되어서, 명확히 영어 입력하고 싶을 때 좋더라고요. 그리고 키보드 위에 추천 단어들 표시되는 옵션을 켜놓고 써야 원치않게 다른 언어로 들어갔을 때 내가 입력한 그대로 넣어줄 수 있습니다.
@[email protected] · Reply to Woojin Kim's post
@me 혹시 진짜 직업이 ...? (알려주지 않으셔도 됩니다 전 잡혀가기 싫어요! )
SKT SKT 청문회에서 2조 드립 나옴 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
https://m.ruliweb.com/community/board/300143/read/70478487
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
오픈 엑세스에 올라와 있는 논문들 중 소프트웨어 공학과 관련된 내용들을 편집하여 책으로 낸 것이다. 원문이 논문이라 그런지 몰라도 주장이 그렇게 혁신적이거나 새로운 것은 없다 다만 연구를 통해서 본인들의 주장에 대한 근거를 확보했다는 것이 유의미하다. 바꿔 말해 이 책에서 말하는 것들은 믿고 따라도 되는 어느 정도의 과학적 근거가 있는 이야기들. #독서
소프트웨어 엔지니어링 생산성 돌아보기
http://aladin.kr/p/7zTVn
오픈 엑세스에 올라와 있는 논문들 중 소프트웨어 공학과 관련된 내용들을 편집하여 책으로 낸 것이다. 원문이 논문이라 그런지 몰라도 주장이 그렇게 혁신적이거나 새로운 것은 없다 다만 연구를 통해서 본인들의 주장에 대한 근거를 확보했다는 것이 유의미하다. 바꿔 말해 이 책에서 말하는 것들은 믿고 따라도 되는 어느 정도의 과학적 근거가 있는 이야기들. #독서
소프트웨어 엔지니어링 생산성 돌아보기
http://aladin.kr/p/7zTVn
@[email protected] · Reply to 洪 民憙 (Hong Minhee)'s post
@hongminhee @me 이거 좋아요 후후
어제 너무 속상하고 화나는 일 있었음 우리집은 엄마만 skt를 쓰는데 유심 재고가 없어서 온동네 통신사를 돌다가 차라리 통신사 변경을 할까 싶어 들른 타 통신사 매장에서 엄마한테 휴대폰을 사지 않으면 통신사 변경을 못해주고 유심도 못팔아준다고 했다는 거임 번호이동 서비스 쓰면 폰 그대로 두고 통신사 유심변경 가능한데... 엄마가 나이많고 이쪽 방면으로 잘 모를 것 같으니까 기회라고 생각했는지 거짓말했다는 게 너무 짜증나서 다때리고싶었음
커서를 제대로 사용하는 12가지 방법
------------------------------
* 커서 디자이너가 말하는 커서 사용법인데, 잘 몰랐던 내용들이 있어 공유드립니다.
1. Cursor는 프로젝트 별로 규칙(Rules)을 세울 수 있음. Cursor > Setting > Cursor Settings로 접근하면 됨
2. Cursor는 .cursurignore 기능이 있어서, 테스트 케이스 파일을 편집할 수 없게 할 수 있음
3. .cursor 폴더 안에…
------------------------------
https://news.hada.io/topic?id=20595&utm_source=googlechat&utm_medium=bot&utm_campaign=1834
@[email protected] · Reply to Jaeyeol Lee's post
@kodingwarrior 엇? 책이 공개인가요? 내용이 다 보이네요