앱 개발
Cursor와 Flutter로 처음 만든 사주앱
재미있어 보여서 시작한 첫 사주앱. 처음 쓰는 Flutter는 Cursor의 도움을 받았고, 한국천문연구원 음양력 데이터를 받아 사주 계산에 활용했습니다.
처음 만든 앱은 사주앱이었다. 만들기 시작한 이유는 단순했다. 재미있어 보였다. 생년월일을 입력하면 사주에 필요한 데이터를 계산하는 앱을 만들어 보고 싶었다.
Flutter는 그때 처음 써봤다. 개발 도구는 Cursor를 썼고 AI의 도움을 많이 받았다. 웹과 앱을 함께 개발했으며 사주에 필요한 날짜 데이터는 공공데이터포털에서 받아 활용했다. 처음부터 익숙한 기술만 골라 만든 앱은 아니었다.
이번에는 그때 사용한 도구와 직접 맡은 부분을 적어보려 한다. 같은 앱을 다시 만든다면 작업을 어떻게 나눌지도 함께 정리했다.
| 항목 | 첫 사주앱에서 사용한 것 |
|---|---|
| 개발 도구 | Cursor, 개발 과정에서 AI 도움을 받음 |
| 개발 프레임워크 | Flutter, 이 앱을 만들면서 처음 사용 |
| 개발 대상 | 웹과 앱 |
| 기본 입력 | 생년월일 |
| 데이터 출처 | 공공데이터포털의 한국천문연구원 음양력 정보 |
재미있어 보이는 앱 하나에서 시작했다
처음 앱을 만들 때부터 대단한 사업 계획이 있었던 것처럼 쓰기는 어렵다. 사주앱을 고른 계기는 그냥 재미있어 보였기 때문이다. 내가 만들고 싶은 게 있었고 그걸 실제로 만들어 보기 시작했다.
사주앱이라고 하면 생년월일을 넣고 결과를 보는 모습부터 떠오른다. 사용자 입장에서는 짧은 과정이지만 만드는 입장에서 보면 할 일이 나뉜다. 날짜를 입력받아야 하고, 그 값으로 계산해야 하고, 계산한 내용을 화면에 보여줘야 한다.
첫 앱을 준비하는 사람이라면 이 정도로 설명할 수 있는 기능부터 잡아도 좋겠다. 어떤 정보를 받고 무엇을 돌려줄지 한 문장으로 적어보면 된다. 내 앱에서는 그 출발점이 생년월일이었다.
Flutter로 웹과 앱을 함께 개발했다
나는 Flutter로 웹과 앱을 함께 만들었다. Flutter가 처음이었으니 기존에 익숙하게 쓰던 프레임워크로 앱을 하나 더 만든 경우와는 달랐다. 개발하면서 AI의 도움을 많이 받은 것도 이 경험에서 빼놓을 수 없다.
Flutter는 하나의 코드베이스로 여러 플랫폼을 개발하는 방향을 지원한다. 다만 화면 크기와 입력 방식은 플랫폼마다 다르다. 공식 문서도 화면 공간에 맞춰 배치를 바꾸는 것과 각 환경에서 쓰기 편하게 만드는 것을 함께 설명한다. Flutter 반응형·적응형 설계 안내
사주앱에 대입해 보면 확인할 지점이 구체적이다. 휴대폰에서 날짜를 입력할 때 키보드가 버튼을 가리지 않는지, 넓은 웹 화면에서 결과 문장이 너무 길게 늘어지지 않는지, 화면을 줄여도 다시 입력하는 버튼을 찾을 수 있는지 보는 식이다. 같은 기능이어도 실제로 눌러보면 확인해야 할 부분이 다르다.
웹으로 실행된다는 이유만으로 소개 페이지까지 Flutter로 만들 필요는 없다. Flutter 공식 문서는 웹 지원을 앱 중심의 상호작용에 적합한 방식으로 설명하고, 검색 노출이 중요한 소개·도움말 같은 문서는 HTML로 분리하는 방안도 안내한다. 사주를 입력하고 결과를 보는 서비스와 그 서비스를 소개하는 페이지는 따로 생각할 수 있다. Flutter 웹 FAQ
AI에 부탁할 일은 입력·계산·표시로 나눠보기
Cursor를 사용하면서 AI의 도움을 많이 받았다는 건 확실하다. Flutter를 처음 쓰는 상황에서 개발을 이어가는 데 도움을 받았다. 다만 그 경험을 지금 다시 설명한다면, 도구 이름만 나열하는 것보다 작업을 어떻게 나눌지 보여주는 편이 유용하겠다.
아래는 같은 사주앱을 다시 만든다고 가정했을 때의 개발 흐름이다. 당시 코드를 그대로 옮긴 구조도는 아니다.
- 01입력생년월일을 받고
입력값 확인 - 02계산날짜 처리와
사주 데이터 계산 - 03표시계산한 결과를
읽기 쉽게 정리
우선 생년월일을 입력받는 화면을 만든다. 이 단계에서는 계산을 붙이기 전에 입력한 값이 제대로 전달되는지부터 확인한다. 입력을 바꿨는데 이전 값이 넘어가면 결과 화면을 아무리 다듬어도 엉뚱한 내용을 보여주게 된다.
그다음 계산 부분을 연결하고 마지막에 결과 표시를 붙인다. 이렇게 나누면 결과가 이상할 때 입력값이 잘못 넘어갔는지, 계산에서 틀렸는지, 화면이 예전 결과를 보여주는지 좁혀볼 수 있다.
지금 AI에 화면 작업을 요청한다면 이 정도로 범위를 정해볼 수 있겠다.
Flutter로 생년월일을 입력받는 화면을 만들어줘. 아직 사주 계산은 연결하지 말고, 버튼을 누르면 입력한 날짜를 화면에 표시해줘. 날짜를 입력하지 않았을 때의 안내도 넣어줘.
이 문장은 설명을 위한 요청 예시다. 이번에 어디까지 만들지 먼저 정하면 된다. 요청이 길어야 하는 건 아니다. 입력 화면을 확인한 다음 계산을 붙이면 한 번에 살펴봐야 할 코드도 줄어든다.
한국천문연구원 음양력 데이터를 받아 썼다
사주에 필요한 기초 데이터는 공공데이터포털의 한국천문연구원 음양력 정보에서 받아 썼다. 받은 데이터를 앱에서 처리하고 계산하는 부분은 직접 구현했다.
이 서비스에서는 음력·양력 날짜와 윤년·윤달 구분, 요일, 간지 등의 정보를 조회할 수 있다. 나는 이런 날짜 관련 기초 데이터를 앱에 활용했다. 공공데이터포털은 데이터를 제공받는 창구이고 실제 제공기관은 한국천문연구원이다.

공식 응답 항목에는 음력 월·일을 뜻하는 lunMonth·lunDay, 윤달 구분인 lunLeapmonth 등이 있다. 아래 화면은 공공데이터포털의 응답 항목 설명을 직접 캡처했다. 표의 값은 포털에 실린 샘플이며 내 앱 이용자의 생년월일이나 실제 요청 결과는 아니다.

이 문서에서 제공하는 것은 날짜와 간지 등의 기초 정보다. 사주 풀이 문장까지 받아오는 서비스로 설명하면 다르다. 앱에서 필요한 데이터를 골라 처리하고 계산 결과를 화면에 연결하는 작업은 따로 필요했다.
화면이 그럴듯하게 나오면 앱이 거의 완성된 것처럼 느끼기 쉽다. 그런데 생년월일을 다루는 앱은 입력한 날짜가 계산까지 어떻게 전달되는지 확인해야 한다. 양력인지 음력인지 같은 조건을 구분해서 받는다면 그 구분도 계산에 함께 전달되어야 한다. 화면에 표시한 날짜와 실제 계산한 날짜가 달라지지 않는지도 봐야 한다.
다시 만든다면 날짜 처리와 사주 계산을 화면 코드에서 꺼내 따로 확인하기 쉽게 두고 싶다. 버튼을 누를 때마다 화면 전체를 따라가며 결과를 찾는 것보다 입력값과 계산 결과를 한 쌍씩 비교하는 편이 잘못된 지점을 찾기 수월하다.
아래는 계산을 검증할 때 먼저 준비해볼 예시다. 실제 사주 결과값은 구현에서 채택한 기준과 신뢰할 수 있는 자료를 대조해서 정해야 한다.
| 확인할 경우 | 확인할 내용 |
|---|---|
| 같은 입력을 다시 계산 | 같은 조건에서 같은 데이터가 나오는가 |
| 월말과 연말의 날짜 | 날짜 경계를 넘는 처리에서 값이 어긋나지 않는가 |
| 양력·음력 선택을 지원하는 경우 | 선택한 구분이 계산에 그대로 전달되는가 |
| 날짜를 비우거나 잘못 입력 | 임의의 날짜로 계산하지 않고 입력 안내를 하는가 |
| 웹과 앱에 같은 값 입력 | 같은 계산 기준으로 같은 데이터가 나오는가 |
테스트의 예상값도 계산 코드와 같은 방식으로 만들어버리면 둘이 같이 틀려도 알아채기 어렵다. 먼저 별도로 확인한 입력과 예상 결과를 몇 쌍 준비하고, 코드를 수정한 뒤에도 그 결과가 유지되는지 보는 편이 낫다. AI에게 테스트 작성을 부탁하더라도 무엇이 맞는 결과인지는 따로 확인할 필요가 있다.
화면 확인과 계산 확인은 나눠서
Flutter 공식 문서는 함수나 클래스 단위를 확인하는 단위 테스트, 화면 요소를 확인하는 위젯 테스트, 앱 전체나 큰 흐름을 확인하는 통합 테스트를 구분한다. Flutter 테스트 안내
사주앱이라면 계산 함수에는 날짜와 조건을 넣어 예상 데이터와 비교하고, 입력 화면에서는 값이 전달되는지와 안내 문구가 나오는지 살펴볼 수 있다. 그다음 실제 웹과 앱에서 입력부터 결과 표시까지 이어지는 과정을 확인한다. 계산이 맞는다는 것과 사용자가 화면을 끝까지 이용할 수 있다는 것은 각각 확인할 일이다.
결과가 길어질 때도 봐야 한다. 짧은 예시 문장으로 화면을 만들어 놓으면 실제 데이터가 들어왔을 때 줄바꿈이나 스크롤 문제가 뒤늦게 드러날 수 있다. 입력을 고쳐 다시 계산했을 때 이전 결과가 남지 않는지까지 확인하면 기본 흐름을 더 분명하게 볼 수 있다.
나는 첫 앱에서 외부 데이터를 받아 사주 계산에 활용했다. 지금 다시 같은 작업을 한다면 화면을 다 만든 다음 계산을 몰아서 확인하기보다 계산 결과를 먼저 비교할 수 있는 형태로 만들어 두고 싶다.
다시 만든다면 첫 버전은 여기까지
다시 시작한다면 첫 버전의 완료 기준을 이렇게 적어둘 것 같다.
- 생년월일을 입력하고 잘못된 입력을 고칠 수 있다.
- 확인해 둔 예시에서 계산 결과가 예상값과 맞는다.
- 웹과 앱에서 입력부터 결과 확인까지 끝낼 수 있다.
- 입력을 바꾸고 다시 계산해도 이전 결과가 섞이지 않는다.
기능을 추가하고 싶은 마음이 생겨도 이 흐름부터 끝내보려 한다. 로그인이나 저장 같은 기능을 더할지는 그 뒤에 판단해도 된다. 내가 만들고 싶은 앱의 가장 기본 동작이 실제로 이어지는지 먼저 확인하고 싶다.
재미있어 보여서 시작한 사주앱에 처음 쓰는 Flutter와 Cursor가 함께했다. AI의 도움을 많이 받으며 개발했고 사주에 필요한 데이터는 외부에서 받아 활용했다. 이 조합으로 웹과 앱을 만들었던 경험이 내 첫 앱 개발의 출발점이었다.
다음에는 앱을 만든 뒤 출시를 준비하면서 겪은 일을 이어서 적어보려 한다. 개발이 끝난 다음에도 개발자 계정과 결제 프로필처럼 따로 확인할 일이 있었다.
확인한 공식 자료
마지막 출처 확인: 2026년 9월 7일