Published on

Notion AI 활용법 개발 문서 초안 작성과 코드 리팩토링 요청하기

Authors

서론

문서 쓰는 일은 늘 “중요하지만 급하지 않은 일”로 밀리기 쉽습니다. 기능은 돌아가는데 README는 비어 있고, API 스펙은 머릿속에만 있고, 리팩토링은 “나중에”로 남죠. 그런데 팀이 커지거나 유지보수 기간이 길어질수록 문서 부재와 낮은 코드 품질은 결국 장애/온보딩 비용/버그로 되돌아옵니다.

Notion AI는 이런 구간에서 꽤 실용적인 도구입니다. “문서를 대신 써준다”기보다, 초안 생성과 구조화를 빠르게 해주고, 리팩토링 방향 제안을 통해 개발자가 판단할 재료를 제공합니다. 이 글에서는 Notion AI로 (1) 개발 문서 초안을 만들고 (2) 코드 리팩토링을 요청하는 방법을, 프롬프트 템플릿과 코드 예시 중심으로 정리합니다.

Notion AI를 개발 워크플로에 넣기 전에 알아둘 것

Notion AI가 잘하는 것

  • 문서의 **뼈대(목차/섹션/형식)**를 빠르게 만들기
  • 회의 메모/이슈 트래커의 산재한 정보를 요약해 정리하기
  • 코드의 가독성/중복/명명/구조 측면에서 개선 아이디어 제시
  • 테스트 케이스/엣지 케이스/리스크 체크리스트 생성

Notion AI가 못하는 것(주의)

  • 실행 가능한 정답 코드를 “보장”하지 않습니다.
  • 프로젝트의 실제 컨텍스트(런타임, 의존성, 데이터 스키마, 보안 요구)를 모르면 틀릴 수 있습니다.
  • 민감정보/내부 코드/키를 그대로 붙여 넣는 것은 위험합니다.

권장 원칙

  • AI는 “작성자”가 아니라 “초안 편집자 + 리뷰어”로 사용
  • 코드/로그/설정은 익명화 후 제공
  • 결과는 반드시 테스트 + 코드리뷰로 검증

개발 문서 초안 작성 실전 템플릿

Notion AI를 쓰는 핵심은 “질문을 잘 던지는 것”입니다. 특히 문서 초안은 형식을 지정할수록 결과가 좋아집니다.

1) README 초안 만들기

입력(프롬프트) 템플릿

아래 템플릿을 Notion 페이지 상단에 붙여 넣고 AI에게 작성 요청을 해보세요.

역할: 너는 시니어 소프트웨어 엔지니어이자 기술 문서 작성자다.
목표: 아래 정보를 바탕으로 GitHub README 초안을 한국어로 작성해라.
형식: Markdown, 섹션은 반드시 포함.

프로젝트 정보:
- 프로젝트명: {프로젝트명}
- 한 줄 설명: {무엇을 하는지}
- 대상 사용자: {누가 쓰는지}
- 기술 스택: {예: Node.js, NestJS, PostgreSQL, Redis, Docker}
- 실행 방법: {로컬 실행/환경변수/도커}
- 주요 기능:
  1) ...
  2) ...
- API/CLI 사용 예시가 있으면 포함
- 제약/주의사항: {예: rate limit, 권한}

반드시 포함할 섹션:
1. 개요
2. 빠른 시작
3. 설정(환경변수)
4. 사용 예시
5. 아키텍처/디렉터리 구조
6. 트러블슈팅
7. 기여 방법
8. 라이선스

추가 요구:
- 실제로 복사해 쓸 수 있도록 코드 블록을 충분히 넣어라.
- 모르는 부분은 추측하지 말고 'TODO'로 표시해라.

결과를 더 좋게 만드는 팁

  • “빠른 시작”에는 복사-붙여넣기 가능한 명령이 핵심입니다.
  • 환경변수 섹션은 .env.example 형태로 뽑아 달라고 요청하면 좋습니다.

예시로 .env.example을 생성해 달라고 추가 요청할 수 있습니다.

추가로 .env.example 파일 내용을 만들어줘.
각 변수는 설명 주석을 포함하고, 민감한 값은 placeholder로 둬.

2) API 스펙 초안 만들기(엔드포인트 표 + 예시)

Notion AI는 API 문서의 “형식화”에 강합니다. 특히 엔드포인트가 여러 개인데 정리가 안 되어 있을 때 효과가 큽니다.

입력(프롬프트) 예시

아래 요구사항을 기반으로 REST API 스펙 초안을 작성해줘.
형식은 Markdown 표 + 각 API별 Request/Response JSON 예시를 포함해줘.

도메인: 사용자 인증
기능:
- 회원가입
- 로그인(액세스/리프레시 토큰)
- 토큰 재발급
- 로그아웃

공통 규칙:
- Base URL: /api/v1
- 인증: Authorization: Bearer <accessToken>
- 에러 포맷: {"code": "...", "message": "...", "details": {...}}

추가:
- HTTP status code를 명시해줘.
- 보안 주의사항(비밀번호 저장, 토큰 저장)을 별도 섹션으로 정리해줘.

여기서 “보안 주의사항” 섹션은 문서 품질을 크게 올립니다. 비밀번호 저장 관련 내용은 해시/암호화 혼동이 잦으니, 필요하면 아래 글을 함께 참고해 팀 규칙으로 고정해두는 것도 좋습니다.

3) ADR(Architecture Decision Record) 초안 만들기

리팩토링/기술 도입을 할 때 “왜 이 결정을 했는지”가 남지 않으면, 3개월 뒤에 다시 같은 논쟁을 합니다. ADR은 그 비용을 줄여줍니다.

입력(프롬프트) 템플릿

아래 결정을 ADR 형식으로 작성해줘.
형식:
- 제목
- 상태(제안/승인/거절)
- 맥락(Context)
- 결정(Decision)
- 대안(Alternatives)
- 결과(Consequences)
- 후속 작업(Follow-ups)

결정 주제: {예: Redis 캐시 도입}
맥락:
- 현재 문제: {응답 지연, DB 부하}
- 제약: {운영 인력, 비용, 장애 허용}
대안:
- A: ...
- B: ...
결정 이유:
- ...
리스크:
- ...

Notion AI로 코드 리팩토링 요청하기

문서와 달리 코드는 “정확성”이 중요합니다. Notion AI에게 리팩토링을 요청할 때는, 목표/제약/테스트 기준을 명확히 주면 결과가 좋아집니다.

1) 리팩토링 요청 프롬프트의 기본 구조

아래 구조를 그대로 쓰면 실패 확률이 확 줄어듭니다.

역할: 너는 {언어/프레임워크} 전문가다.
목표: 아래 코드를 리팩토링하되 동작은 유지해라.
제약:
- 외부 라이브러리 추가 금지(또는 허용 목록)
- 공개 API(함수 시그니처) 변경 금지
- 성능 목표: {예: O(n) 유지}
- 스타일: {예: 함수는 30줄 이하, early return}

원하는 개선:
- 중복 제거
- 에러 처리 일관화
- 명명 개선
- 테스트하기 쉬운 구조

출력:
1) 개선된 코드
2) 변경 요약(왜 바꿨는지)
3) 잠재 버그/엣지 케이스
4) 간단한 테스트 케이스 예시

코드:
{여기에 코드}

2) 예시: Python 함수 리팩토링

리팩토링 전 코드

def process_users(users):
    result = []
    for u in users:
        if u.get('active') == True:
            name = u.get('name')
            if name is None:
                name = ''
            email = u.get('email')
            if email is None:
                email = ''
            result.append({
                'name': name.strip(),
                'email': email.strip(),
                'is_company': True if email.endswith('@company.com') else False
            })
    return result

Notion AI에 요청할 때 같이 주면 좋은 조건

  • 빈 문자열 처리 정책
  • company 도메인 판단 기준
  • 입력 데이터 스키마(키 존재 여부)

리팩토링 후 예시(개선 방향)

from typing import Iterable, Dict, List

COMPANY_DOMAIN = "@company.com"


def _normalize_str(value) -> str:
    return (value or "").strip()


def process_users(users: Iterable[Dict]) -> List[Dict]:
    result: List[Dict] = []

    for user in users:
        if not user.get("active"):
            continue

        email = _normalize_str(user.get("email"))
        result.append(
            {
                "name": _normalize_str(user.get("name")),
                "email": email,
                "is_company": email.endswith(COMPANY_DOMAIN),
            }
        )

    return result

이 정도는 단순해 보이지만, 실무에서는 이런 작은 정리가 누적되면서 버그가 줄고 리뷰가 빨라집니다. Notion AI가 제안한 코드를 그대로 쓰기보다, 정책을 명문화하고(예: normalize 규칙), 팀 스타일로 맞추는 게 핵심입니다.

3) 예시: JavaScript 비동기 처리 리팩토링(에러 처리 일관화)

리팩토링 전 코드

async function fetchProfile(userId) {
  const res = await fetch(`/api/users/${userId}`);
  if (res.status === 200) {
    return await res.json();
  } else {
    return { error: true };
  }
}

async function fetchOrders(userId) {
  const res = await fetch(`/api/orders?userId=${userId}`);
  if (!res.ok) {
    throw new Error('orders failed');
  }
  return res.json();
}

문제점은 함수마다 에러 처리 방식이 달라 호출부가 지저분해진다는 겁니다.

리팩토링 후 예시

async function requestJson(url, options) {
  const res = await fetch(url, options);
  const contentType = res.headers.get("content-type") || "";
  const isJson = contentType.includes("application/json");
  const body = isJson ? await res.json() : await res.text();

  if (!res.ok) {
    const message = isJson && body?.message ? body.message : `Request failed: ${res.status}`;
    const error = new Error(message);
    error.status = res.status;
    error.body = body;
    throw error;
  }

  return body;
}

export async function fetchProfile(userId) {
  return requestJson(`/api/users/${encodeURIComponent(userId)}`);
}

export async function fetchOrders(userId) {
  return requestJson(`/api/orders?userId=${encodeURIComponent(userId)}`);
}

Notion AI에게는 “공통 request 래퍼를 만들어 에러 포맷을 통일해줘”라고 요구하면, 이런 식의 구조화를 제안하는 경우가 많습니다.

트러블슈팅: Notion AI 결과가 애매할 때

1) 결과가 너무 일반론적이다

원인: 입력 정보가 부족하거나 제약이 없어서 무난한 답만 나옵니다.

해결: 아래 3가지를 추가하세요.

  • 코드가 실행되는 환경(런타임/버전)
  • 성능/보안/호환성 제약
  • “이 함수가 반드시 지켜야 하는 규칙”(예: 예외를 던지지 말 것)

추가 프롬프트 예시:

리팩토링 목표를 '호출부 변경 최소화'로 고정해줘.
예외 대신 Result 타입({ok, data, error})을 반환하도록 통일해줘.
그리고 시간복잡도는 O(n) 이상 늘리지 마.

2) AI가 코드를 바꿨는데 동작이 달라진다

원인: 암묵적 동작(예: None 처리, 빈 문자열, 정렬 기준, 타임존)이 문서화되지 않았기 때문입니다.

해결: “동작 정의”를 테스트로 먼저 고정하고, AI에게 테스트를 함께 만들게 하세요.

현재 동작을 보존해야 하니, 먼저 pytest 테스트 케이스를 6개 작성해줘.
그 다음 테스트를 통과하는 범위에서 리팩토링 코드를 제안해줘.

3) 보안/민감정보가 걱정된다

  • 토큰/키/내부 URL/고객 데이터는 마스킹
  • 실제 테이블/도메인 명은 일반화
  • 로그는 개인식별정보 제거

문서화가 목적이라면, 샘플 데이터로 바꾸고 형식만 전달해도 충분합니다.

Best Practice: 문서와 리팩토링을 함께 굴리는 운영 팁

1) Notion 페이지를 “단일 진실 공급원”으로 만들기

  • 기획/요구사항 → API 스펙 → 구현 체크리스트 → 릴리즈 노트가 한 공간에서 연결되면, 변경 추적이 쉬워집니다.
  • 템플릿을 만들어 반복 작업을 줄이세요.

개인 브랜딩/포트폴리오까지 Notion으로 관리한다면 아래 글도 함께 참고할 만합니다.

2) “초안 생성 → 검증 → 고정”의 3단계를 습관화

  • 초안: Notion AI로 빠르게 생성
  • 검증: 코드/테스트/실제 사용 시나리오로 확인
  • 고정: 결정 사항(정책/규칙/에러 포맷)을 ADR이나 팀 컨벤션 문서로 잠금

3) 리팩토링 요청은 작게 쪼개기

한 번에 파일 10개를 붙여 넣고 “깔끔하게 해줘”라고 하면, 결과도 검증도 어렵습니다.

  • 함수 단위
  • 모듈 단위
  • “에러 처리만”, “명명만”, “중복 제거만”처럼 목적 단일화

이렇게 쪼개면 AI 제안의 품질도 올라가고, 리뷰도 쉬워집니다.

결론

Notion AI는 개발자의 일을 대체하기보다, 문서 초안과 리팩토링 방향을 빠르게 제시해 생산성을 끌어올리는 도구에 가깝습니다. 핵심은 (1) 문서의 형식을 먼저 고정하고 (2) 리팩토링 목표/제약/검증 기준을 명확히 주며 (3) 결과를 테스트와 리뷰로 확정하는 운영 습관입니다.

오늘 바로 적용하려면, 먼저 README 템플릿과 리팩토링 프롬프트 템플릿을 Notion에 저장해두고, 다음 작업에서 “빈 페이지에서 시작하지 않기”를 목표로 해보세요.