기록
article thumbnail
728x90

개요

  • 배경
  • Notion 
    • Notion에서 사용 중인 생활 기록 페이지
    • Notion API 기본 설정
    • Notion API POSTMAN의 workplace fork 하여 사용하기
  • Notion API 호출 프로그램
    • 날짜(date) 관련 포맷 설정
    • API
    • 평일에는 다음 날, 금요일에는 주말 + 월요일 생성
  • Windows 작업 스케줄러 설정

배경

요새는 옵시디언과 블로그보다는 노션 페이지를 사용해서 습관과 메모를 기록하고 있습니다. 협업에서는 마이크로소프트의 loop를 사용을 하게 되었는데, 익숙해질 겸 개인적인 활동은 노션을 많이 사용하고 있습니다. 😂

 

노션을 사용하다보니, 생각보다 모바일 환경에서 원활하게 기록을 정리하기 꽤 편리했습니다. 점점 모바일 환경에 익숙해지다 보니 다른 노트 앱을 잘 사용하지 않게 되었네요... 무엇보다 일상생활을 시스템화하기 좋은 템플릿이다. 깨닫고 나니, 온갖 페이지를 생성해서 기록하기 바빴습니다. 

 

가볍게 책, 영화, 와인 등 취미 영역으로 시작해서 가계부, 신문, 학습, 식단표, 아이디어 노트로 용도 확장을 하면서 차레차례 구조적으로 정리를 하게 되니 자신감이 많이 붙었습니다. 그럼 이제는 전체적인 하루의 컨디션을 체킹 할 수 있는 페이지를 만들어 보자! 시작했고, 페이지는 뚝딱- 만들었습니다! 

 

페이지 기획 초기부터 꼭 만들어야겠다 결심한 기능이, 사실 기록하는 것도 컨디션에 좌지우지 된다는 것을 알기 때문에 그날 기록을 했다 플래그였습니다. 기록 여부의 플래그만큼은 자동화를 하자!라는 목표가 생겼습니다. 

 

핵심 목표가 있어서 방향성은 아주 빨리 나왔습니다. 스케줄러, 실행 프로그램, 노션 API

Notion 에서 사용 중인 생활 기록 페이지

저는 하루의 컨디션에 크게 영향을 주는 요인은 수면 시간, 정신/신체 활동, 식습관이라고 생각합니다. 이 중에서 어떤 요인이 더 컨디션 상태에 크게 작용할지 궁금했졌습니다.

 

각 기록은 독립적으로 하고 있어서,  속성을 만드는 건 간단했습니다.

  • 데이터베이스 - 캘린더
  • 컨디션
  • 활력을 주는 활동
  • 수면 시간
  • 절식여부
  • 기록여부

외 에도 숨겨진 항목이 더 있습니다!

Notion API 기본 설정

Notion API를 사용하려면 API와 연동하려는 페이지, 데이터베이스와 연결이 필요합니다. 

 

https://www.notion.so/ko-kr/help/create-integrations-with-the-notion-api

 

Notion API로 통합 생성 – Notion (노션) 도움말 센터

Notion의 API를 사용하여 원하는 대로 프라이빗 API 통합을 생성할 수 있습니다. 일부 플랫폼의 경우 플랫폼을 Notion 워크스페이스에 연결하기 위해 프라이빗 API 통합 토큰이 필요할 수 있습니다. 아

www.notion.so

 

먼저 간략하게 소개를 보고, Notion API 통합 생성을 하였습니다.

https://www.notion.so/my-integrations

 

내 위키, 문서, 프로젝트를 모두 한 곳에서 만나는 커넥티드 워크스페이스 | Notion (노션)

사용하는 모든 업무 앱을 Notion 하나에 담아 팀원들과 함께하는 올인원 워크스페이스를 꾸려 보세요.

www.notion.so

 

공개, 프라이빗하게 설정하고 워크페이스를 선택하고, 이름을 설정하고 프로필 이미지 등록하고 싶으면 등록해서 생성합니다!

 

시크릿 메뉴로 가서 API 통합 스크립 정보를 확인합니다.

이후 API 를 사용할 데이터베이스나 페이지로 이동합니다. 페이지 오른쪽 상단의 점 3개의 아이콘을 클릭합니다. [연결항목]을 클릭하여 생성한 통합 API를 클릭합니다. 

저는 처음에, 연결 리스트에만 뜨면 연결되는 줄 알았는데 연결되면 아래 그림처럼 연결 항목에 추가가 됩니다.

Notion API POSTMAN의 workplace fork 하여 사용하기

API 공식 문서만 봐도 샘플이랑 잘 되어있습니다. 더 잘 되어 있는 건, POSTMAN Notion 워크페이스를 포크해서 사용하는 방법입니다.

 

1. Search Postmnat 에서 Notion API를 검색합니다.

 

2. 공식 인증 파란체크 마크의 Notion API로 들어가 [Fork] 합니다.

Notion API 호출 프로그램 

1. 일정은 퇴근 10분 전 매주 평일만 프로그램 실행한다. -> 내일 일정을 생성한다.

2. 금요일은 토요일, 일요일, 월요일 3개의 페이지를 생성한다.

3. 페이지 기본 설정 값으로 생성한다.

  •     제목 : 24년 0월 0주차 0요일
  •     기록일 : 프로그램 실행일
  •     컨디션 : Nomal
  •     기록 : No

4. 오류는 log.txt 파일로 기록한다.

 

날짜(date) 관련 포맷 설정

// 연도
string GetYear(DateTime date)
{
    return date.ToString("yy년 ");
}

// 월
string GetMonth(DateTime date)
{
    return date.ToString("M월 ");
}

// 요일
string GetDay(DateTime date)
{
    return date.ToString("dddd");
}

// 주차
string GetWeekOfMonth(DateTime date)
{
    Calendar cal = CultureInfo.InvariantCulture.Calendar;
    int weekOfYear = cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);

    // 한 달 내의 주차 계산
    DateTime firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
    int firstWeekOfMonth = cal.GetWeekOfYear(firstDayOfMonth, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
    int weekOfMonth = weekOfYear - firstWeekOfMonth + 1;

    return weekOfMonth.ToString();
}

 

API

Page JSON 구조 생성

// page - JSON
var page = new
{
    parent = new
    {
        database_id = notionDatabaseId
    },
    icon = new
    {
        emoji = "✅"
    },
    properties = new
    {
        날짜 = new
        {
            title = new[]
            {
                new
                {
                    text = new
                    {
                        content = pageTitle
                    }
                }
            }
        },
        컨디션 = new {
            select = new
            {
                name = "Normal"
            }
        },
        기록일 = new
        {
            date = new {
                start = date.ToString("yyyy-MM-dd")
            }
        },
        기록 = new { 
            select = new { 
                name = "No"
            }
        }
    }
};

API 접속 설정 

string apiUrl = "https://api.notion.com/v1/pages/";
string token = "API 통합 프라이빗 시크릿";
string notionVersion = "2022-06-28";
string notionDatabaseId = "데이터베이스 ID";

데이터베이스 ID : API 연결한 데이터베이스의 링크  https://www.notion.so/데이터베이스ID?v=e379a94bc8c84b4e9a23747296e49027 이다.

오류 로그 생성

try
{
    HttpResponseMessage response = await client.PostAsync(apiUrl, content);
}
catch (HttpRequestException e)
{
    // 로그 파일 생성
    string logDirectory = "D:\\log\\NotionScheduler";
    string logFile = Path.Combine(logDirectory, "log.txt");

    if (!Directory.Exists(logDirectory))
    {
        Directory.CreateDirectory(logDirectory);
    }

    string logMessage = $"{DateTime.Now}: {e.Message}\n";
    File.AppendAllText(logFile, logMessage);
}

평일에는 다음 날, 금요일에는 주말 + 월요일 생성

DateTime today = DateTime.Today;

if (GetDay(today) == "금요일")
{
    // 토요일
    await CallNotionApiAsync(today.AddDays(1));
    
    // 일요일
    await CallNotionApiAsync(today.AddDays(2));

    // 월요일
    await CallNotionApiAsync(today.AddDays(3));
}
else
{
    // 평일 퇴근 시점에 다음 날 생성
    await CallNotionApiAsync(today.AddDays(1));
}

Windows 작업 스케줄러 설정

 

 

평일 오후 5시 50분에 실행하도록 예약하고, 만든 실행 프로그램을 시작하도록 동작을 설정하였습니다. 

 


참고자료
https://www.notion.so/ko-kr/help/create-integrations-with-the-notion-api
https://developers.notion.com/docs/getting-started
https://developers.notion.com/reference/post-page
728x90