본문 바로가기
개발일지/영양제알람 모바일 앱

-2- 영양제알람(supplementsAlarm) 모바일 앱 개발일지

by 아는게 없어 항상 몰라 2026. 9. 16.

이번 편에선 설계단계에서 생각했던 로직들과 테이블 설계에 대한 이야기를 해보자
(이해를 돕기 위해 앱의 실제 캡처 화면을 사용)

 

 


1. 기능 설계

일단 하단의 탭을 3개로 나누기로 했다
이번주, 약, 기록 이렇게 3개로 나눈다

 

 

이번주 탭에서는 현재 요일을 기준으로 일요일부터 토요일까지의 한 주가 나온다. 해당 일자를 누르면 해당 일자에 먹어야 되는 약들이 저장된 데이터를 기반으로 동적으로 그려진다. 이 약들은 내가 먹었는지 안먹었는지 체크하는 체크박스가 있다. 상단의 캘린더 버튼을 눌러 캘린더로 볼 수도 있다. 구글 계정을 연동하여 서버 데이터를 올리거나 받아올 수 있다.

 

 

 

 

 

01234
사진 5개

 

약 탭에서는 약을 등록,수정,삭제 할 수 있다. 하루 복용횟수에 따라 동적으로 표가 그려지고 알람시간을 설정할 수 있다.
복용횟수, 회차별 알람시간 등을 수정할 수 있다. 삭제도 당연 가능하다.
등록된 정보들을 바탕으로 약 탭 목록이 동적으로 그려진다.
약 이름을 입력하지 않으면 확인 버튼이 비활성화 된다.


기록 탭은 등록된 약들을 이번주탭에서 체크한것을 바탕으로 얼마나 먹었는지 체크하는 탭이다.


자잘한 것들은 제외하고 큰 기능들만 정리하면
1. 약 등록/수정/삭제
2. 날짜에 맞는 약 조회
3. 서버에 데이터 업로드, 다운로드
4. 통계

이렇게 네가지로 생각하고 테이블을 설계했다.

 

 


2. 테이블 설계


위의 기능들을 생각하면서 일단 약을 등록했을 때 저장되는 테이블, 그리고 복용횟수만큼 또 저장되는 테이블 
1:N 관계인 마스터-디테일 구조(=부모-자식 구조)로 만들기로 했다.
마스터 PILL
디테일 PILL_DETAIL
PILL의 컬럼은 등록될때마다 구분하는 고유값인 시퀀스(PK), 약 이름, 약 복용 횟수, 구글 이메일
PILL_DETAIL의 컬럼은 마스터에 있는 시퀀스(FK), 약이름,  약 복용 순서, 순서에 따른 약 복용 시간, 구글 이메일
이렇게 정말 러프하게 생각하고(필요한거 추후 추가하면 되니) 일단 개발을 시작했다.
(등록시간, 수정시간 같은 공통컬럼은 언급X)


현재 테이블 정보
PILL 
약_시퀀스(PK) (NUMBER)
약_이름 (VARCHAR2)
약_하루_복용_횟수 (NUMBER)

구글_이메일 (VARCHAR2)

PILL_DETAIL

약_시퀀스(FK) (NUMBER)

약_이름 (VARCHAR2)

약_복용_순서 (NUMBER)

약_복용_시간 (VARCHAR2)
약_복용_체크_YN  (VARCHAR2)

구글_이메일 (VARCHAR2)

 

(여기까지만 읽고 기능들을 생각하며 뭐가 문제인지 생각해 보세요. 여러가지 문제가 발생했습니다.)

 

 

 

 

..

..

..

..

..

..

 

 

 


첫번째 문제

나는 등록 즉시 DB에 저장하는 방식의 웹 개발만 해왔어서 아무생각 없이 등록할 때 PK를 시퀀스로 잡았다.
근데 개발하며 생각해보니까

1. 약 등록을 한다
2. 해당 데이터를 모바일 로컬에 데이터를 저장
3. 이 후 '서버에 올리기 버튼'을 누르면 로컬에 저장된 데이터를 DB에 저장
'응? 프론트에서 시퀀스 값을 생성해야되네?'
그렇다 그 동안은 등록하면 바로 DB로 들어가니 가능했지만 이번 개발에서는 먼저 로컬에 저장하고 이후 사용자의 의사에 따라서 DB에 넣는 구조니까 시퀀스를 사용 할 수가 없던 것이였다. 그리고 프론트에서 시퀀스 비슷하게 해서 어떻게든 서버에 저장을 했다한들 언젠간 문제가 생길 것이다. 예를들어 데이터 2개(시퀀스 값 1,2)를 저장한 후 앱을 삭제하고 다시 받아 다시 2개를 만들고 저장한다고 하면 또 시퀀스 값이 1,2일 태니 저장이 불가능하기때문

해결방법
시퀀스가 아닌 uuid로 고유값을 주기로 했다. 테이블에 있던 '약 시퀀스' 라는 컬럼을 '약 uuid' 로 컬럼이 바뀌었다.
그리고 정말정말정말 희박한 확률로 uuid가 중복되는 경우가 있을 수 있으니 저장 전에 로컬데이터를 조회해 uuid에 대한 중복 검사를 하도록 로직을 추가했다.

 

현재 테이블 정보
PILL 
약_UUID (PK) (VARCHAR2) ★컬럼 수정
약_이름 (VARCHAR2)
약_하루_복용_횟수 (NUMBER)
구글_이메일 (VARCHAR2)

PILL_DETAIL

약_UUID (FK) (VARCHAR2) ★컬럼 수정

약_이름 (VARCHAR2)

약_복용_순서 (NUMBER)
약_복용_시간 (VARCHAR2)
약_복용_체크_YN  (VARCHAR2)
구글_이메일 (VARCHAR2)

 

 

 

 

 

두번째 문제

수정을 할 때 문제가 생긴다. 어떻게 수정을 할 때 문제가 생기느냐? '복용횟수'를 수정할 때 문제가 생긴다. 복용횟수가 늘어날때는 괜찮은데 복용횟수가 줄어들때가 문제다. 
복용횟수를 5로 저장된 데이터를 3으로 줄이는 경우를 생각해보자. 2건의 데이터를 삭제하면 간단하다.
그런데 나는 '물리 삭제를 하면 심장이 아픈 병'이 있다. 이 병은 내가 개발자라는 직업으로 돈을 번 이후(=첫 취업 이후) 생긴 병이다.
'절대 DELETE문을 실행해선 안돼' (물론 경우에 따라 다르다)

해결방법

복용횟수를 줄였을 때 물리삭제가 아닌 논리삭제를 하기 위해 삭제_YN 컬럼 추가
이로써 5에서 3으로 줄이고 저장, 줄인 3에서 5로 다시 늘려서 저장할 때 바로 DELETE, INSERT가 아니라 UPDATE를 하게 바뀌었다. 

현재 테이블 정보
PILL 
약_UUID (PK) (VARCHAR2) 
약_이름 (VARCHAR2)
약_하루_복용_횟수 (NUMBER)
구글_이메일 (VARCHAR2)

PILL_DETAIL

약_UUID (FK) (VARCHAR2)

약_이름 (VARCHAR2)

약_복용_순서 (NUMBER)
약_복용_시간 (VARCHAR2)
약_복용_체크_YN  (VARCHAR2)
구글_이메일 (VARCHAR2)

삭제_YN (VARCHAR2) ★컬럼 추가

 

 


세번째 문제

이번엔 삭제를 할 때 문제가 생긴다. 복용횟수를 수정하여 디테일 테이블의 데이터가 변경되는게 아니라 약 목록에서

아예 '약 자체'를 삭제했다면? 마스터의 '약 정보 삭제'와 디테일의 '복용횟수 변경으로 인한 삭제'는 같은 삭제지만 엄연히 다른 경우였다.

해결방법

PILL 테이블에 삭제_YN 컬럼 추가, PILL_DETAIL 테이블에 사용_YN 추가하여
'약 정보 삭제에 의한 논리삭제'는 삭제_YN의 컬럼을, '약 복용 횟수 변경에 의한 논리삭제'는 사용_YN 컬럼을 사용하기로 했다.

 

현재 테이블 정보
PILL 
약_UUID (PK) (VARCHAR2) 
약_이름 (VARCHAR2)
약_하루_복용_횟수 (NUMBER)
구글_이메일 (VARCHAR2)
삭제_YN (VARCHAR2) ★컬럼 추가

PILL_DETAIL

약_UUID (FK) (VARCHAR2)

약_이름 (VARCHAR2)

약_복용_순서 (NUMBER)
약_복용_시간 (VARCHAR2)
약_복용_체크_YN  (VARCHAR2)
구글_이메일 (VARCHAR2)

삭제_YN (VARCHAR2) 

사용_YN (VARCHAR2) ★컬럼 추가

 

 

 

네번째 문제
(쓰다보니 길어져서 추후 업데이트 예정)

댓글