2025년 2월, Andrej Karpathy가 X(트위터)에 짧은 글을 올렸다. “바이브 코딩(Vibe Coding)”이라는 표현이었다. AI에 완전히 몸을 맡기고, 코드가 존재한다는 사실조차 잊어버리는 새로운 개발 방식. 그 글은 며칠 만에 수백만 건의 조회 수를 기록했고, 이후 뉴욕타임스·가디언·아스 테크니카가 연달아 보도했다. 콜린스 영어사전은 2025년의 단어로 ‘vibe coding’을 선정했다.

이처럼 AI와 협업하는 개발 방식은 빠르게 확산되고 있다. 개발자는 이제 코드를 직접 작성하기보다 AI와 함께 생산하는 환경에 놓이게 되었다. Karpathy가 2023년 남긴 말처럼, “The hottest new programming language is English.” 코딩 도구의 발전이 아니라 소프트웨어 개발 방식 자체가 달라지고 있다.

그런데 바이브 코딩으로 프로젝트를 키워가다 보면 새로운 문제가 나타난다. 기능 하나는 빠르게 구현되지만, 기능이 쌓일수록 코드 구조가 무너진다. 대화 세션이 끊기면 어제의 맥락이 사라지고, AI는 같은 질문에 다른 구조의 코드를 내놓는다. 결국 “빠르게 만들었지만 유지보수할 수 없는 코드”가 쌓이는 상황이 반복된다. 문제의 본질은 AI의 코드 생성 능력이 아니라, 프로젝트 상태를 어떻게 유지하느냐에 있다.

Part 01

AI 협업 개발의 진화: 4단계 패러다임

AI 협업 개발의 흐름을 돌아보면, 단순한 도구 발전이 아니라 문제를 해결하기 위한 패러다임의 연쇄적 진화임을 알 수 있다. 현재까지의 흐름은 네 단계로 정리된다.

중요한 점은, 이 네 단계가 서로를 대체하는 관계가 아니라 레이어처럼 쌓이는 관계라는 것이다. 하네스 엔지니어링을 도입하더라도 좋은 프롬프트와 정교한 컨텍스트는 여전히 필요하다. 각 단계는 AI가 수행할 수 있는 역할의 확장이자, 이전 단계의 한계를 보완하는 새로운 층이다.

1

프롬프트 엔지니어링

Prompt Engineering

AI 코딩 초기에 가장 널리 사용된 방법이다. 개발자가 자연어 프롬프트로 AI에게 역할과 행동 규칙을 전달하는 방식이다.

너는 시니어 소프트웨어 엔지니어야.
클린 아키텍처 원칙에 따라 해당 기능을 구현하는 TypeScript 코드를 만들어줘.
2

컨텍스트 엔지니어링

Context Engineering

프롬프트 엔지니어링의 한계를 극복하기 위해 등장한 접근이다. 프롬프트 대신 프로젝트 문맥을 구조적으로 제공하는 방식으로, 규칙 파일(`.cursorrules`), 에이전트 규칙(`agent.md`), 스킬 정의(`skills.md`) 같은 파일을 통해 프로젝트 아키텍처, 코드 스타일, 사용 가능한 도구, 개발 규칙을 AI에게 전달한다. 이 접근은 AI가 단순한 코드 생성 도구를 넘어 프로젝트 맥락을 이해하는 협업 도구로 동작하도록 만들었다.

다만 컨텍스트 엔지니어링도 완전한 해결책은 아니다. 컨텍스트 파일을 사람이 직접 작성하고 유지해야 하고, 프로젝트가 커질수록 관리 비용이 늘어난다. 컨텍스트 윈도우 제한으로 모든 정보를 전달하기 어렵다는 근본적인 제약도 있다. 맥락 제공 문제는 개선했지만, 실행 자동화 문제는 여전히 남아 있었다.

3

에이전트 엔지니어링

Agent Engineering

LLM 기술이 발달하면서 AI가 스스로 작업을 수행하는 에이전트 기반 개발 방식이 등장했다. 에이전트는 단일 응답을 넘어 파일 탐색 → 코드 수정 → 테스트 실행 → 오류 분석 → 코드 수정이라는 작업 루프를 반복하며 개발을 진행한다. 개발자의 작업 흐름과 유사한 형태다.

개발 생산성은 크게 향상되었다. 그러나 에이전트 기반 개발도 새로운 문제를 낳는다. 실행 비용이 증가하고, 결과를 예측하기 어려우며, 프로젝트 구조가 붕괴될 위험이 생긴다. 권한 관리 문제도 따라온다. 에이전트는 실행 능력을 크게 확장했지만, 개발 과정 자체를 통제하는 메커니즘은 여전히 부족했다.

4

하네스 엔지니어링

Harness Engineering

개발 과정 통제 문제를 해결하기 위해 등장한 접근이 하네스 엔지니어링이다. 이 개념은 2026년 2월 OpenAI가 Codex 팀의 내부 실험 결과를 공개하면서 급속히 확산됐다. Codex 에이전트가 5개월간 수동으로 작성된 코드 없이 100만 줄 규모의 프로덕션 소프트웨어를 구축한 사례로, AI가 작업을 수행하는 환경 자체를 제어하고 검증하는 실행 프레임워크를 의미한다.

AI 개발 환경에서 하네스는 실행 환경 관리, 도구 호출 제어, 실행 결과 검증, 작업 루프 제어, 안전 장치 제공의 역할을 수행한다. AI 에이전트를 직접 통제하기 위한 운영 레이어다. 랄프 모드(Ralph Mode)와 같은 실험적 개발 패턴과 결합되면서 AI 기반 개발 환경을 보다 안정적으로 운영할 수 있는 기반도 마련되고 있다.


이 흐름을 한 줄로 정리하면 이렇다.

프롬프트 엔지니어링(자연어 인터페이스) → 컨텍스트 엔지니어링(프로젝트 맥락 제공) → 에이전트 엔지니어링(자율 실행) → 하네스 엔지니어링(실행 환경 제어)

AI가 할 수 있는 일이 늘어날수록, 개발자의 역할은 점점 설계와 운영으로 이동한다.

Part 02

AI 시대의 개발 프로세스: 7단계

AI와 협업하는 개발 환경에서는 기존 개발 프로세스만으로 충분하지 않다. AI는 코드 생성 능력은 뛰어나지만, 문제 정의와 구조 유지에는 약점이 있기 때문이다. 이를 보완하기 위해 다음과 같은 7단계 프로세스를 정의해 사용한다.

  1. 정의(Define): 무엇을 만들고 무엇을 만들지 않을지 정의한다.
  2. 설계(Design): 코딩 전에 구조를 설계한다.
  3. 완료 기준(DoD): Definition of Done, 완료 기준을 정의한다.
  4. 빌드(Build): 작은 단위로 구현한다.
  5. 검증(Verify): 테스트·보안·구조 검증을 수행한다.
  6. 기록(Record): 다음 세션을 위해 결과를 기록한다.
  7. 실패 처리(Recovery): 실패 원인을 분류하고 복구한다.

이 프로세스의 핵심은 “AI를 잘 사용하는 법”이 아니다. AI가 약한 부분을 프로세스로 보완하는 것이다.

컨텍스트 저장 인프라: 4개 파일

프로세스가 작동하려면 컨텍스트를 저장하는 인프라가 필요하다. 이를 위해 고정 파일 4개를 사용한다.

앞의 세 파일(`project_context.md`, `architecture.md`, `acceptance.md`)은 프로젝트 전체에 걸쳐 고정되는 컨텍스트이고, `session_context.md`는 세션 단위로 갱신되는 휘발성 컨텍스트다. 세션 컨텍스트는 짧아야 하고, 프로젝트 컨텍스트는 고정되어야 한다. 이 파일들을 기반으로 각 단계를 어떻게 하는지 설명한다.

Part 03

실전 예시: 글로벌 출석체크 시스템

단순 바이브 코딩이 얼마나 위험한지, 그리고 7단계 프로세스가 그 위험을 어떻게 해결하는지 연속 출석체크 시스템을 만들며 살펴본다.

게임에서 “7일 연속 접속 시 전설 아이템 지급!” 같은 이벤트는 흔하다. 단순해 보이기 때문에 “유저가 매일 접속할 때마다 출석 일수가 1씩 오르는 코드를 짜줘. 하루라도 안 들어오면 0으로 초기화해”라고 AI에 맡기면 그럴싸한 코드가 나온다.

이 코드를 검수 없이 라이브 서버에 배포하면 대참사가 일어난다. 코드는 한국 서버 시간을 기준으로 작성되었을 가능성이 크고, 뉴욕에 사는 유저가 현지 시간으로 같은 날로 인식되어 출석이 인정되지 않거나 연속 출석이 끊겨버린다. AI가 시간대(Timezone)와 글로벌 서비스 맥락을 스스로 유추하지 못하기 때문이다.

이제 동일한 기능을 7단계 프로세스로 구현해 보자.

1

Define

무엇을 만들고 무엇을 만들지 않을지 정의한다

기능의 목적과 범위를 명확히 전달한다.

목표
글로벌 유저 대상 연속 출석체크 API 구현

성공 기준
출석 상태 계산이 모든 시간대에서 일관되게 동작한다.

비범위
아이템 지급 로직
보상 이벤트 관리 시스템
관리자 페이지

AI가 문제 범위를 잘못 확장하는 것을 방지한다. 문제 정의가 어렵다면 AI와 소크라틱 대화를 활용하는 것도 방법이다. 5분간 인터뷰 형식으로 질문을 주고받으면 오류 케이스를 사전에 정리하는 효과가 있다.

2

Design

코딩 전에 구조를 설계한다

코드를 작성하기 전에 시스템 구조를 먼저 정의한다.

/features/attendance
attendance.controller.ts
attendance.service.ts
attendance.repository.ts
attendance.model.

데이터 모델도 함께 정의한다.

attendance
  user_id
  current_streak
  last_check_date
  timezone

핵심 설계 규칙은 다음과 같다. 날짜 계산은 서버 시간이 아닌 유저 타임존 기준으로 한다. 하루 기준은 UTC 날짜 변환 후 비교한다. 출석 체크는 하루 한 번만 허용한다. 이 구조는 architecture.md에 기록한다.

3

DoD

Definition of Done, 완료 기준을 정의한다
1. 출석 체크 API 정상 동작
2. 하루 2 요청  중복 출석 방지
3. 타임존 테스트 통과
4. 에러 처리 구현
5. 테스트 코드 작성
6. API 문서 업데이트

AI의 “완료”와 개발자의 “완료”는 다르다. AI는 코드가 동작하면 끝이라고 판단하지만, 실제 개발에서는 다양한 완료 기준이 있다.

이 기준은 acceptance.md에 저장한다.

4

Build

작은 단위로 구현한다
Task 1attendance model 생성
Task 2attendance repository 구현
Task 3출석 streak 계산 로직 구현
Task 4attendance API 생성

기능을 작은 단위로 나누어 구현한다. 각 작업은 독립적으로 테스트 가능해야 한다.

5

Verify

테스트·보안·구조 검증을 수행한다
기능 테스트연속 출석 증가 확인
경계 테스트하루 차이 계산 / 타임존 변경
예외 테스트동일 날짜 중복 요청 / 과거 날짜 요청

단순한 코드 리뷰 요청 대신 자동 검증을 수행한다.

6

Record

다음 세션을 위해 결과를 기록한다
완료
 - attendance API 구현
 - streak 계산 로직 구현

남은 작업
 - 보상 지급 로직

다음 작업
 - reward service 설계

AI와의 대화 세션은 언제든 끊길 수 있고, 끊기면 맥락이 사라진다. 다음 세션에서 맥락을 다시 구축하는 비용을 줄이기 위해, 세션이 끝날 때마다 session_context.md에 결과를 기록한다.

기록은 단순한 회고가 아니다. 다음 세션을 위한 컨텍스트를 생성하는 작업이다.

7

Recovery

실패 원인을 분류하고 복구한다

AI 작업이 실패했을 때 무작정 재시도하는 것은 같은 실패를 반복할 뿐이다. 실패 원인을 먼저 분류하고, 원인에 맞는 복구 전략을 택해야 한다.


단순 바이브 코딩의 흐름이 “기능 요청 → 코드 생성 → 배포 → 글로벌 버그 발생”이라면, 7단계 프로세스는 AI의 코드 생성 능력을 통제 가능한 개발 프로세스로 변환한다.

Conclusion

엔지니어링은 사라지지 않는다

AI 코딩 도구는 개발 생산성을 크게 향상시켰다. 그러나 AI가 코드를 잘 작성한다고 해서 개발 프로세스가 자동으로 정리되는 것은 아니다.

AI 협업 개발의 핵심은 “코드를 생성하는 능력이 아니라 프로젝트 상태를 유지하는 능력”이다. 개발자는 타이핑하는 역할에서 벗어났을 뿐, 엔지니어링 자체는 여전히 필요하다.

부록. 바로 쓸 수 있는 프롬프트

이번 세션은 아래 프로세스를 따른다.

1. Define목표 / 성공 기준 / 비범위 정의
2. Design코딩 없이 설계와 구조 정리
3. DoD완료 기준 정의
4. Build작은 태스크로 구현
5. Verify테스트 / 보안 / 구조 검증
6. Record세션 결과 기록
7. Recovery실패 원인을
              컨텍스트 부족 / 방향 오류 / 구조 충돌
               분류하고 수정한다.

지금은 1단계(Define)부터 시작한다.

참고

스마트폰이 없던 2006년, 그 시절 피처폰의 작은 화면 속에서 만날 수 있던 ‘아이모(The World of Magic)’ 세계. 휴대폰의 숫자 키패드 위에 놓인 가운데 버튼을 잘못 누를까 노심초사하던 그 시절 세상에 첫 발을 디딘 아이모는 최초의 모바일 MMORPG라는 키워드를 붙이기에 전혀 부족함이 없는 게임이다.

이제는 피처폰에서 스마트폰으로, 스마트폰에서도 유니티라는 새 엔진으로 탈바꿈했으며 더 나아가 PC 플레이로 확장하고 있다. 아이모라는 게임이 점점 더 크고 넓은 세계로 뻗어갈 수 있었던 건 지난 20년이라는 긴 시간 동안 변함없이 이노티아 대륙을 지켜준 모험가 덕분일 것이다.

20년이라는 세월은 결코 짧지 않다. 한 아이가 태어나 성인이 될 정도이므로. 그 시간들 속에서 아이모의 모험가들은 길드원들끼리 모여 보스를 사냥했을 것이고, 우디 위디/워디 마을의 분수대 앞 광장에서 밤새도록 수다를 떨었을 것이며, 더 높은 곳을 향한 강화의 문턱에서 뜨거운 열망을 불태우던 순간도 있었을 것이다. 그 모든 빛나는 발자취들이 모여 아이모는 비로소 스무 살 성인이 되었다. 과거의 향수와 미래의 설렘이 공존하는 아이모 20주년, 이를 기념하기 위한 풍성하고 화려한 축제의 장을 들여다 보자.

20주년 기념 코스튬 교환 이벤트: 동그리의 역습!

20주년 축제의 열기가 한창인 가운데, 아이모의 몬스터 중 하나가 심상치 않은 움직임을 보이고 있다. 그 주인공은 바로 동그리. 이전부터 꾸준히, 아이모가 생일을 맞이할 때마다 그 자리의 주역은 늘 쿠이였다. 화사한 파스텔 핑크 컬러의 동그란 몸체, 커다랗고 영롱한 눈동자. 매번 생일 파티의 주인공이 될 만큼, 쿠이는 아이모의 마스코트 그 자체였으니 말이다.

숨그리와 대화하여 ‘동그르르!’를 외치면 동그리파의 일원이 될 수 있으며,
1일 1회 버프를 받을 수 있어 꽤 요긴한 친구다.

하지만 이를 묵묵히 지켜보던 동그리가 있었으니. 매번 쿠이만 축하받는 상황이 이어지다 보니, 소외감과 서운함이 쌓이고 쌓여 끝끝내 폭발하고 말았다. 동그리의 우두머리인 ‘우두그리’는 역습을 도모한다. 숲 속의 작은 동그리들을 하나둘 모아 ‘메가그리’, 즉 메가 동그리로 합체시키는 것이다.

역습을 도모하는 메가그리.
땡글한 눈동자에 분노가 서려 있지만 귀엽게만 보인다.

사실 동그리들의 마음은 단순하다. 모험가들의 애정을 받고 싶은 것뿐이다. 이에 모험가는 동그리들을 진정시키기 위해 필요한 재료를 모아야 한다. 동그리의 마음을 비롯한 재료들을 모아 마을의 NPC들에게 건네주면, 동그리의 풀어진 마음과 그간 쌓인 추억을 상징하는 한정 코스튬과 소모품을 받을 수 있다.

살벌하면서도 귀여운, 긴장감 넘치면서도 재치 있는 동그리의 역습은 20주년을 맞이한 모험가들에게 잊지 못할 또 하나의 추억으로 남을 것이다.

20주년 기념 업데이트: 신규 퀘스트, 신규 시스템!

신규 퀘스트: 메인 퀘스트 [소생의 빛 (上)]과 [세르앙의 눈물]

이번 20주년이 유독 특별한 이유는 단순히 새로운 이벤트와 한정 보상을 나누는 축제에 그치지 않고, 이노티아 대륙의 비밀에 대해 알아갈 수 있는 서사가 풀렸기 때문이다. 아이모 세계, 이노티아 대륙 전역을 탐험하는 모험가로서의 발자취가 시작되는 메인 퀘스트를 비롯하여 세계관의 디테일을 채워 줄 흥미로운 서브 퀘스트가 추가되었다. 

아이모의 거대한 세계관이 이번 업데이트를 통해 새로운 국면에 접어든다. 이노티아 대륙 곳곳을 탐험하다 보면 마주칠 수 있는 수수께끼들, 그리고 그 배후로 의심되는 조마. 이번 메인 퀘스트인 ‘소생의 빛 (上)’을 통해 그 진상에 한 발짝 더 다가서게 된다.

왕국과 제국, 서로 다른 흔적을 얻기 때문에 읽을 수 있는 내용도 다르다.

특히 예전부터 있어 왔던 맵을 배경으로 하는 이 메인 퀘스트는, 유저들에게 있어 지금까지의 사냥터가 새로이 보이도록 만드는 역할을 할 것이다. 

더불어, 메인 퀘스트가 업데이트 될 때마다 지역 이동에 소모되는 재화를 줄인다거나 관련 지역의 지도를 업데이트하는 등 퀘스트의 이야기와 엮인 편의성 개선을 해왔다. 이번에도 마찬가지다. 이번에는 그러한 편의성 개선을 포함하여, 퀘스트가 진행되는 주요한 지역인 ‘고대의 누각’, ‘하늘성채 동/서부’의 몬스터 밸런스까지 조정했다. 아이모의 모험가들이 더욱 몰입감 있게 성장할 수 있는 재미를 위해 노력한 지점이 돋보인다. 

퀘스트를 따라 반짝이는 신전을 이동하다 보면 세르앙의 이야기를 들을 수 있다.

한편 메인 스토리 외에도 세계관을 더 탄탄하게 만들어 줄 서브 퀘스트도 추가되었다. 신전 깊숙한 곳에 숨겨진 슬프고도 신비로운 비화를 다루는 퀘스트, ‘세르앙의 눈물.’ 메인 시나리오의 줄기 밖에서 펼쳐지는 이러한 서브 퀘스트들은 아이모의 세계관을 더욱 입체적으로 만들어 준다. 

신규 시스템: [대장장이의 축복]과 [골드 창고], 그리고…

아이모의 핵심 재미이자 모험가들의 영원한 숙제, ‘장비 강화.’ 더 강력한 힘을 위해서라면 강화는 필수적이지만, 그만큼 실패할 때의 좌절감도 크다. 이번에 이루어진 업데이트는 그런 모험가들을 격려하는 성격을 가지고 있다. 바로 강화가 실패할 때마다 다음 강화 성공 확률이 올라가는 ‘대장장이의 축복’이 그것이다. 

‘강화 성공 확률’ 란에 적힌 초록색 확률이 축복으로 추가된 확률이다.

실패는 성공의 어머니라 하던가? 실패할수록 성공에 다다를 수 있다!

대장장이의 축복은 B급 이상의 장비를 ‘위험 강화’ 단계에서 시도할 때 적용되는 일종의 보너스 성공 확률 시스템이다. 강화에 실패할 경우, 그 실패의 아쉬움은 ‘대장장이의 축복’으로 전환되어 다음 강화를 시도할 때 기본 확률에 추가로 더해진다. 기본 확률과 축복 확률이 더해져 총 100%가 될 때 장비는 반드시 강화에 성공하고, 이후 축복은 초기화된다.

대장장이의 축복은 같은 종류의 장비와 요구 레벨 등급 내에서라면 누적 및 사용이 가능하다. 심지어 강화 실패 시 장비 파괴를 막아주는 ‘성수’나 ‘보호주문서’를 사용하더라도 축복이 적용되니, 모험가 입장에선 보다 전략적이면서  효율적으로 강해질 수 있는 셈이다.

아이모의 핵심 콘텐츠 중 하나인 ‘장비 강화’를 모험가들이 더 즐겁게 누릴 수 있게끔 신경쓴 점이 돋보이는 업데이트다.

한편, 모험가를 배려하는 아이모 20주년 업데이트는 이뿐만이 아니다. 그간 부캐릭터를 육성하거나 다른 캐릭터로 아이템을 구매할 때, 골드를 옮기는 과정은 여간 번거로운 일이 아니었다. 거래소를 통해 아이템을 올리고, 수수료를 떼여 가며 골드를 옮겨야 했던 지난한 과정들. 골드 창고의 등장으로, 이제 이 번거로움도 끝이다. 

한눈에 볼 수 있는 골드 창고, 한번에 정리할 수 있는 골드 입출금.

창고 내 골드 보관 기능을 통해 원하는 금액을 편하게 입출금할 수 있으며, 이 과정에서 수수료도 따로 필요하지 않다. 창고 내 골드를 언제든 입금하거나 출금할 수 있어, 계정 전체의 자산을 관리하기에 효과적인 업데이트다.

이러한 주요 업데이트 외에도, 아이모의 또 다른 핵심 콘텐츠 ‘도감’에 사용되는 재료인 장비 스탬프의 사용 레벨대를 넓혀 활용 범위를 확장했으며, 매주 초기화되는 길드 임무에 설명을 추가하는 등 모험가들이 아이모 세계에 더 편하고 쉽게 적응할 수 있도록 돕는 요소들로 업데이트를 꽉 채웠다.

항상 나아갈 길을 모색해 앞으로 걸어갔고, 그 길에는 언제나 모험가들이 함께 있었다. 그 덕에 아이모라는 게임이 20년 동안 장수할 수 있었던 것이 아닐까.

20주년: 계속되는 여정

2006년 작은 모바일 화면 속에서 시작된 모험은, 어느덧 20년이라는 거대한 서사의 한 줄기가 되었다. 이번 20주년 업데이트는 단순히 새로운 시스템과 이벤트를 선보이는 자리가 아니다. 수많은 밤을 지새우며 전장을 누비고, 광장에서 정을 나누며 지금의 아이모를 함께 만들어 간 모험가들에 대한 헌사와 다름없다.

그 헌사는 온라인을 넘어 오프라인에서도 이어진다. 5월 16일부터 17일까지 성수동 비컨 스튜디오에서 열리는 팝업 전시회 ‘아이모 시네마’는, 지난 20년의 추억을 시네마 콘셉트로 풀어내며 모험가들과 서로의 여정을 축하하는 자리가 될 것이다.

누군가에게는 치열한 승부의 세계로, 또 누군가에게는 따스한 안식처로 함께해 온 아이모. 이제 스무 살 성인이 된 아이모는 다시 한번 신발 끈을 단단히 묶고 이노티아 대륙으로 나아가려 한다. 물론, 모험가들의 손을 꼭 붙잡고서.

포켓몬스터 30주년, 그 정점에서 피어낸 역작

포켓몬스터는 1996년 2월 27일 발매된 《포켓몬스터 레드/그린》으로 시작된 시리즈다. 30주년이라는 기념비적인 시간을 맞이한 이 시리즈는 단순히 수집과 대전이라는 틀에 갇히지 않았다. 카드 게임의 전략성부터 《폿권》이 보여준 격투의 박진감에 이르기까지, 포켓몬은 수많은 장르와 결합하며 전 세계인의 문화적 아이콘으로 자리매김했다.

포켓몬스터 시리즈는 어느덧 30주년을 맞이하였다.

30년 역사의 정점에서 등장한 기념작 《포코피아》는 역대 시리즈 중 가장 높은 메타크리틱 점수인 89점을 기록하며 평단의 극찬을 이끌어냈다. 이는 단순한 IP의 힘을 넘어, 정교한 기술력과 깊이 있는 감성이 만났을 때 어떤 마스터피스가 탄생하는지를 여실히 증명하는 결과다.

절망 위에 역설적으로 피어난 즐거움의 찬가

《포코피아》의 시작은 사뭇 진지하다. 플레이어는 주인공인 메타몽이 되어, 스스로를 박사라 칭하는 덩쿠림보 박사와 함께 폐허가 된 포켓몬센터 앞에 선다.

인간처럼 변한 메타몽과 덩쿠림보 박사는
인류가 언젠가 돌아오리라 믿으며 포켓몬센터를 재건한다.

활기 넘치던 마을은 사라졌고, 포켓몬들의 모습도 좀처럼 보이지 않는다. 자신과 함께했던 인간들이 언젠가 돌아오리라 믿으며 황폐화된 마을을 재건하는 것이 《포코피아》의 핵심 줄거리다.

무너진 잔해 사이에서 발견되는 기록들은 이 세계가 겪은 비극을 간접적으로 전달한다. 홍수, 화산 폭발, 쓰나미 등 걷잡을 수 없는 기상이변으로 지구가 더 이상 인류를 품어줄 수 없게 된 과정이 편지와 일기 속에 고스란히 담겨 있다. 특히 자신이 아끼던 포켓몬을 지키기 위해, 혹은 차마 함께 갈 수 없어 눈물로 이별을 고해야 했던 인간들의 마지막 메시지는 플레이어의 가슴을 먹먹하게 만든다.

기상이변이 간접적으로 느껴지는 편지.
남 일 같지 않다.

하지만 《포코피아》는 이 무거운 주제를 결코 어둡게만 다루지 않는다. 귀여운 포켓몬들은 저마다의 개성으로 대화하고 움직이며, 새로 재건된 건물을 보며 아이처럼 기뻐한다.

인간이 오면 다시 떠들썩해질 거라는 꼬부기의 천진난만함이
가슴 한 켠을 뭉클하게 한다.

램펄드와 바리톱스가 서로 머리의 ‘단단함’을 두고 겨루고 있다.
포켓몬끼리의 상호작용은 굉장히 다양하다.

팬들 사이에서 ‘창백카츄’를 중심으로 회자되는 감동적인 에피소드들은 절망 속에서도 피어나는 희망을 노래한다. 라이벌 의식을 불태우거나 술래잡기를 하는 포켓몬들의 모습은 “인간이 사라진 포켓몬들만의 세상은 이렇지 않을까”라는 상상을 완벽하게 시각화했다. 포스트 아포칼립스 세계관을 아기자기하게 풀어낸 연출력은 가히 독보적이다.

《포코피아》 최고의 히로인 창백카츄.
제작진도 30년이 지난 지금에서야 피카츄에게 이런 귀여움이 숨어 있었다며 놀랐다고 전해진다.
디자이너들이 예고한 ‘새로운 파도’라는 수식은 결코 과장이 아니었다.

단순한 일상의 재현이 아닌 ‘창조’와 ‘공존’

혹자는 《포코피아》를 《동물의 숲》과 《마인크래프트》의 결합이라 말하곤 한다. 하지만 기자의 시각에서 이 게임은 《동물의 숲》과는 결이 다르다. 《동물의 숲》이 반복되는 ‘일상’의 안락함을 구현하는 데 중점을 둔다면, 《포코피아》는 ‘만들고 감상하는’ 샌드박스 장르의 본질에 방점을 찍고 있기 때문이다. 오히려 포켓몬스터판 《드래곤 퀘스트 빌더즈 2》 혹은 《마인크래프트》라는 표현이 더 적절하다. 실제로 《포코피아》의 개발은 《빌더즈 2》의 실개발을 담당했던 오메가 포스가 맡았다.

《포코피아》 개발사인 오메가 포스는
《드래곤 퀘스트 빌더즈 2》의 실개발을 담당했던 제작사다.

포켓몬스터 시리즈의 정체성은 ‘탐색’, ‘발견’, ‘포획’이라는 키워드로 요약된다. 《포코피아》는 이 공식을 ‘서식지’라는 개념으로 치환하여 계승한다. 포켓몬들이 살고 싶어 하는 최적의 환경을 조성하면, 그 조건에 매료된 포켓몬들이 찾아와 발견된다. 이들과 친구가 되어 같은 공간을 일궈가는 과정은 포켓몬 시리즈가 오래도록 추구해온 재미의 정점이다.

쓰레기 봉투와 TV로 이루어진 ‘서식지’.
기상천외한 서식지들이 많다.

여기서 끝이 아니다. 포켓몬들은 각자가 가진 특수한 능력을 통해 메타몽의 파트너가 되어 활약한다. 거대한 건물을 짓거나, 전기를 공급하고, 작물을 재배하며, 요리도 한다. 이들의 능력은 유기적으로 연결되어 마을을 발전시키고, 그 속에서 다시 새로운 서식지를 구축할 수 있게 하는 동기부여가 된다.

때때로 메타몽은 포켓몬들에게 기술을 배운다.
꼬부기에게 물대포를 배운 메타몽.

거대한 빌딩을 건축하는 퀘스트에서는
두드리짱의 ‘거장’ 능력을 이용하게 된다.

샌드박스형 게임들에는 ‘목표의 상실’이라는 장르적 약점이 있다. 《포코피아》는 4개의 주요 마을과 1개의 백지 마을(샌드박스맵)로 이를 극복한다. 이들은 튜토리얼과 시나리오 전개, 그리고 자유로운 플레이를 정교하게 엮어낸다. 첫 스테이지인 ‘바싹바싹 황야 마을’은 게임의 기초를, ‘울퉁불퉁 산지 마을’은 요리와 제련을, ‘우중충한 해안 마을’은 전력 공급과 발전 시스템을, ‘반짝반짝 부유섬 마을’은 거대 빌딩 건축의 재미를 알려준다. 그 사이사이 이어지는 감동적인 시나리오는 플레이어가 게임 시스템을 익히는 과정에 강력한 동기를 부여한다.

맵에는 다른 지역으로 넘어가는 ‘관문’이 존재한다.
이 또한 포켓몬스터 게임 시리즈 팬이라면 심쿵할 요소다.

과거에서 현재로 이어지는 30년의 헌사

올드 팬에게 《포코피아》는 거대한 헌사와도 같다. 본작의 배경은 30년 전 발매된 《포켓몬스터 레드/그린/피카츄/블루》의 무대인 관동지방이다. 비록 황폐한 모습으로 재현되었으나, 작은 게임보이 액정에서 누볐던 그곳이 거대한 3D 오픈월드로 펼쳐지는 광경은 그야말로 압권이다.

게임보이는 어디에든 존재한다!

특히 ‘우중충한 해안 마을’의 ‘상트앙느호’ 잔해는 백미다. 플레이어는 이 부서진 유람선을 직접 수리하고 재건하며 추억을 재구성한다.

암초에 좌초된 ‘상트앙느호’.
거대한 배의 모습을 확인할 수 있다.

로켓단의 흔적을 추적하고 주인공 ‘레드’와 체육관 관장들의 복장을 찾아 입을 수 있는 점은, 제작진이 30주년을 맞아 팬들에게 보내는 꾹꾹 눌러 쓴 편지와도 같다. 그 외에도 여러 지역에 1세대 포켓몬스터의 흔적들이 숨겨져 있으니 끊임없이 탐험해보자.

《포켓몬스터 레드/그린/피카츄/블루》의 복장.
기자는 이 복장을 찾자마자 감격을 금치 못했다.

로켓단!

30살이 된 포켓몬의 화려한 생일파티

포켓몬은 디즈니와 어깨를 나란히 하는 세계 최고의 IP로 우뚝 섰다. 그리고 그 힘의 근원은 언제나 게임 시리즈였다. 도트 게임에서 시작해 여러 시대를 거쳐, 이제는 플레이어가 직접 포켓몬 세계를 만들고 그 속에서 함께 생활할 수 있는 수준에까지 이르렀다. 기술적인 한계로 구현하지 못했던 ‘포켓몬과 살아가는 이상적인 세상’을 마침내 실현해낸 이번 작품은, 마스터피스라 불리기에 부족함이 없다.

포켓몬을 위한 마을을 만들어보자!

스위치와 감지기 등을 활용하여 회로를 만들 수 있다.
기자는 자동 아이템 수거 장치를 만들었다.

혹자는 닌텐도 스위치 2가 있어야만 이 게임을 즐길 수 있다는 점을 유일한 단점으로 꼽기도 한다. 하지만 그럼에도 《포코피아》는 반드시 경험해 볼 만한 게임이다. 지난 30년의 총집합이자, 앞으로의 포켓몬 시리즈를 기대하게 만드는 작품이기 때문이다.

포켓몬들은 여러 물건을 사용하는 모습을 보여주며
세계를 풍성하게 만든다.

올해 최고의 게임이자 앞으로도 오래도록 회자될, 이 위대한 재건의 모험에 여러분도 함께하길 바란다.

마을을 재건하고 포켓몬들을 찾아
즐거운 포코피아 라이프를 즐기자!

평소에도 컴투스온과 함께 다양한 봉사활동에 꾸준히 참여해 온 필자는 2026년 1분기 봉사활동의 일환으로 금천노인복지관을 찾았다.

이번 활동의 핵심은 어르신들이 보다 쾌적하고 효율적인 환경에서 디지털 기기를 익히고 교육받을 수 있도록 교육 공간을 세밀하게 정비하고, 복지관 시설 전반의 위생 상태를 개선하는 데 있었다. 컴투스 임직원들이 한마음으로 이 곳을 찾은 이유 역시 지역사회 어르신들께 더 나은 교육 환경을 선물해 드리고자 하는 진심 어린 마음 때문이었다.

복지관 입구부터 오리엔테이션 장소까지 이어지는 “컴투스 임직원분들의 방문을 진심으로 환영합니다”라는 문구는 봉사자들의 긴장을 자연스럽게 풀어줌과 동시에 기분 좋은 책임감을 불어넣어 주었다.

활동에 앞서 라텍스 장갑과 면장갑, 마스크, 세정용 천 등 안전과 위생에 필요한 장비를 빠짐없이 갖췄다.

복지관 직원의 주도로 진행된 오리엔테이션에서는 각 활동의 구체적인 목적과 올바른 작업 방법을 상세히 안내받았다. 이날 현장에는 30명이 넘는 임직원이 참여하였으며, 복지관 측의 체계적인 안내 덕분에 모두가 각자의 역할에 맞춰 효율적으로 조를 나누어 배치되었다.

주요 활동은 ⓛ선풍기 세척 및 필터 청소, ②프로그램실 소독, ③야외 하수구 낙엽 제거, 세 가지 과업으로 나뉘어 진행되었다.

① 선풍기 세척 및 필터 청소

필자는 2층과 3층 각 실에 배치된 선풍기를 관리하는 세척 조에 자원했다. 선풍기를 하나하나 분해해 찌든 먼지를 닦아내고, 세척 후 건조를 거쳐 다시 조립하는 과정은 상당한 집중력과 노동력을 요했다.

처음에는 모든 선풍기가 비슷한 모델이라 부품을 혼용해도 무방할 것이라 예상했으나, 실제로는 각 위치에 맞는 고유 부품을 정확히 맞춰야 정상적으로 작동했다. 세척을 마친 선풍기 날을 건조대에 올려두었는데, 어느새 어디에 뒀는지 찾지 못해 우왕좌왕하는가 하면, 기종별로 맞춰야 하는 날개와 커버가 서로 다른 선풍기에 꽂혀 있어 일일이 대조하며 재조립하느라 한참을 씨름하기도 했다. “이거 어디 갔지?”, “이게 이 기종 거 맞아?” 하며 서로 확인하는 그 과정이 어찌나 웃겼는지, 오히려 그런 순간들이 봉사 현장의 생동감을 더해주는 즐거운 추억으로 남았다.

② 프로그램실 소독

다른 한편에서는 소독 팀이 건물 내 모든 사무실과 프로그램 활동실을 꼼꼼히 소독하며 구슬땀을 흘렸다.

작업을 하면서 실시간으로 공간이 달라지는 것이 느껴져, 팀원 모두가 과정 하나하나에서 보람을 느끼며 작업에 임했다.

③ 야외 하수구 낙엽 제거

또한 건물 외부에서는 하수구에 쌓인 낙엽을 제거하는 작업이 한창이었다.

이 구역은 워낙 작업 강도가 높아 마무리될 무렵에는 봉사자들의 옷과 신발이 꽤 더러워진 상태였다. 가장 힘든 일을 맡아 끝까지 해낸 팀원들에게 진심 어린 수고의 박수를 보내고 싶다. 고된 작업임에도 배수 시설을 정비하여 어르신들의 안전한 통행을 도왔다는 자부심에 모두의 얼굴에는 미소가 가득했다.

무더운 날씨 속에서도 어르신들이 조금 더 시원하고 건강한 환경에서 시설을 이용하시기를 바라는 마음으로 모든 과정에 정성을 다했다. 평소 무심히 지나칠 수 있는 선풍기 필터 하나, 하수구 구석 하나까지 직접 살피며, 작은 환경 개선의 노력이 모여 누군가의 소중한 일상을 바꿀 수 있다는 사실을 다시금 실감했다. 뜻을 같이하는 동료들과 함께 땀 흘리며 나눈 이번 시간은 무엇과도 바꿀 수 없는 값진 경험이었다.

사실 꾸준히 봉사활동에 참여해 오면서 느낀 점은, 거창한 준비 없이도 작은 시간과 두 손 하나면 누군가의 일상이 조금 더 나아질 수 있다는 사실이다. 이번 활동 역시 그 믿음을 다시 한번 확인시켜 주었고, 함께한 동료들 덕분에 그 보람은 배가 되었다. 아직 봉사활동이 낯설게 느껴진다면, 컴투스와 함께하는 컴투게더 봉사활동부터 시작해보는 건 어떨까. 너무 멀리서 생각하지 않아도 된다. 오늘처럼 가까운 곳에서, 할 수 있는 것부터 시작하면 그걸로 충분하다. 앞으로도 지역사회를 위한 나눔의 자리에 꾸준히 함께할 계획이다.

올해 야구의 주인공은 너야!

작년 한 해 KBO 리그를 찾은 관중 수는 1,231만 명. 프로야구 역사상 처음으로 1,200만 관중 시대를 연 기록이다. 2026년 시즌 역시 개막 초반부터 역대 최소 경기 100만 관중 돌파 기록을 경신하며 그 열기를 이어가고 있다. 야구를 사랑하지만 바쁜 일상 탓에 야구장 방문이나 중계 시청이 어려운 이들에게, 혹은 야구는 잘 몰라도 공 하나에 온 나라가 들썩이는 그 분위기를 한번쯤 느껴보고 싶은 이들에게 ‘컴투스프로야구V26(이하 컴프야V26)’은 최고의 선택지가 될 것이다. 수많은 야구 게임 중에서도 특히 V26을 강력히 추천하는 5가지 이유를 소개한다.

시각적 전율, 극강의 리얼리티

스포츠 게임의 몰입도를 결정짓는 가장 중요한 요소 중 하나는 단연 ‘리얼리티’다. 컴프야V26의 그래픽은 여러 모바일 야구 게임 중에서도 최고 수준을 자랑한다. 단순히 화질이 좋은 것을 넘어, KBO 선수들의 이목구비를 정밀하게 구현하기 위해 3D 헤드 스캔 기술을 활용했다. 덕분에 게임 속 선수들이 실제 선수처럼 살아 숨 쉬는 느낌을 주며, 플레이 도중 포착되는 선수들의 다양한 표정 변화를 지켜보는 재미도 쏠쏠하다.

선수 페이스 예시-전준우

여기에 정밀한 모션 캡처 기술까지 더해졌다. 선수마다 특유의 타격 준비 자세(루틴)와 투구 폼을 디테일하게 구현해, 선수의 이름과 얼굴을 가려도 야구팬이라면 폼만 보고 누구인지 단번에 알아챌 수 있을 정도다.

모션 캡쳐 예시1-김도영 타격 자세
모션 캡쳐 예시2-김도영 타격 자세
노다웃 예시 1-문현빈
노다웃 예시 2-디아즈
한 손으로 지배하는 그라운드, 완벽한 세로 모드

언제 어디서든 접속할 수 있다는 간편함은 모바일 게임의 가장 큰 장점이다. 하지만 늘 스마트폰을 양손으로 쥐고 가로로 플레이해야 한다면, 시공간의 제약 없이 즐기기엔 다소 불편함이 따르기 마련이다. 출퇴근길 붐비는 대중교통 안이든, 한 손에 커피를 든 채로든, 완벽한 세로 모드를 지원하는 컴프야V26이라면 걱정 없다.

게임 로비(아웃게임)부터 실제 경기(인게임)까지 모든 조작이 엄지손가락 하나면 충분하다. 물론 가로 모드 최적화 역시 뛰어나기에, 기존의 가로 플레이 방식에 익숙한 유저들 또한 취향에 맞게 게임을 즐길 수 있다.

아웃게임 예시 – 라인업 시스템
아웃게임 예시 – 선수 관리 메뉴
아웃게임 예시 – 리그 모드 메인화면
인게임 예시
인게임 예시
정교한 승부의 미학, ABS 판독 시스템

최근 야구계의 가장 뜨거운 화두 중 하나는 ‘자동 투구 판정 시스템’, 일명 ABS(Automated Ball-Strike System)다. 2024년 KBO가 프로야구 리그 최초로 도입한 이 시스템은 한 치의 오차도 없이 공정한 판정을 제공하며, 그동안 심판마다 조금씩 달랐던 스트라이크 존을 명확히 시각화해 아슬아슬하게 존을 파고드는 피칭의 짜릿함을 극대화했다.

이러한 보더라인 피칭의 즐거움을 컴프야V26의 ABS 판독 시스템을 통해 고스란히 느낄 수 있다. 스트라이크 존에서 애매하게 빠졌다고 생각한 순간, 3D 그래픽 리뷰 연출과 함께 투구 궤적이 투명하게 드러나며 ‘스트라이크’ 콜이 울려 퍼지는 짜릿한 쾌감을 직접 경험해 보길 바란다.

ABS 예시-볼
ABS 예시-스트라이크
0.1초의 찰나, 체크스윙 비디오 판독

야구팬이라면 실제 경기 중 포수가 확신에 찬 제스처로 체크스윙 비디오 판독을 요청하는 장면을 본 적이 있을 것이다. 숨죽이며 판독을 기다리는 팽팽한 긴장감, 판정이 번복되며 양 팀의 희비가 엇갈리는 그 짜릿함을 컴프야V26에서도 그대로 느낄 수 있다.

새롭게 도입된 체크스윙 비디오 판독 시스템은 실제 방송 중계처럼 타자의 배트 헤드가 홈 플레이트를 넘어갔는지 슬로우 모션으로 보여준다. 한층 더 공정하고 치밀해진 카운트 수 싸움을 통해 실제 경기에 임하는 듯한 긴박함을 즐길 수 있다.

체크 스윙 예시
현실과 가상의 공존, 라이브 카드 시스템

야구 게임의 꽃은 단연 ‘나만의 구단’을 꾸리는 것이다. 컴프야V26의 라이브 카드 시스템은 현실 야구와 게임의 경계를 허물며 리얼리티 야구 게임의 본질을 한 단계 더 끌어올렸다.

라이브 카드는 현재 KBO 리그 현역 선수들의 실제 경기 성적이 주기적으로 카드 능력치에 반영되는 POTM(이달의 선수) 시스템을 갖추고 있다. 2025년 한화 에이스 폰세처럼 특정 기간 눈부신 활약을 펼쳤다면, 해당 선수의 카드 능력치 역시 그에 맞춰 일정 기간 대폭 상승하는 식이다. 이 시스템 덕분에 유저들은 실제 프로야구 경기 결과에 더욱 깊게 몰입하게 되고, 다음 업데이트를 손꼽아 기다리게 된다.

여기에 최동원, 선동열처럼 한국 야구 역사에 큰 획을 그은 레전드 선수들과 김도영, 구자욱 등 현재 맹활약 중인 현역 선수들을 하나의 라인업에 세울 수 있다는 점도 가슴을 뛰게 한다. 컴프야V26에서 시대를 초월해 레전드와 현역이 함께 그라운드를 누비는 나만의 드림팀을 완성해 보자.

라이브 카드 예시-구자욱
POTM 시스템 예시
귀끝까지 짜릿한 현장감, 취향 저격 중계 시스템

야구의 생동감을 완성하는 마지막 퍼즐은 바로 귀를 즐겁게 하는 ‘중계진의 목소리’다. 컴프야V26은 중계진 라인업에 새로운 얼굴을 추가하며 청각적인 몰입도까지 완벽하게 잡았다.

기존에 깊이 있는 해설과 깔끔한 중계로 오랜 시간 사랑받아 온 ‘이순철 해설위원과 정우영 캐스터’ 조합에 이어, 트렌디한 입담과 작두 해설로 최근 주가를 높이고 있는 ‘이대형 해설위원과 김민수 캐스터’ 조합이 컴프야V26에 새롭게 합류했다.

이제 유저는 자신의 취향에 맞춰 두 중계진 조합 중 하나를 직접 선택해 게임을 플레이할 수 있다. 클래식한 중계와 트렌디한 중계 중 원하는 목소리를 골라보자. 생생한 샤우팅과 다채로운 중계 멘트는 마치 실제 야구 중계를 듣는 듯한 압도적인 현장감을 선사할 것이다.


압도적인 리얼리티와 한 손으로 즐기는 편의성, 그리고 귀를 즐겁게 하는 새로운 중계진의 목소리까지. 컴투스프로야구V26은 단순히 야구 게임을 넘어, 2026년 KBO 리그의 뜨거운 열기를 내 손안으로 고스란히 옮겨놓은 하나의 거대한 그라운드다.

현장의 박진감을 그대로 재현한 판독 시스템과 시대를 초월한 나만의 라인업은 당신을 단순한 게이머가 아닌, 승부를 결정짓는 주인공으로 만들어 줄 것이다. 누구보다 야구에 진심인 당신을 위해 진짜보다 더 진짜 같은 ‘리얼 야구’로 돌아온 컴프야V26. 가장 생생한 2026 시즌을 지금 바로 컴프야V26의 그라운드에서 경험해 보길 바란다. 올해 야구의 주인공은 바로 당신이다!

“모험은 가볍게, 즐거움은 깊게!” 정령들과 함께하는 동화 같은 MMORPG 스피릿테일즈가 어느덧 서비스 1주년을 맞이했다. 지난 1년 동안 게임의 근간이 되는 시스템들이 꾸준히 확장되면서, 출시 초반과는 체급이 다른 대형 게임으로 성장했다.

특히 완전히 새로운 성장 시스템과 강력한 UR 정령의 등장, 그리고 장비 진화 등 핵심적인 변화들이 게임의 재미를 한층 더 깊게 만들어주었다. 지난 1년간 스피릿테일즈를 더욱 풍성하게 만들어준 주요 업데이트들을 정리해 보았다.


끝없는 성장: 레벨 확장과 신규 직업의 등장

스피릿테일즈의 모험 세계는 지난 1년간 두 차례의 대규모 확장을 거쳤다. 최고 레벨이 89까지 상향되면서 ‘세계수 340층’, 80레벨 비경 ‘마룡 고도’ 등 새로운 도전 거리들이 쏟아졌다.

가장 눈에 띄는 변화는 신규 직업 ‘거너’의 등장이다. 강력한 화력을 자랑하는 원거리 딜러로, 빠른 연사에 특화된 ‘래피드’와 폭발적인 범위 공격을 퍼붓는 ‘블래스터’ 두 가지 전직을 선택할 수 있다. 기존 5개 직업과는 확실히 다른 타격감으로 전투에 새로운 재미를 더했다.

여기에 ‘자유 전직 시스템’까지 도입되어 60레벨 이상이면 언제든 직업을 바꿀 수 있게 됐다. NPC 미네르바를 통해 골드나 다이아로 전직할 수 있는데, 서버 내 직업 비율에 따라 비용이 차등 적용되어 특정 직업으로만 쏠리는 현상을 자연스럽게 방지하고 있다.

신상 시스템: 새로운 성장 기반

‘신상 시스템’은 70레벨 달성 시 해금되며, 기존 캐릭터나 정령과는 독립적인 새로운 성장 경로다. 신상은 레벨업과 진화를 통해 기본 속성을 강화하며, 전용 장비를 통해 세밀한 세팅이 가능하다.

무엇보다 큰 장점은 신상을 교체하더라도 지금까지 육성한 레벨과 진화 단계가 그대로 계승된다는 점이다. 덕분에 부담 없이 여러 신상을 실험하며 자신만의 빌드를 찾아갈 수 있다. 최근에는 신상별 승급 시스템까지 추가되면서 진정한 최종 성장축으로 자리 잡았다.

신상의 핵심 콘텐츠인 ‘신상 제전(제신의 섬)’은 매일 10시부터 자정까지 열린다. 서버 전투력에 따라 진영이 나뉘며, 16시와 22시에는 제전 의식이 펼쳐진다. 이때 전투 모드와 평화 모드를 선택할 수 있어, PvP가 부담스러운 이용자도 퀘스트에 안전하게 참여할 수 있다.

정령 시스템: 새로운 정령 등급의 등장

정령 시스템은 지난 1년간 가장 극적인 변화를 겪었다. 최초의 UR 정령 ‘나타’는 기존 정령과 완전히 다른 메커니즘을 도입했다.

나타는 단독 출전이 불가능하며, 반드시 6성 이상의 정령과 ‘영혼 공명’을 통해서만 전투에 참여할 수 있다. 나타는 주인과 융합하여 20초간 화신으로 변신해 강력한 전용 스킬들을 구사한다.

또 다른 UR 정령 ‘아테나’는 레이드의 판도를 바꾼 핵심 정령이다. ‘신격 각성’ 상태에서 넓은 범위를 베어 적의 보호막을 무력화시키고, 변신 후에는 강력한 변신 스킬로 막대한 데미지와 감속 효과를 입힌다.

여기에 특수 능력을 갖춘 SP 정령 ‘볼칸’과 ‘제피론’까지 합류하면서 정령 조합의 전략적 다양성이 그 어느 때보다 넓어졌다. 볼칸은 주인과 융합해 비행하며 무적 상태로 지속 피해를 주고, 제피론은 주인 주위를 빠르게 회전하며 적의 강화 효과를 해제하는 독특한 능력을 자랑한다.

장비 시스템: 감정부터 진화까지 완전 재편

장비 시스템 역시 혁신적인 변화를 거쳤다. ‘장비 진화 시스템’을 통해 70레벨 레전드 장비를 2회의 진화와 1회의 돌파를 거쳐 80레벨로 승급시킬 수 있게 됐다. 이때 기존 재련 및 마법 부여 수치가 그대로 유지되어 지금까지의 투자를 보존할 수 있다.

‘장비 감정 시스템’도 추가됐다. 레벨 30부터 모든 장비를 감정할 수 있으며, S등급 속성이 쌓이면 강력한 감정 전용 효과가 발동된다. 일정 횟수 이상 감정하면 최대 옵션이 확정으로 나오는 ‘천장’ 시스템까지 갖춰 운에만 의존하지 않아도 되도록 설계됐다.

PvP와 협력의 조화: 마도 훈련장부터 영주 토벌전까지

스피릿테일즈 최초의 본격 PvP 콘텐츠인 ‘마도 훈련장’은 68레벨 이상이 참여하는 2vs2/3vs3 자동 매칭 시스템이다. 시즌별 티어제로 경쟁의 재미를 살렸고, 천광 정령석 재료인 ‘성휘’를 획득할 수 있어 필수 콘텐츠로 자리 잡았다.

협력 플레이의 꽃인 ‘영주 토벌전’은 56레벨 이상, 3~5인 파티가 도전하는 고난도 던전이다. 3종의 강력한 보스를 상대해야 하는데, ‘어려움’ 난이도를 클리어하면 ‘쉬움’ 구간의 보상까지 한 번에 획득할 수 있어 도전 가치가 높다.

소셜과 커뮤니티: 모험단부터 결혼 시스템까지

친구와 함께하는 즐거움도 강화됐다. ‘모험단 시스템’은 38레벨부터 참여할 수 있는 소규모 커뮤니티로, 마음 맞는 동료들과 일일/주간 임무를 수행하며 전용 상점에서 유용한 아이템을 교환할 수 있다.

‘결혼 시스템’은 편의성 개선과 다양한 신규 기능으로 다시 태어났다. 청혼 시 결혼 조건을 자동으로 체크하도록 변경되었으며, 예식 시간 예약, 청첩장 예약 발송, 등급별 화려한 웨딩 코스튬까지 추가되어 게임 속 또 다른 핵심 콘텐츠로 사랑받고 있다.

풍성한 게임으로 진화… 2년차 기대감 증폭

1년간의 업데이트를 종합하면, 스피릿테일즈는 꾸준한 콘텐츠 추가를 통해 게임 생태계 전반을 완전히 새롭게 구축했다고 해도 과언이 아니다. 전직, 신상, 장비로 구성된 다층적 성장 구조와 UR·SP 정령들이 만들어내는 다양한 전투 메타, 그리고 탄탄한 엔드 콘텐츠와 커뮤니티 인프라까지 모든 요소가 유기적으로 맞물려 있다.

무엇보다 기존 유저의 투자를 보호하면서도 신규 유저가 쉽게 적응할 수 있는 구조를 만든 점이 인상적이다. 장비 진화 시 기존 옵션 보존, 신상 교체 시 육성 단계 승계, 감정 천장 시스템 등 유저 친화적인 설계가 곳곳에 녹아 있다.

이미 탄탄한 기반 시스템이 구축된 만큼, 2년 차에는 더욱 창의적이고 혁신적인 콘텐츠들이 기대된다. 지난 1년간 보여준 창의적인 확장과 유저 중심의 운영을 비추어 볼 때, 앞으로의 스피릿테일즈 행보를 더욱 응원하게 된다.

1980년대생이라면 누구나 기억할 것이다. 교실 한켠에 놓인 기차 모양 연필깎이에 연필을 꽂고 열심히 손잡이를 돌리던 그 풍경. 너무 뾰족하게 깎으려다 심이 뚝 부러지면 또 처음부터 다시 돌리고, 그러다 연필이 짧아지면 그게 또 아까웠던 기억까지. 연필 하나 깎는 일이 제법 진지한 작업이었던 시절의 이야기다.

(출처: 나무위키)

그로부터 수십 년이 흐른 지금, 연필깎이도 완전히 달라졌다. 연필을 구멍에 넣기만 하면 자동으로 깎고 스스로 위로 배출까지 해주는 전동 자동 연필깎이가 등장한 것이다.

프로살림 오토베어 전동 자동 연필깎이

오늘 소개할 제품은 프로살림의 오토베어 전동 자동 연필깎이다. 처음에는 ‘연필깎이가 굳이 자동까지 필요할까?’ 싶었다. 그런데 곧 초등학교에 입학하는 아이를 둔 아빠 입장에서, 막상 써보고 나니 생각이 단번에 바뀌었다.

구성 및 주의사항

구성품은 단출하다. 본체와 충전 케이블, 설명서가 전부다. 심플한 구성이지만 첫 사용 전 주의해야 할 점이 있다. 처음에는 1시간 이상 완충 후 사용해야 하며, 충전 시에는 정격 출력 5V 1A 규격의 일반 충전기를 써야 한다. 요즘 흔하게 쓰는 고속 충전기를 연결하면 기기 고장의 원인이 될 수 있으니 주의가 필요하다. 또 한 가지, 7cm 이하로 짧아진 몽땅연필은 넣지 않도록 권장하고 있다.

주요 특징 및 사용 후기

아이들이 연필을 쓰기 시작하면 깎아주는 일도 만만치 않다. 특히 색칠을 좋아하는 아이들이 있는 집이라면 더욱 공감할 것이다. 연필에 색연필까지, 조금만 써도 금방 뭉툭해지는데 이걸 매번 손으로 깎다 보면 시간도 걸리고 손목도 아프다. 이 제품은 그런 수고를 대신해준다. 연필을 꽂으면 자동으로 빨려 들어가 깎인 뒤, 다 되면 다시 위로 올라온다. 처음엔 살짝 힘주어 밀어 넣어야 하지만 한두 번 해보면 다섯 살 아이도 혼자서 할 수 있을 만큼 조작이 간단하다.

5단계 굵기 조절

연필심 굵기를 5단계로 세밀하게 조절할 수 있다. 1단계부터 4단계까지는 미세한 차이를 보이며, 5단계는 비교적 뭉툭하게 깎인다. 안전을 고려해야 하는 유아에게는 5단계가 가장 적합하다.

매끈한 절삭력과 안전성

깎인 단면도 예쁘다. 나무 부분이 매끄럽게 정리되면서 물결 모양의 단면이 만들어지는데, 기능을 떠나 그 자체로 꽤 만족스럽다. 충전 시 과압 보호 기능도 갖추고 있어 아이가 직접 다루기에도 안심이 된다.

간편한 청소

관리도 직관적이다. 이름처럼 ‘오토베어’답게 곰 귀 모양의 덮개가 달려 있는데, 이 부분을 시계 반대 방향으로 돌리면 쉽게 분리된다. 깎인 부스러기가 쌓이는 통이 투명하게 보여 언제 비워야 할지 눈으로 바로 확인할 수 있다. 낭비 없이 필요한 만큼만 깎아낸 흔적이 통 안에 고스란히 남아 있어, 기술력이 꽤 탄탄한 제품이라는 인상을 준다.

최종 평가

사실 이 제품의 가장 큰 매력은 기능보다 경험에 있다. 직접 써보니 집 안의 연필과 색연필을 전부 꺼내 깎고 싶어질 만큼 신기하고 재미있다. 아이 입장에서는 스스로 연필을 깎는다는 성취감을 느낄 수 있고, 부모 입장에서는 손목 아플 일이 없어지니 양쪽 모두에게 이득이다.

FINAL RATING
최종 평가 : ★★★★★

초등학교 입학 선물을 고민 중이거나, 매일 연필 깎아주느라 고생하고 있는 육아 동지들에게 현실적으로 권하고 싶은 아이템이다. 총점은 별 다섯 개 만점에 다섯 개!

📢 미래 게임 개발 주역 모여라! 제2회 ‘컴:온’ 현장

컴투스가 게임문화재단과 함께 주최한 ‘컴:온(Com:ON)’은 유망한 개발 인재들이 자신만의 게임으로 꿈을 현실로 만들어가길 바라는 진심 어린 응원이 담긴 무대다. ‘컴투스(Com2uS)’와 ‘온(On)’을 결합해, 세상을 향해 개발자들의 열정을 ‘켜라’는 의미를 담고 있다.

▲ 열정 가득했던 현장.

이번 대회에는 150여 편의 작품이 접수되며 높은 경쟁률을 기록했다. 2차에 걸친 면밀한 심사를 뚫고 최종 선발된 4개의 보석 같은 게임들을 지금 공개한다! 🚀


이번 공모전 최고의 영예인 대상은 게임공방(신문영, 전서경) 팀의 ‘소울 블레이드’가 차지했다.

소울 블레이드는 ‘탕탕특공대’나 ‘궁수의 전설’처럼 간편한 조작에 호쾌한 액션감, 깊이 있는 성장 요소를 동시에 갖춘 작품이다. 중세 아포칼립스 세계를 배경으로, 빼앗긴 동료를 되찾기 위해 몬스터와 사투를 벌이는 전사의 이야기를 화려한 연출로 풀어냈다.

특히 15년 이상의 인디 게임 개발 경력을 지닌 팀원들의 기술력이 돋보인다. 자체 제작한 자동화 툴을 활용해 고퀄리티 맵을 빠르게 양산하는 솔루션을 확보했으며, 레벨 스트리밍 방식을 도입해 스테이지 이동 시 로딩 없이 오픈월드처럼 시원하게 이어지는 플레이 환경을 구축했다.

능력을 얻을 때마다 패링이나 순간이동 같은 연계기가 추가되는 ‘콤보 빌딩 액션’ 시스템은 한 손 조작임에도 불구하고 격이 다른 타격감을 선사하며 심사위원들로부터 만장일치 호평을 끌어냈다.

▲ 강렬한 비주얼로 시선을 사로잡는 ‘소울 블레이드’의 메인 화면

화려한 이펙트와 함께 터지는 타격감!
한 손 조작임에도 콘솔급의 묵직한 손맛을 구현했다.

스튜디오 브라키오 팀의 작품으로, 2D 픽셀 아트로 표현한 스팀펑크 세계관이 돋보이는 하드보일드 액션 게임이다.

로봇 집사와 어린 아가씨의 서사를 담아낸 감성적인 아트다. 퀄리티가 상당하다.

이 게임은 증기 기술의 과발전으로 물이 권력이 된 ‘사막화 스팀펑크’ 디스토피아를 배경으로 삼았다. 갑작스러운 습격으로 홀로 남겨진 어린 아가씨와 그녀를 지키는 로봇 집사가 진실을 찾아가는 여정을 그리며 깊이 있는 서사를 제공한다.

픽셀 아트와 스팀펑크 디자인 포인트가 결합된 전투 장면이다.

게임은 은신처에서의 상호작용부터 정비소에서의 빌드 세팅, 그리고 전투로 이어지는 4단계 플레이 사이클을 반복하며 몰입도를 높인다. 특히 적의 공격 위치에 대응하는 정교한 회피 시스템과 ‘피버 타임’, 상성 기반의 팔 모듈 시스템은 액션 게임으로서의 완성도가 매우 높다는 평가를 받았다.

우수상을 차지한 브루트포스 팀의 글라이드는 고양이를 소재로 한 메트로베니아 장르의 횡스크롤 퍼즐 게임이다.

고양이 캐릭터의 매력과 정밀한 플랫폼 액션이 만난 탐험 장면이다.

이 작품은 “탐험의 본질은 예상치 못한 발견 그 자체에 있다”는 철학을 바탕으로 제작됐다. 개발자가 산책길에서 우연히 발견한 발자국을 따라가며 느꼈던 감동을 유저에게 전달하고자 기획됐다. 화려한 연출로 유저를 강제하는 대신, “저기 수상해 보이는데?”라는 유저의 호기심이 곧 정답이 되도록 모든 공간을 유기적으로 연결한 레벨 디자인이 특징이다.

플레이어 스스로 해답을 깨닫게 만드는 창의적인 퍼즐 기믹이다.

포탈과 레이저 등 다양한 수수께끼를 플레이어 스스로 해결하며 느끼는 성취감에 집중했으며, 70%에 달하는 높은 개발 진척도와 착 달라붙는 조작감으로 장르 특유의 재미를 훌륭하게 살려냈다.

또 다른 우수상 수상작인 TNTGames 팀의 GunPowder는 10~20대 유저를 겨냥한 파티형 아케이드 실시간 대전 액션 게임이다.

레트로한 구슬 발사 장난감 로봇들의 박진감 넘치는 대결 구도

숏폼 콘텐츠에 익숙해진 유저들의 메타에 맞춰 한 판의 플레이 타임을 5분 내외로 설계해 짧은 시간에도 부담 없이 즐길 수 있도록 기획됐다. ‘톰과 제리’ 같은 고전 카툰의 과장된 리액션을 참고한 역동적인 피격 연출은 파티 게임 특유의 유쾌한 분위기를 극대화한다.

빠른 템포와 화려한 연출로 아케이드의 재미를 강조했다.

단순한 조작법 속에 맵 기믹과 아이템을 활용한 변수 창출 요소를 담았으며, 특히 “팀원 중 한 명만 생존해도 팀 전체가 우승”하는 규칙을 도입해 실력 차이가 있는 유저들도 함께 승리의 즐거움을 공유할 수 있도록 설계된 점이 인상적이다.

시상식 현장에는 컴투스 송병준 의장님이 직접 참석해 수상자들에게 축하와 격려를 전하며 의미를 더했다. 평소 미래 게임 산업을 이끌 인재 발굴과 창작 생태계 조성의 중요성을 강조해온 송 의장님은 이날 직접 시상자로 나서 수상팀들의 열정을 높게 평가했다.

뿐만 아니라 의장님은 축사에서 “참신한 아이디어와 열정으로 완성된 수상작들은 국내 게임 산업의 가능성을 보여줄 뿐만 아니라, 컴투스에도 큰 자극과 영감을 준다”며, 미래 콘텐츠 산업을 이끌 인재들이 더 큰 무대에서 역량을 펼칠 수 있도록 지원을 이어가겠다고 강조했다. 앞으로의 ‘컴:온’이 어떤 모습으로 그려질지 더욱 기대되는 대목이었다.

컴투스는 선정된 4개 팀에 총 4,000만 원 규모의 상금과 상패를 수여했다. 하지만 상금보다 더 큰 가치는 수상자들이 프로 개발자로 성장할 수 있도록 돕는 실질적인 혜택에 있다.

컴투스는 수상팀들에게 글로벌 게임 플랫폼 ‘하이브(HIVE)’를 무상 제공해 글로벌 성장의 발판을 마련해 주며, 현직 전문가가 참여하는 멘토링 프로그램을 통해 실전 노하우를 전수한다. 또한, 컴투스 입사 지원 시 가산점 부여 혜택까지 제공하여 미래의 동반자로서 성장을 적극 지원할 계획이다.


제2회 ‘컴:온’은 국내 게임 창작 생태계의 뜨거운 가능성을 다시 한번 확인하는 자리가 됐다. 컴투스는 개발자들의 아이디어가 상상에 머물지 않고 글로벌 무대에서 빛날 수 있도록 언제나 든든한 동반자로 함께할 계획이다.

이번 대회를 아쉽게 놓쳤더라도 실망할 필요는 없다. 도전을 멈추지 않는 한 ‘컴:온’의 무대는 언제나 열려 있다. 다음 공모전에서 세상을 놀라게 할 게임과 함께 무대 위 주인공이 될 당신을 기다린다. 👏

이번 주인공은 컴투스에서 게임 기획 직무를 맡고 있는, 운동이라는 공통분모로 가까워진 두 사우다. 한 명은 옆에 있는 것만으로도 마음이 따뜻해지는, 타인의 감정을 섬세하게 읽어내는 F 성향의 ‘미’. 다른 한 명은 어떤 상황에서도 이성적인 판단을 흔들림 없이 내리는, 논리적이고 명쾌한 T 성향의 ‘꾸’. 언뜻 보면 ‘둘이 어떻게 친해졌을까?’ 싶을 정도로 정반대의 성격을 가졌지만, 자세히 들여다보면 다른 듯 묘하게 닮은 구석이 있는 두 사람이다.

현재는 서로 다른 팀에 속해 있지만, 여전히 하루에 한두 번은 만나 스트레칭을 하며 이야기를 나눈다. ‘직장 동료’보다 ‘친구’라는 표현이 더 자연스러운 사이가 된 꾸와 미. 그들의 가방 속을 함께 들여다봤다.

Q. 자기소개 부탁드립니다.

꾸: 안녕하세요! 라이브 기획팀에서 밸런스 기획을 담당하다가, 지금은 새로운 팀에서 라이브 서비스 직무를 수행하고 있는 꾸입니다.

미: 반갑습니다. 개발팀에서 게임 밸런스 기획을 맡았었고, 현재는 기획분석팀에서 게임 폴리싱과 지표 분석을 담당하고 있는 미라고 합니다!

Q. 두 분이 친해지게 된 계기는 무엇인가요?

꾸: 역시 운동 덕분인 것 같아요. 원래 움직이는 걸 워낙 좋아했거든요. 다이어트 같은 거창한 목적보다는, 그냥 몸을 움직이는 그 자체가 좋아서 계속하다 보니 마음이 맞았죠.

미: 맞아요. 개발팀에 같이 있을 때, 대화하다 보니 둘 다 운동과 건강에 진심이라는 걸 알게 됐어요. 그때부터 자연스럽게 운동 메이트가 되면서 가까워졌습니다.

Q. 두 분의 평소 운동 루틴을 소개해 주세요.

꾸: 저는 ‘하뛰하헬(하루 러닝, 하루 헬스)’을 실천 중이에요. 러닝은 보통 퇴근 후 밤 8시에서 12시 사이에 하고, 헬스는 요즘 미 님과 함께 회사 헬스장에서 아침 운동으로 조지고(?) 있습니다. 운동은 장기전이잖아요. ‘혼자 가면 빠르지만 같이 가면 멀리 간다’는 마인드로 임하고 있어요. 아, 물론 몸이 딱히 좋아지진 않네요. 운동하면 배가 너무 고파서요…

미: 저는 평일 출근 전에 헬스장에 들러 4~5종류의 웨이트를 해요. 유산소는 헬스 직후 러닝머신 인터벌을 하거나, 저녁이나 주말에 집 근처 공원에서 30분 정도 뛰며 보충하죠. 너무 바빠서 시간이 안 날 땐 집에서 스쿼트 100개와 30초 매달리기만이라도 꼭 합니다. 복잡한 루틴은 오히려 피로감을 주더라고요. 최대한 단순하고 익숙하게, ‘꾸준함’을 목표로 하고 있습니다!

Q. 소속 팀이 달라진 후에도 두 분만의 ‘스트레칭 타임’은 여전하다고 들었습니다.

미: 서로 운동 가기 귀찮을 때마다 연락해서 빨리 가라고 재촉해요. 회사에서도 몸이 찌뿌둥하면 계단에서 만나 스트레칭을 하죠. 예전엔 사무실 중간 층에서 만났는데, 요즘은 운동량을 늘리려고 아예 20층까지 걸어 올라가서 스트레칭을 해요. 계단 오르기에 어깨·다리 스트레칭까지 쫙 하고 나면 잠도 깨고 업무 집중도도 수직 상승합니다! 단 10분 투자로 업무의 질이 달라지는 경험을 하고 있어요. ✨

꾸: 미 님의 말에 전적으로 동의합니다. (비장)


🎸 [꾸의 가방: 추억과 실용의 미니멀리즘(?)]

가방 소개: 출근할 때도, 친구 만날 때도 늘 들고 다니는 애착 가방이에요. 2025 부산 국제 록 페스티벌 칭따오 부스에서 맥주 2L를 마시면 증정해줬던 가방으로 기억합니다. 그날 하루 종일 비가 왔는데, 우비를 쓴 채 구운 떡과 맥주를 먹으면서 노브레인 공연을 봤어요. 숙소에는 어떻게 돌아왔는지? 친구도 저도 기억이 없어서, 그 실마리는 아직 베일에 싸여 있습니다.

🔍 가방 속 대표 아이템


🧘 [미의 가방: 철저한 준비성의 정석]

가방 소개: 매일 드는 가방이 아니라, 운동하는 날 챙기는 가방이에요! 원래는 젝시믹스의 커다란 가방을 들고 다니다가, 신랑이 더 작은 걸 들라며 여행 겸 운동 가방을 선물해줘서 지금은 이걸 애용하고 있어요 🙂 내부에 방수 공간이 있어서 운동 후 땀에 젖은 옷을 넣어가기에도 딱이에요!

🔍 가방 속 대표 아이템

Q. 서로의 가방을 보고 “이 사람답다” 싶었던 아이템은?

꾸 → 미: 바리바리 파우치

헬스장에 있는 걸 쓰면 안 되는 걸까요? 그것들도 세계의 석학들이 만든 제품일 텐데… 짐이 많으면 잃어버릴 것도 많다.

미의 comment: 바디로션·헤어에센스·아이크림·앰플 같은 건 헬스장에 없다고요! 그리고 스킨케어는 피부 타입과 현재 상태에 따라 맞는 제품을 써야 한다고요~ 파우치 안에 있는 제품들도 그때그때 필요한 기능과 기분에 따라 달라지고 있다는 거, 전혀 눈치채지 못하고 계시군요.

미 → 꾸 선정: 운동 밴드

부서져도, 끊어져도, 낡아도 절대 물건을 버리지 않는 그녀…오히려 좋다면서 짧은 쪽을 저에게 내밀며 어깨 운동을 같이 하자던 첫날이 기억나요. 돌려줘도 돌려줘도 계속 들고 나와서 운동을 권하는, 그 올곧은 모습이 꾸의 정체성 그 자체라고 할 수 있어요.

호빵맨의 머리 같달까요? 당신이 몰랐던 사실 1. 제 바로 뒷자리 사우 분도 저 밴드의 짧은 부분을 나눠 가지고 있습니다. 당신이 몰랐던 사실 2. 저 밴드는 두 번째 밴드예요. (두 개 모두 어쩐 일인지 끊어져버렸습니다…)

Q. 두 분이 지금도 가끔 꺼내 웃게 되는 에피소드가 있나요?

미: 같이 아침 운동을 하고 출근 전에 꾸 님 댁에서 샤워를 한 적이 있었는데요. 제가 씻는 도중에 핸드폰이 없어졌다는 이야기를 하더니, 갑자기 강아지 산책을 시킨다며 핸드폰도 없이 나가버리시는 거예요. ‘씻고 나서 꾸 님이 돌아올 때까지 기다려야 하나, 아니면 내가 핸드폰을 찾으러 나가야 하나’ 온갖 걱정을 하면서 씻고 나왔더니, 텅 빈 거실에 꾸 님 핸드폰이 덩그러니 놓여 있었습니다…

꾸의 comment: 이제 변명을 시작해 보겠은니다. 1. 강아띠는 사람을 기다리지 않음. 강아띠에게는 제 휴대폰이고 나발이고 산책이 더 중요하죠. 2. 메모지를 남겨두고 갔을 거라 생각? (왜 갑자기 비약적으로 튀었는지 저도 모르겠지만, 그게 바로 “신뢰”라는 개념을 행동으로 보여준 거라고 생각합니다. 말하지 않아도 알 수 있는 건 초코파이뿐임에도.)

Q. 앞으로 서로에게 바라는 점이 있다면요?

꾸: 오래 행복해요 우리…

미: 앞으로도 같이 운동하면서 오래오래 지냅시다.

Q. 구체적으로 어떤 업무를 진행하고 계신가요?

꾸: 라이브 서비스 중인 게임의 BM 상품 기획과 운영, 그리고 결제 유저 성향 분석을 바탕으로 한 상품 구조 개선 업무를 주로 담당하고 있습니다. 이 외에도 상점 및 결제 플로우 관련 편의성 개선 기획, 업데이트 공지 작성, 라이브 이슈 및 업데이트 대응 등 서비스 운영 전반과 연계된 업무를 함께 진행하고 있습니다.

미: 지표 분석을 통해 라이브 중인 자사 게임을 모니터링하거나, 이슈 대응과 업데이트 검토 등의 업무를 진행해요. 런칭 전 게임을 담당할 때는 레퍼런스와 자사 데이터베이스를 기반으로 시행착오를 최소화할 수 있도록 게임성이나 시스템·밸런스 검토를 진행합니다!

Q. 해당 직무를 수행하면서 가장 비약적으로 성장하게 되는 역량은 무엇인가요?

꾸: 라이브 서비스 데이터를 바탕으로 유저의 행동과 소비 패턴을 해석하는 데이터 활용 역량을 가장 많이 배우고 있습니다. 단순히 지표를 확인하는 수준을 넘어, 특정 지표의 변화가 유저 경험이나 상품 구조에서 어떤 원인으로 발생했는지 분석하고, 이를 BM 및 서비스 운영 방향에 반영하는 과정을 반복적으로 익히고 있습니다.

미: 사용자 활동 로그 등 데이터를 단순히 계산하고 추출하는 것이 아니라, 그 데이터가 어떤 현상을 의미하는지 해석하는 일을 주로 하고 있어요. 또한 아직 라이브로 구현되지 않은 기획, 즉 프로토 단계의 시스템과 밸런스를 가지고 실제 서비스 상황에서 유저가 어떻게 느끼고 반응할지 예측하는 직관도 함께 키우고 있습니다.

Q. 실제 서비스 지표나 유저들의 피드백을 기획 개선으로 연결했던 생생한 사례가 궁금합니다.

꾸: BM 상점에서 아이템 아이콘을 선택해도 별도의 반응이 없어 유저가 상세 정보를 확인할 수 없는 문제가 있었습니다. 데이터를 살펴보니 모바일 기기로 플레이하는 유저 비중이 압도적으로 높았는데, 아이템 정보를 확인하려면 게임을 백그라운드로 전환해 외부에서 따로 찾아봐야 하는 상황이었어요. 이 과정이 게임 플레이의 흐름을 끊는다는 점, 특히 구매 의사가 있는 신규 유저에게는 결제 진입 장벽이 될 수 있다고 판단했습니다. 아이콘 선택 시 상세 정보를 즉시 확인할 수 있도록 개선을 제안했고, 현재는 해당 기능이 반영된 상태입니다.

미: 처음부터 완벽한 개발과 운영을 할 수 있다면 좋겠지만, 예측하지 못한 이슈로 밸런스나 유저 체감에 문제가 생기는 경우도 있어요. 이미 배포된 업데이트를 되돌릴 수는 없기 때문에, 추가 업데이트를 통해 밸런스를 다시 맞추거나 유저의 불만을 해소할 수 있는 수단을 추가하는 방식으로 대응합니다.

Q. 기획 의도와 시장의 반응이 엇갈렸던 경험이 있나요? 그 과정에서 얻은 인사이트가 있다면요?

꾸: 이전 프로젝트에서 업적과 유사한 시스템을 운영한 적이 있습니다. 처음부터 직접 기획한 것이 아니라, 라이브 상태에서 인수인계받아 관리하게 된 시스템이었어요.

당시 일부 업적은 유저의 성장 동선과 동떨어진 목표로 설계되어 있었고, 달성에 필요한 순수 플레이 시간이 상당한데도 보상 가치가 낮아 실질적으로는 거의 이용되지 않는 콘텐츠였습니다. 커뮤니티에서도 자연스럽게 외면되는 분위기였고, 신규 유저가 관련 질문을 올리면 기존 유저들이 굳이 권하지 않는 상황도 직접 확인할 수 있었어요.

이 경험을 통해, 경쟁 요소가 있는 게임에서는 콘텐츠가 유저의 성장 동선과 긴밀하게 연결되어야 한다는 점을 배웠습니다. 성장 과정에서 자연스럽게 달성되거나 최소한 성장 효율과 연동되지 않으면, 유저가 시간을 투자할 동기 자체가 크게 떨어진다는 걸 몸소 실감한 거죠.

이후 일부 업적의 달성 조건을 조정해 목표 난이도를 완화하고, 반대로 특정 고투력 지역에서만 달성 가능한 업적은 과시 요소로 유지해 차별화된 목표로 기능하도록 개선했습니다. 이 경험 이후로는 유저의 실제 플레이 동선, 그리고 시간 투자 대비 보상 가치의 균형이 맞는지를 콘텐츠 설계의 중요한 기준으로 삼고 있습니다.

미: 게임 내 모든 콘텐츠와 경제 구조는 유기적으로 연결되어 있기 때문에, 단편적인 정보만으로 판단해서는 안 된다는 점이에요! 추가 업데이트로 공급된 재화가 다른 콘텐츠에 영향을 미치는 경우도 많고, 한 아이템의 시세 변화가 연관 아이템의 시세까지 흔드는 경우도 있어요. 항상 종합적으로 판단하고 계획하는 일이 얼마나 중요한지, 거듭 실감하고 있습니다.

Q. 직무를 수행하며 가장 보람을 느끼는 순간은 언제인가요?

꾸: 담당 게임의 커뮤니티나 자유게시판을 자주 확인하는 편인데, 업데이트나 상품 개선 이후 유저들의 긍정적인 반응이 올라올 때 가장 보람을 느낍니다. 특히 BM이나 편의성 관련 개선 사항에 대해 유저들이 실제로 체감하고 좋은 반응을 보일 때, 기획 의도가 잘 전달됐다는 느낌을 받습니다.

미: 담당 게임의 오픈채팅이나 커뮤니티를 상시로 확인하는 편인데요. 신규 업데이트에 좋은 이야기가 올라오거나, 업데이트 내역을 보며 “아, 이걸 위해 이렇게 했구나” 하고 의도를 알아봐 줄 때 그 보람이 가장 크게 느껴지는 것 같아요.

Q. 만드는 사람’이 되고 나서 게임을 바라보는 관점에도 변화가 생겼을 것 같습니다.

꾸: 입사 전에는 재미 중심으로 게임을 플레이했다면, 지금은 어떤 재화를 의도적으로 부족하게 설계했는지를 먼저 살피게 됐습니다. 새로운 게임을 접할 때는 커뮤니티나 위키를 통해 유저들이 느끼는 불편과 문제 지점을 먼저 파악하고, 직접 플레이하면서 왜 특정 재화가 부족하게 느껴지는지, 그 부족함을 보완하는 상품이나 콘텐츠가 어떤 구조로 설계되어 있는지를 함께 확인합니다.

미: 조금 슬픈 이야기지만… 게임에서 버그나 설계 오류가 발견될 때 측은지심이 생기게 됐어요. 이슈 자체의 발생보다는, 이슈가 생겼을 때 개발사·운영사가 어떻게 대응하는지를 더 눈여겨보게 된 것 같습니다.

Q. 기획자들만 공감할 수 있는 독특한 ‘직업병’이 있다면 무엇인가요?

꾸: 게임을 플레이할 때 첫 패키지가 노출되는 시점을 자연스럽게 확인하게 됩니다. 게임 시작 후 얼마 만에 첫 상품이 등장하는지, 이후 어떤 간격으로 새로운 패키지가 제안되는지, 구성과 효율은 어떤지를 유심히 살펴보게 되거든요. 해당 게임이 초기 과금 유도를 어떤 타이밍과 구조로 설계했는지 분석하는 게 어느새 습관이 됐습니다.

미: 예전에는 재미없거나 취향에 맞지 않는 게임이면 금방 그만두는 스타일이었는데, 이제는 개발사가 의도한 재미 포인트가 무엇일지 고민하면서 최대한 플레이해보게 되는 것 같아요. 그러다 보면 후반부에 숨겨진 재미 요소를 발견하기도 하고, 그 이전에 이탈할 유저들을 어떻게 재미있는 지점으로 이끌어올 수 있을지 자연스럽게 고민하게 됩니다.

Q. 최근 게임 산업의 변화 속에서 기획자의 역할은 어떻게 진화하고 있다고 보시나요?

꾸: 콘솔·패키지 중심에서 라이브 서비스 게임 중심으로 시장이 이동하면서, 게임 기획자의 역할에도 라이브 운영 영역이 자연스럽게 더해졌다고 느낍니다. 라이브 서비스 게임은 엔딩 없이 장기간 콘텐츠와 업데이트를 지속 제공해야 하고, 그 과정에서 매출도 꾸준히 발생하는 구조예요. 그렇기에 게임 내 경제 구조와 BM 설계의 중요성이 이전보다 훨씬 커졌고, 단순히 콘텐츠를 설계하는 것을 넘어 유저의 소비 패턴과 게임 내 경제 밸런스를 고려한 기획, 그리고 라이브 지표를 기반으로 한 서비스 운영 역량이 기획자에게 점점 더 중요해지고 있다고 생각합니다.

미: 즐길 수 있는 미디어 콘텐츠가 워낙 다양해지다 보니 사람들이 점점 저관여 게임을 찾게 되고, 캐주얼 게임의 경우 기획자 없이 개발하는 사례도 종종 보이더라고요. 하지만 그 와중에도 깊이 있는 고관여 게임을 즐기는, 게임 안에서 깊은 여운과 울림을 기대하는 사람들은 분명히 존재합니다. 그렇기 때문에 게임 기획자의 설계와 깊은 고민은 아직, 그리고 앞으로도 필요하다고 생각해요.

Q. 데이터와 AI 기술의 발전이 실제 기획 현장에 어떤 영향을 주고 있나요?

꾸: 자료 정리나 문서 작성 보조 같은 반복적인 작업에서 업무 시간을 단축해주는 도구로 주로 활용되고 있는 것 같습니다. 다만 게임 기획은 결국 유저의 ‘감정’을 고려한 의사결정이 핵심이기 때문에, AI가 기획자의 역할을 완전히 대체하기보다는 아이디어 발굴을 돕는 조력자에 머물지 않을까 싶습니다.

미: AI 기술이 너무 빠르게 발전하다 보니 역할이 대체될까 걱정되는 마음도 솔직히 있어요. 하지만 결국 AI는 인간이 남긴 데이터를 기반으로 학습하고 처리하는 것이기 때문에, 실제 인간의 역할을 지금 당장 대체하기는 어렵다고 생각해요. 수십 년간 매일 게임을 해온 사람의 주관과 견해를 AI가 완벽하게 재현할 수는 없으니까요. AI는 기획자를 대체하기보다, 미처 떠올리지 못한 레퍼런스를 찾아주거나 데이터 간의 정합성 검토를 도와주는 동료로 함께 진화하지 않을까 싶어요. 저도 실제로 레퍼런스를 찾을 때 AI로 먼저 확인한 뒤 직접 검증하는 방식으로 활용하면서 업무 시간을 줄이고 있답니다.

Q. 미래의 동료가 될 예비 기획자들에게 꼭 추천하고 싶은 경험이나 준비 과정이 있다면?

꾸: 게임 플레이 경험을 기록하는 ‘게임 일기’를 써보는 것을 추천합니다. 특정 콘텐츠를 경험하면서 내 행동이 어떻게 유도되었는지, 그 과정이 재미있었는지, 재미가 있었다면 그 이유는 무엇인지를 정리해보는 거예요. 머릿속으로 생각하는 것과 실제로 글로 정리하는 것은 이해의 깊이가 다릅니다. 이 기록 습관이 기획 의도와 플레이 경험을 분석하는 능력을 기르는 데 분명히 도움이 될 거예요.

미: 게임을 많이, 그리고 깊게 경험해보는 것을 가장 강조하고 싶어요. 단순한 플레이 시간보다, 그 시간 동안 게임에 얼마나 깊이 몰입하고 이해했는지가 중요합니다. 하나의 게임을 하더라도 의도와 설계를 생각하며 플레이해보면 좋겠어요. 또한 본인이 어떤 게임을 좋아하는지, 게임의 어떤 부분이 재미있는지 스스로 고민해보는 것도 중요합니다. 게임은 장르와 직무에 따라 필요한 역량이 매우 세분화되어 있거든요. 그 고민을 바탕으로 원하는 회사와 팀을 구체적으로 탐색해보길 권합니다.

Q. 취업을 준비하며 치열하게 고민 중인 후배 기획자들에게 진심 어린 조언 부탁드립니다.

꾸: 게임을 플레이할 때 각 콘텐츠의 기획 의도를 꾸준히 추측해보는 연습을 해보시길 권합니다. 밸런스나 시스템이 다소 의외로 느껴지는 콘텐츠라도 기획 의도는 반드시 존재합니다. “왜 이 재화는 부족하게 설계되어 있을까”, “왜 이 시점에 이 보상을 줄까” 같은 질문을 던지며 플레이하다 보면, 자연스럽게 기획자의 시선으로 게임을 바라보는 습관이 생길 거예요.

미: 좋은 아이디어, 혁신적인 아이디어보다도 그 아이디어를 현실로 만드는 방법에 대해 많이 공부해보았으면 해요. 생각은 누구나 할 수 있지만, 설계할 줄 알아야 현실이 되고 검증이 됩니다. 게임을 즐기는 사람이 아니라, 게임을 만드는 사람의 관점으로 게임을 대할 줄 알아야 한다는 것. 그게 핵심이라고 생각합니다.

Q. 마지막으로, 컴투스 게임을 아껴주시는 유저분들께 한마디 남겨주세요!

꾸: 패키지 많이 사주세요..

미: 게임 하나에 정말 많은 사람의 진심이 담깁니다. 모든 순간 만족을 드릴 순 없겠지만, 늘 여러분의 즐거움을 위해 치열하게 고민하는 사람들이 있다는 걸 기억해 주세요. 더 멋진 게임으로 보답하겠습니다!

IN MY BAG

다음 주인공은 바로 당신! 🎒

마음 맞는 동료와 함께 나만의 개성 넘치는 소지품을 자랑하고 싶은
컴투스인들의 참여를 기다립니다.

👤 이런 분들과 함께라면 OK! (택 1)

Case 1. 우리 팀원들과 함께!

같은 직무를 수행하며 서로 다른 가방 속 사연을 가진 조합

OR
Case 2. 취미 메이트와 함께!

직무는 달라도 같은 취미를 공유하는 조합

* ex. 커피러버들, 운친자들의 인마이백

🎁 참여 혜택

자원기자 보상 네이버페이 10만원
인터뷰 당일 맛있는 점심 식사

모집 대상: 가방 속에 할 말이 많은 컴투스인 누구나
신청 방법: 하단 버튼 클릭

👉 인터뷰 신청하기

* 신청서 접수 후 담당자가 개별 연락을 드릴 예정입니다.

봄의 시작과 함께 야구의 계절이 돌아왔다. 단순히 경기장에 정시 도착하는 직관을 넘어, 하루 전체를 야구에 대한 설렘으로 채울 수 있는 나들이 코스를 제안한다. 연남동의 감성적인 골목 산책부터 고척 스카이돔의 뜨거운 함성까지, 야구 팬을 위한 하루 동선을 따라가 보았다.

연남동, 계절을 입은 골목의 정취를 걷다

연남동 일대는 도심 속에서도 계절의 변화를 가장 가깝게 누릴 수 있는 대표적인 산책 코스다. 벚꽃 시즌에는 벚꽃이 만개해 꽃길 산책의 낭만을 즐길 수 있고, 꽃이 진 뒤에는 초록빛 잎사귀가 드리운 조용한 골목이 또 다른 정취를 선사한다. 어느 시기에 찾아도 야구 관람 전 가볍게 걷기 좋은 동선으로 제격이다.

포토그레이 연남점: “내 최애 선수와 남기는 한 컷의 기록”

작년에 이어 올해도 컴투스프로야구가 포토그레이와 콜라보를 진행했다. 소식을 확인하자마자 재빠르게 방문해 선수들과 특별한 추억을 남겼다.

이벤트는 KBO 리그 개막 기간에 맞춰 3월 28일부터 4월 30일까지 운영된다. 전국 포토그레이 매장에서 콜라보 프레임 촬영이 가능하고, 포토그레이 연남점에서만 스페셜 테마 매장이 별도로 운영된다.

매장 입구부터 분위기가 남다르다. 컴프야2026 공식 모델 문동주와 컴프야V26 공식 모델 구자욱, 김도영의 사진이 유리창을 가득 채우며 방문객을 맞이한다.

매장 안으로 들어서면 야구장을 그대로 옮겨 놓은 듯한 팝업 공간이 시선을 사로잡는다. 컴투스 유니폼을 입은 세 선수의 실물 등신대가 나란히 서 있어 옆에서 직접 기념사진을 찍는 것도 가능하다. 단순한 포토부스를 넘어 야구 팬을 위한 체험형 콘텐츠 공간으로 운영되는 셈이다. 경기 직관 전에 가볍게 들러 한 컷 남기기에도 부족함이 없고, 출력된 사진 한 장이 그날의 직관을 오래도록 기억하게 하는 기념이 된다.

포토부스 내부 촬영 화면에서는 컴투스프로야구 광고 영상도 만나볼 수 있다. 촬영 시 콜라보레이션 메뉴에서 컴투스프로야구를 선택하면 선수별 개인 프레임과 기본 프레임 등 총 4종 중 하나를 고를 수 있다. 가격은 2장에 7,000원이며 4월 30일까지 전국 어디서든 만나볼 수 있다.

📍 테마매장 정보

  • 위치: 포토그레이 연남 1호점 (서울 마포구 양화로23길 42 1층)
  • 운영 기간: 3/28(토) ~ 4/30(목)
  • 운영 시간: 10:00 ~ 22:00
  • 스페셜 테마매장은 연남 1호점 단독 운영, 콜라보 프레임은 전국 포토그레이 매장에서 촬영 가능!

동선은 이렇게, 연남동 맛집 코스

본격적인 응원 전에는 든든한 ‘승리의 기운’을 충전해야 한다. 이동 동선을 최적화하면서도 팬들의 입맛을 사로잡을 메뉴를 엄선했다.

카마카츠 연남점 | 돈까스 정식

육즙 가득한 돈까스와 돌솥밥으로 든든하게 한 끼를 해결할 수 있다. 경기 전 배를 채우기에 이만한 선택이 없다.

사이드테이블 | 크로플 & 커피

고척돔으로 이동하기 전 마지막 당 충전 코스다. 겉바속촉 크로플은 장시간 응원을 버틸 에너지를 만들어준다.

한강을 지나 고척돔으로, 기대감도 함께 이동

대중교통을 이용해 한강을 가로지르며 창밖의 도심 풍경을 바라보는 순간, “이제 진짜 야구 보러 간다”는 설렘이 최고조에 달한다. 포토그레이에서 선수들과 이미 한 컷을 남긴 상태라면 경기에 대한 몰입도도 한층 달라지는 느낌이다. 지갑 속 사진이 주는 소소한 연결감이, 경기장에 들어서는 발걸음을 한결 가볍게 만든다.

고척 스카이돔: 날씨를 잊은 완벽한 스포츠의 장

고척 스카이돔에서 키움 vs LG 경기가 펼쳐졌다. 돔 경기장의 가장 큰 장점은 날씨에 관계없이 쾌적하게 경기를 즐길 수 있다는 점이다. 갑작스러운 봄비나 황사 걱정 없이 오직 경기에만 집중할 수 있는 환경은 직관의 질을 한층 높여준다.

치킨, 간식, 음료 등 야구장 특유의 먹거리들도 빼놓을 수 없다. 경기 관람의 재미를 한층 끌어올리는 조연들이다.

야구의 계절은 이제부터가 진짜 시작이다. 야구장으로 향하는 모든 과정은 그 자체로 팬들에게 커다란 설렘이 된다. 이번 시즌, 컴투스프로야구와 함께 그라운드의 열기를 더욱 생생하고 재미있게 만끽해 보자.

개론

클라이언트의 요청을 처리하는 서버를 구축할 때는 일반적으로 TCP, UDP 프로토콜을 기반으로 통신을 처리한다. 이때 모든 네트워크 통신은 기본적으로 소켓(Socket)이라는 단위를 통해 관리된다.

아키텍처 관점에서 보면 하나의 프로세스 또는 스레드가 하나 이상의 소켓을 동시에 처리할 수 있다. 하지만 여러 소켓을 효율적으로 처리하려면 I/O Multiplexing(입출력 다중화) 메커니즘이 필요하다. 이를 통해 단일 스레드 또는 프로세스가 여러 I/O 이벤트를 동시에 감시하고 처리할 수 있다.

리눅스에서는 이러한 입출력 다중화를 지원하기 위해 select, poll, epoll과 같은 API를 제공한다. 그중에서도 epoll은 대규모 동시 연결 환경에서 높은 효율을 제공하는 메커니즘으로 널리 사용된다.

이번 글에서는 epoll의 사용 방법 자체보다는 리눅스 커널 소스코드 관점에서 epoll이 내부적으로 어떻게 동작하는지를 살펴보려 한다. 특히 리눅스 커널 내부 구조와 데이터 흐름을 중심으로 epoll의 동작 과정을 단계적으로 분석한다.

주의 사항

본론: epoll의 내부 동작 원리

epoll 인터페이스를 구성하는 syscall은 세 가지다. epoll_create, epoll_ctl, epoll_wait이다. 기본적인 소켓 서버에서 클라이언트 요청을 처리하는 흐름은 아래 다이어그램과 같다.

동작 순서를 간략히 설명하면 다음과 같다. epoll_create로 epoll 파일 디스크립터(epollfd)를 생성하고, epoll_ctl을 통해 관심 FD 목록에 원하는 소켓을 등록한다. 이후 해당 FD에 Read/Write 이벤트가 발생하면 epoll_wait syscall에 의해 블로킹 상태에서 깨어나며, 이벤트를 발생시킨 FD를 처리할 수 있게 된다. 지금부터 각 syscall을 순서대로 살펴보자.

epoll_create

SYSCALL_DEFINE1(epoll_create, int, size)
{
	if (size <= 0)
		return -EINVAL;

	return do_epoll_create(0);
}

epoll_create syscall이 호출되면 내부적으로 do_epoll_create 함수가 실행된다.

static int do_epoll_create(int flags)
{
[...]
	error = ep_alloc(&ep);
[...]
	FD_PREPARE(fdf, O_RDWR | (flags & O_CLOEXEC),
		   anon_inode_getfile("[eventpoll]", &eventpoll_fops, ep,
				      O_RDWR | (flags & O_CLOEXEC)));
[...]
	ep->file = fd_prepare_file(fdf);
	return fd_publish(fdf);
}

ep_alloc 함수는 struct eventpoll 구조체를 할당한다. anon_inode_getfile 함수는 하나의 파일 인스턴스(struct file)를 생성하고, 그 내부 private_data 필드에 방금 할당한 struct eventpoll을 주입하며, f_op 필드에는 eventpoll_fops를 등록한다. FD_PREPARE 매크로 함수는 struct fdstruct file을 준비하고, fd_prepare_file을 통해 생성된 struct filestruct eventpollfile 필드에 연결한다. 마지막으로 fd_publish가 fd와 struct file을 맵핑하여 사용자 공간에 반환 가능한 파일 디스크립터를 완성한다.

struct file {
[...]
	const struct file_operations	*f_op;
	void				*private_data;
	struct inode			*f_inode;
[...]
}

static const struct file_operations eventpoll_fops = {
	.release	= ep_eventpoll_release,
	.poll		= ep_eventpoll_poll,
};

리눅스의 가상 파일 시스템(Virtual File System, VFS)은 커널 내 소프트웨어 계층으로, 사용자 공간 프로그램에 일관된 파일 시스템 인터페이스를 제공한다. 또한 커널 내부에서 추상화 계층으로 동작하여 서로 다른 파일 시스템 구현이 공존할 수 있도록 한다. 여기서 private_data는 해당 파일 인스턴스가 실제로 가리키는 커널 객체 포인터이고, f_op는 VFS가 열린 파일을 조작하는 방법을 정의하는 함수 테이블이다. f_op에는 read, write, poll 등의 연산이 포함되며, poll은 프로세스가 특정 파일에 대한 I/O 활동 여부를 확인하고 필요하다면 대기할 때 호출된다. select, epoll 등의 syscall이 대표적인 호출 주체이다. VFS에 대한 자세한 내용은 공식 커널 문서(https://docs.kernel.org/filesystems/vfs.html)를 참고하기를 권장한다.

여기까지 정리하면, epoll_createstruct eventpoll 구조체 하나를 할당하고 이를 파일로 관리한다는 것이 핵심이다.

struct eventpoll의 각 필드를 아래에 정리한다.

struct eventpoll {
	/* Wait queue used by sys_epoll_wait() */
	wait_queue_head_t wq;

	/* Wait queue used by file->poll() */
	wait_queue_head_t poll_wait;

	/* List of ready file descriptors */
	struct list_head rdllist;

	/* RB tree root used to store monitored fd structs */
	struct rb_root_cached rbr;
	/*
	 * This is a single linked list that chains all the "struct epitem" that
	 * happened while transferring ready events to userspace w/out
	 * holding ->lock.
	 */
	struct epitem *ovflist;
	struct file *file;
};

이 개념들은 이후 단계에서 다시 등장하므로 흐름 속에서 함께 이해하면 된다.

epoll_ctl

SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,
		struct epoll_event __user *, event)
{
	struct epoll_event epds;
[...]
	return do_epoll_ctl(epfd, op, fd, &epds, false);
}

int do_epoll_ctl(int epfd, int op, int fd, struct epoll_event *epds,
		 bool nonblock)
{
[...]
	ep = fd_file(f)->private_data;
	epi = ep_find(ep, fd_file(tf), fd);

	switch (op) {
	case EPOLL_CTL_ADD:
		if (!epi) {
			epds->events |= EPOLLERR | EPOLLHUP;
			error = ep_insert(ep, epds, fd_file(tf), fd, full_check);
		}
		break;
	case EPOLL_CTL_DEL:
		if (epi)
			ep_remove_safe(ep, epi);
		break;
	case EPOLL_CTL_MOD:
		if (epi) {
			if (!(epi->event.events & EPOLLEXCLUSIVE)) {
				epds->events |= EPOLLERR | EPOLLHUP;
				error = ep_modify(ep, epi, epds);
			}
		}
		break;
	}
[...]
	return error;
}

사용자 공간에서 특정 파일 디스크립터를 감시 목록에 추가·수정·제거하려면 epoll_ctl syscall을 이벤트 정보와 함께 호출한다. 커널 내부에서는 do_epoll_ctl 함수가 실행된다. 인자로 전달된 epfd는 파일 디스크립터이며 내부적으로 struct file로 관리된다. 앞서 epoll_create에서 private_data에 epoll 인스턴스를 주입했음을 떠올리면 이해가 쉽다. ep_find 함수는 등록하려는 FD가 이미 관심 목록에 있는지 검색하고, 없으면 NULL을 반환한다. 이후 op 값에 따라 EPOLL_CTL_ADD(추가), EPOLL_CTL_MOD(수정), EPOLL_CTL_DEL(삭제) 연산이 분기된다. 추가의 경우 ep_insert 함수를 통해 레드블랙 트리에 struct epitem을 삽입한다.

static int ep_insert(struct eventpoll *ep, const struct epoll_event *event,
		     struct file *tfile, int fd, int full_check)
{
	__poll_t revents;
	struct epitem *epi;
	struct ep_pqueue epq;
[...]
	epi = kmem_cache_zalloc(epi_cache, GFP_KERNEL)
[...]
	ep_rbtree_insert(ep, epi);

	/* Initialize the poll table using the queue callback */
	epq.epi = epi;
	init_poll_funcptr(&epq.pt, ep_ptable_queue_proc);

	revents = ep_item_poll(epi, &epq.pt, 1);

	/* If the file is already "ready" we drop it inside the ready list */
	if (revents && !ep_is_linked(epi)) {
		list_add_tail(&epi->rdllink, &ep->rdllist);
		ep_pm_stay_awake(epi);

		/* Notify waiting tasks that events are available */
		if (waitqueue_active(&ep->wq))
			wake_up(&ep->wq);
	}
	return 0;
}

static __poll_t ep_item_poll(const struct epitem *epi, poll_table *pt,
				 int depth)
{
	struct file *file = epi_fget(epi);
	__poll_t res;

	/*
	 * We could return EPOLLERR | EPOLLHUP or something, but let's
	 * treat this more as "file doesn't exist, poll didn't happen".
	 */
	if (!file)
		return 0;

	pt->_key = epi->event.events;
	if (!is_file_epoll(file))
		res = vfs_poll(file, pt);
	else
		res = __ep_eventpoll_poll(file, pt, depth);
	fput(file);
	return res & epi->event.events;
}

ep_insertstruct epitem 하나를 할당한 뒤 ep_rbtree_insert로 레드블랙 트리에 삽입한다. 이어서 ep_pqueuept 필드에 ep_ptable_queue_proc 함수를 등록하고, ep_item_poll을 호출하여 epoll_wait 진입 이전에 이미 발생한 이벤트가 있는지 확인한다. 내부적으로는 vfs_poll 함수 포인터, 즉 file->f_op->poll(file, pt) 구조로 호출이 이어진다.

여기서 대상 파일은 epoll 인스턴스가 아니라 등록하려는 소켓의 FD다. 소켓이라면 sock_poll로, TCP 소켓이라면 tcp_poll로 확장된다.

_poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
{
[...]
	sock_poll_wait(file, sock, wait);
	
	// TCP_LISTEN
	state = inet_sk_state_load(sk);
	if (state == TCP_LISTEN)
		return inet_csk_listen_poll(sk);

	// TCP_ESTABLISHED
	shutdown = READ_ONCE(sk->sk_shutdown);
	if (shutdown == SHUTDOWN_MASK || state == TCP_CLOSE)
		mask |= EPOLLHUP;
	if (shutdown & RCV_SHUTDOWN)
		mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP;

	/* Connected or passive Fast Open socket? */
	if (state != TCP_SYN_SENT &&
	    (state != TCP_SYN_RECV || rcu_access_pointer(tp->fastopen_rsk))) {
		int target = sock_rcvlowat(sk, 0, INT_MAX);
		u16 urg_data = READ_ONCE(tp->urg_data);
[...]
		if (tcp_stream_is_readable(sk, target))
			mask |= EPOLLIN | EPOLLRDNORM;
[...]
	return mask;
}

tcp_poll에서 등록 대상 소켓은 크게 두 가지 상태일 수 있다. 서버 소켓이라면 TCP_LISTEN 상태이고, 클라이언트 소켓이라면 3-way handshake가 완료된 TCP_ESTABLISHED 상태이다. TCP_LISTEN 상태에서는 inet_csk_listen_poll 함수를 호출하여 accept queue에 대기 중인 연결 요청이 있는지 확인한다. TCP_ESTABLISHED 상태에서는 tcp_stream_is_readable 함수로 읽을 수 있는 데이터가 수신 버퍼에 존재하는지 확인하고, 있으면 EPOLLIN 마스크를 설정한다.

static inline void sock_poll_wait(struct file *filp, struct socket *sock,
				  poll_table *p)
{
	poll_wait(filp, &sock->wq.wait, p);
}

static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
{
	if (p && p->_qproc && wait_address)
		p->_qproc(filp, wait_address, p);
}

sock_poll_waitpoll_wait을 래핑한 함수다. 내부에서 p->_qproc를 호출하는데, 이는 앞서 등록한 ep_ptable_queue_proc 함수다.

static void ep_ptable_queue_proc(struct file *file, wait_queue_head_t *whead,
				 poll_table *pt)
{
	struct ep_pqueue *epq = container_of(pt, struct ep_pqueue, pt);
	struct epitem *epi = epq->epi;
	struct eppoll_entry *pwq;

	pwq = kmem_cache_alloc(pwq_cache, GFP_KERNEL);

	init_waitqueue_func_entry(&pwq->wait, ep_poll_callback);
	pwq->whead = whead;
	pwq->base = epi;
	if (epi->event.events & EPOLLEXCLUSIVE)
		add_wait_queue_exclusive(whead, &pwq->wait);
	else
		add_wait_queue(whead, &pwq->wait);
	pwq->next = epi->pwqlist;
	epi->pwqlist = pwq;
}

static inline void
init_waitqueue_func_entry(struct wait_queue_entry *wq_entry, wait_queue_func_t func)
{
	wq_entry->flags		= 0;
	wq_entry->private	= NULL;
	wq_entry->func		= func;
}

두 번째 인자 &sock->wq.wait는 감시 대상 소켓의 wait queue이다. init_waitqueue_func_entry를 통해 이벤트 발생 시 호출할 콜백 함수로 ep_poll_callback을 등록한다. 사용자가 EPOLLEXCLUSIVE 이벤트를 포함하여 등록했다면 add_wait_queue_exclusive를 호출하고, 그렇지 않다면 add_wait_queue를 호출하여 소켓의 wait queue에 현재 프로세스의 wait 엔트리를 FIFO 또는 LIFO 방식으로 삽입한다.

ep_insert로 돌아오면, revents 값이 1 이상이라는 것은 epoll_wait 진입 전에 이미 이벤트가 발생했음을 의미한다. 이 경우 해당 epitemep->rdllist에 즉시 추가한다. 그리고 대기 중인 프로세스가 있다면(waitqueue_active) wake_up 매크로를 호출하여 콜백을 트리거한다. 이때 호출되는 콜백의 핵심은 아래와 같다.

static int __wake_up_common(struct wait_queue_head *wq_head, unsigned int mode,
			int nr_exclusive, int wake_flags, void *key)
{
	curr = list_first_entry(&wq_head->head, wait_queue_entry_t, entry);

	list_for_each_entry_safe_from(curr, next, &wq_head->head, entry) {
		unsigned flags = curr->flags;
		int ret;

		ret = curr->func(curr, mode, wake_flags, key);
		if (ret < 0)
			break;
		if (ret && (flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)
			break;
	}

	return nr_exclusive;
}

curr->func 함수 포인터가 앞서 등록한 ep_poll_callback이다. 해당 함수의 상세 내용은 이후 epoll_wait 절에서 설명한다.

epoll_ctl의 전체 흐름은 아래 다이어그램으로 정리한다.

요약하면 EPOLL_CTL_ADD 연산은 감시 대상 FD에 해당하는 struct epitem을 하나 생성하고, 해당 소켓의 wait queue에 ep_poll_callback을 콜백으로 가진 wait 엔트리를 등록하는 과정이다. 이후 해당 소켓에 읽기·쓰기 이벤트가 발생하면 이 콜백이 자동으로 트리거된다. 아울러 epoll_wait 호출 이전에 이미 발생한 이벤트가 있는지도 이 단계에서 함께 확인한다.

관련 구조체를 참고용으로 정리한다.

/*
	epoll이 관심 대상 파일의 wait queue에 등록하는 엔트리.
*/
struct eppoll_entry {
	struct eppoll_entry *next;
	struct epitem *base;
	wait_queue_entry_t wait;
	wait_queue_head_t *whead;
};

/*
	wait queue에 엔트리 등록 과정에서 사용하기 위함. (poll 시스템과 epoll 시스템 연결)
*/
struct ep_pqueue {
	poll_table pt;
	struct epitem *epi;
};

/*
	관심 대상 FD당 하나 epitem 생성 및 할당
*/
struct epitem {
	union {
		struct rb_node rbn;
		struct rcu_head rcu;
	};
	// 활성화된 이벤트가 있을 경우 epoll instance의 rdllist에 연결
	struct list_head rdllink;
	struct epitem *next;
	struct epoll_filefd ffd;
	// epitem이 등록한 모든 wait queue 엔트리 리스트
	struct eppoll_entry *pwqlist;
	struct eventpoll *ep;
	struct hlist_node fllink;
	struct wakeup_source __rcu *ws;
	struct epoll_event event;
};

epoll_wait

epoll_create로 epoll 인스턴스를 생성하고 epoll_ctl로 감시 대상 FD 등록을 마쳤다면, 마지막으로 이벤트가 발생할 때까지 대기하는 epoll_wait syscall을 호출한다.

SYSCALL_DEFINE4(epoll_wait, int, epfd, struct epoll_event __user *, events,
		int, maxevents, int, timeout)
{
	return do_epoll_wait(epfd, events, maxevents,
			     ep_timeout_to_timespec(&to, timeout));
}

static int do_epoll_wait(int epfd, struct epoll_event __user *events,
			 int maxevents, struct timespec64 *to)
{
	struct eventpoll *ep;
	ep = fd_file(f)->private_data;
	return ep_poll(ep, events, maxevents, to);
}

핵심 함수인 ep_poll은 분량이 상당하므로 중요한 부분을 단계별로 나누어 설명한다.

/* fs/eventpoll.c */
static int ep_poll(struct eventpoll *ep, struct epoll_event __user *events,
		   int maxevents, struct timespec64 *timeout)
{
	int res, eavail, timed_out = 0;
	u64 slack = 0;
	wait_queue_entry_t wait;
	ktime_t expires, *to = NULL;
[...]
	eavail = ep_events_available(ep);

루프에 진입하기 전, ep_events_available 함수로 감시 대상에 이미 발생한 이벤트가 있는지 먼저 확인한다.

static inline int ep_events_available(struct eventpoll *ep)
{
	return !list_empty_careful(&ep->rdllist) ||
		READ_ONCE(ep->ovflist) != EP_UNACTIVE_PTR;
}

rdllist가 비어 있지 않은지, 또는 ovflist에 처리할 항목이 남아 있는지 확인한다.

while (1) {
	if (eavail) {
		res = ep_send_events(ep, events, maxevents);
		if (res)
			return res;
	}

	if (timed_out)
		return 0;
[...]
	__set_current_state(TASK_INTERRUPTIBLE);

	eavail = ep_events_available(ep);
	if (!eavail)
		__add_wait_queue_exclusive(&ep->wq, &wait);

	write_unlock_irq(&ep->lock);

	if (!eavail)
		timed_out = !schedule_hrtimeout_range(to, slack,
								HRTIMER_MODE_ABS);
	__set_current_state(TASK_RUNNING);

	eavail = 1;

	if (!list_empty_careful(&wait.entry)) {
		write_lock_irq(&ep->lock);

		if (timed_out)
			eavail = list_empty(&wait.entry);
		__remove_wait_queue(&ep->wq, &wait);
		write_unlock_irq(&ep->lock);
	}
}
}

이벤트가 존재하면 ep_send_events를 호출하여 사용자가 전달한 events 버퍼에 최대 maxevents개만큼 복사한 뒤 반환한다. 이벤트가 없으면 루프를 계속 진행한다.

루프가 반복되는 경우, 현재 프로세스의 wait 엔트리를 하나 생성하고 프로세스 상태를 TASK_INTERRUPTIBLE로 전환한다. 블로킹 진입 직전에 마지막으로 이벤트 여부를 한 번 더 확인하고, 여전히 없으면 epoll 인스턴스의 wait queue에 해당 프로세스의 wait 엔트리를 추가한다. 이후 schedule_hrtimeout_range를 호출하여 지정된 타임아웃 동안 블로킹 상태에 진입한다.

타임아웃이 만료되거나 외부에서 강제로 깨워지면, 프로세스는 epoll 인스턴스의 wait queue에서 자신의 엔트리를 제거하고 상태를 TASK_RUNNING으로 복원한 뒤 루프 처음으로 돌아간다. 이하에서는 타임아웃이 아닌, 외부 이벤트에 의해 깨어나는 경로를 따라가 본다.

TCP 소켓에 데이터가 수신되면 sock_def_readable 함수가 호출된다.

void sock_def_readable(struct sock *sk)
{
	struct socket_wq *wq;

	trace_sk_data_ready(sk);

	rcu_read_lock();
	wq = rcu_dereference(sk->sk_wq);
	if (skwq_has_sleeper(wq))
		wake_up_interruptible_sync_poll(&wq->wait, EPOLLIN | EPOLLPRI |
						EPOLLRDNORM | EPOLLRDBAND);
	sk_wake_async_rcu(sk, SOCK_WAKE_WAITD, POLL_IN);
	rcu_read_unlock();
}

sock_def_readable은 해당 소켓의 wait queue를 가져온 뒤 wake_up_interruptible_sync_poll을 호출한다. 이때 어떤 이벤트가 발생했는지(EPOLLIN 등)를 인자로 함께 전달한다. 해당 함수는 내부적으로 __wake_up_common을 호출한다.

static int __wake_up_common(struct wait_queue_head *wq_head, unsigned int mode,
			int nr_exclusive, int wake_flags, void *key,
			wait_queue_entry_t *bookmark)
{
	wait_queue_entry_t *curr, *next;
	int cnt = 0;

[...]
	list_for_each_entry_safe_from(curr, next, &wq_head->head, entry) {
		unsigned flags = curr->flags;
		int ret;
[...]
		ret = curr->func(curr, mode, wake_flags, key);
		if (ret < 0)
			break;
		if (ret && (flags & WQ_FLAG_EXCLUSIVE) && !--nr_exclusive)
			break;
[...]
	}

	return nr_exclusive;
}

__wake_up_common은 소켓의 wait queue에 연결된 엔트리를 순회하며 각 엔트리의 curr->func을 호출한다. 앞서 epoll_ctl에서 등록한 ep_poll_callback이 바로 이 함수다. WQ_FLAG_EXCLUSIVE 플래그가 설정된 엔트리를 처리한 이후에는 순회를 중단한다. 이 플래그는 EPOLLEXCLUSIVE 이벤트와 함께 활성화되며, 동일 소켓의 wait queue에 여러 프로세스가 대기 중일 때 그중 하나만 깨우는 효과를 낸다.

static int ep_poll_callback(wait_queue_entry_t *wait, unsigned mode, int sync, void *key)
{
	int pwake = 0;
	struct epitem *epi = ep_item_from_wait(wait);
	struct eventpoll *ep = epi->ep;
	__poll_t pollflags = key_to_poll(key);
	unsigned long flags;
	int ewake = 0;
[...]
	if (READ_ONCE(ep->ovflist) != EP_UNACTIVE_PTR) {
		if (chain_epi_lockless(epi))
			ep_pm_stay_awake_rcu(epi);
	} else if (!ep_is_linked(epi)) {
		/* In the usual case, add event to ready list. */
		if (list_add_tail_lockless(&epi->rdllink, &ep->rdllist))
			ep_pm_stay_awake_rcu(epi);
	}

[...]
	if (waitqueue_active(&ep->wq)) {
		if ((epi->event.events & EPOLLEXCLUSIVE) &&
					!(pollflags & POLLFREE)) {
			switch (pollflags & EPOLLINOUT_BITS) {
			case EPOLLIN:
				if (epi->event.events & EPOLLIN)
					ewake = 1;
				break;
			case EPOLLOUT:
				if (epi->event.events & EPOLLOUT)
					ewake = 1;
				break;
			case 0:
				ewake = 1;
				break;
			}
		}
		wake_up(&ep->wq);
	}
[...]
	return ewake;
}

ep_poll_callback은 먼저 list_add_tail_lockless를 호출하여 이벤트가 발생한 struct epitemep->rdllist에 추가한다. 그런 다음 epoll 인스턴스의 wait queue에 대기 중인 프로세스가 있는지 확인하고, 있으면 wake_up을 호출하여 해당 프로세스를 깨운다.

static int ep_send_events(struct eventpoll *ep,
			  struct epoll_event __user *events, int maxevents)
{
	struct epitem *epi, *tmp;
	LIST_HEAD(txlist);
	poll_table pt;
	int res = 0;
[...]
	ep_start_scan(ep, &txlist);

	list_for_each_entry_safe(epi, tmp, &txlist, rdllink) {
		struct wakeup_source *ws;
		__poll_t revents;

		if (res >= maxevents)
			break;
[...]
		list_del_init(&epi->rdllink);
[...]
		revents = ep_item_poll(epi, &pt, 1);
		if (!revents)
			continue;

		events = epoll_put_uevent(revents, epi->event.data, events);
		if (!events) {
			list_add(&epi->rdllink, &txlist);
			ep_pm_stay_awake(epi);
			if (!res)
				res = -EFAULT;
			break;
		}

		res++;
[...]
		else if (!(epi->event.events & EPOLLET)) {
			list_add_tail(&epi->rdllink, &ep->rdllist);
			ep_pm_stay_awake(epi);
		}
	}
	ep_done_scan(ep, &txlist);
	mutex_unlock(&ep->mtx);

	return res;
}

프로세스가 깨어나면 ep_send_events가 호출된다. 먼저 ep_start_scan으로 스캔을 시작하고, ep->rdllist를 기반으로 각 epitem의 이벤트를 확인한 뒤 epoll_put_uevent를 통해 사용자 공간 메모리에 복사한다. 단, ep_start_scanep_done_scan 사이에 새로 발생한 이벤트는 rdllist에 직접 추가되지 않고 ovflist에 임시 연결된다는 점이 중요하다. 이는 스캔 도중 리스트가 변경되어 발생할 수 있는 race condition을 방지하기 위한 설계이다.

전체 흐름을 아래 다이어그램으로 정리한다.

결론

epoll을 언제 써야 하는지에 대한 정보는 어렵지 않게 찾을 수 있다. 그러나 내부에서 어떤 일이 벌어지는지, 커널이 어떤 구조로 이 모든 것을 조율하는지에 대한 설명은 찾기 어려운 것이 현실이다. 이번 글이 epoll_create부터 ep_poll_callback 호출에 이르는 일련의 흐름을 이해하는 데 실질적인 도움이 되었기를 바란다. 소켓의 wait queue에 콜백을 등록하고, 이벤트 발생 시 커널이 직접 프로세스를 깨우는 이 구조를 이해하고 나면, epoll이 왜 대규모 연결 환경에서 효율적으로 동작하는지 그 이유도 자연스럽게 납득될 것이다.

N년째 다이어리에 일정 외 일기를 적어오고 있다. 꽉 채운 종이는 아니더라도 종이에 서걱거리는 펜의 질감이 좋아, 매년 새해를 잘 시작해보자는 의식처럼 다이어리를 구매한다. 그동안 대형 소품샵부터 온라인 편집샵까지 다양한 제품을 유랑했지만, 최근 나의 정착지가 된 곳이 있어 소개하고자 한다.

SHOP INFO

파피어프로스트 (papierprost)

📍 서울 종로구 자하문로7길 68-4 1층
👣 경복궁역 2번 출구에서 도보 약 10분
📸 @papierprost

서촌의 문구 편집샵을 이야기할 때 빠지지 않는 곳이 있다. 바로 파피어프로스트다. 아날로그 감성을 기반으로 한 문구 브랜드 ‘아날로그키퍼(@analogue_keeper)’가 운영하는 오프라인 공간으로, 인스타그램 피드(@papierprost)만 훑어봐도 다이어리를 중심으로 한 문구 소품들이 얼마나 단정하게 큐레이션되어 있는지 고스란히 전해진다.

경복궁역을 나와 서촌의 정취를 느끼며 걷다 보면 세종문화회관 미술관이 나온다. 이곳에서 전시를 관람한 뒤 유유자적 걸어서 파피어프로스트로 향하는 코스는 꽤 근사한 주말 루틴이 된다. 우측 사진 속, 붉은 벽돌 건물 1층에 자리한 아담한 공간이 바로 그곳이다. 문을 열고 들어서면 작지만, 취향이 가득 찬 문구의 세계가 펼쳐진다.

이곳의 다이어리는 전반적으로 군더더기 없는 디자인이 특징이다. 매장 한 켠에는 실제 사용자들의 활용 예시가 함께 전시돼 있는데, 형광펜으로 일정을 강조하거나 스티커로 운동·식단 등의 루틴을 시각화한 모습이 인상적이다. 다양한 사용법을 자연스럽게 접하다 보면 ‘나도 이렇게 기록해보고 싶다’는 생각이 들게 된다. 다이어리 겉면을 투명 PVC 커버로 감싸 자유롭게 꾸밀 수 있다는 점 역시 매력적이다.

출처: 파피어프로스트

하지만 이곳의 진정한 매력은 다이어리 외의 소품들에 있다. 종이의 질감과 무게가 각기 다른 노트들, 빈티지한 감성의 연필과 유니크한 디자인의 펜, 곳곳에 붙여진 감각적인 포스터와 엽서들은 단순히 문구를 파는 공간이 아니라 ‘기록하는 삶’ 자체를 제안하는 듯하다. 작은 황동 클립 하나, 독특한 패턴의 마스킹 테이프 하나에도 주인의 안목이 느껴져 구경하는 재미가 쏠쏠하다.

내가 구매한 아이템은?

My Shopping List

한참의 고민 끝에 파피어프로스트에서 업어온 2026년 다이어리와 소품들이다. 메인 다이어리와 함께 업무용, 루틴 체크용으로 세분화하여 사용할 생각으로 펜 몇 자루를 같이 구매했다. 그리고 평소 귀여운 소품에 사족을 못 쓰는 편이라, 계산대 옆에서 발견한 저 ‘톰과 제리 키캡’을 도저히 외면할 수 없었다. (우측에 보이는 저 작은 톰이 바로 내 새로운 힐링 아이템이다.)

나만의 다이어리 활용법은?

How to Record

나의 다이어리 활용법은 심플하다.

일상용 자잘한 할 일(To-do list)을 기록한다.
업무용 사무실에서 필요한 아이디어나 노트를 그때그때 기재한다.
일정용 휴대폰 일정 위젯과 연동하여 한 달의 주요 약속들을 한눈에 보이게 정리한다.

특히 나는 동그라미 스티커를 애용하는데, 유일한 취미인 운동을 마친 날 메모지에 이 스티커를 붙여 ‘도장 깨기’를 할 때의 쾌감은 이루 말할 수 없다.

내가 이곳을 사랑하는 이유는 ‘구매 경험’ 때문이다. 파피어프로스트는 작은 소품 하나를 사더라도 달마다 다른 안내 문구가 담긴 작은 편지와 함께 정갈하게 포장을 해준다. 자칫 무심하게 지나칠 수 있는 작은 물건조차 귀하게 여겨지는 기분이다. 집에 돌아와 포장을 뜯는 행위 자체가 조심스럽고 설렌다. 이 정성스러운 과정은 단순히 물건을 구매한 것을 넘어, 매일을 진지하게 임하고 싶다는 마음을 갖게 한다.

마음에 드는 다이어리와 소품들 덕분에 퇴근 후에도 운동이나 독서 등 계획했던 일들을 꽤 잘 지켜내고 있다. 요즘은 ‘OTT 시청 전 책 30분 읽기’를 실천 중인데, 시작이 반이라는 말처럼 벌써 여러 권의 책을 완독했다. 하려는 활동에 작은 제약(미션)을 걸고 이를 달성했을 때 보상을 주는 방식은 기록을 지속하게 하는 재미있는 원동력이 된다.

귀여운 톰 키캡 사진으로 이번 글을 마무리하려 한다. 벌써 4월, 1분기가 지났다고 조급해할 필요는 없다. 마음에 드는 펜 한 자루, 예쁜 엽서 한 장을 사는 것부터 시작해보면 어떨까. 2026년, 우리 모두 하고 싶었던 일들을 다시 차근차근 시작해보는 거다. 2026년, 남은 날들도 화이팅!


TOP