newmin
개발 이것저것
newmin
전체 방문자
오늘
어제
  • 전체 보기
    • Language
      • C
      • Java
    • Algorithm
      • Problem Solving
    • Dev
      • 개발일기장
      • Android
      • Spring
      • 회고록
    • Github
    • IDE
      • eclipse
      • visual studio 2019
    • 대외활동
      • 사피엔스4.0 대학생 서포터즈
      • 코드클럽 SW교육기부단
      • 한국대학생IT경영학회 KUSITMS

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바
  • 백준
  • 프로그래밍
  • 대학생 교육기부
  • 코드클럽
  • c언어
  • 이클립스에러
  • 백준C언어
  • 중현초등학교
  • 깃허브
  • 사피엔스4.0
  • 대학생 서포터즈
  • 이클립스
  • KB디지털멘토링
  • 큐시즘
  • 코딩
  • 코드클럽 SW교육기부단
  • 사피엔스4.0 서포터즈
  • eclipse
  • code club
  • SW교육기부단
  • 개발자
  • C언어알고리즘
  • 안드로이드
  • 코린이
  • SW교육기부
  • BOJ
  • 대학생 대외활동
  • C언어기초
  • 알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
newmin

개발 이것저것

[Android / JAVA] 1인 앱 개발 후기 #2 구현 (Calendar, ListView, SQLite)
Dev/회고록

[Android / JAVA] 1인 앱 개발 후기 #2 구현 (Calendar, ListView, SQLite)

2022. 1. 24. 18:10

안녕하세요! 정민유아입니다.

 

2021년 2학기 교내에서 안드로이드 개인 프로젝트를 진행했습니다. 안드로이드 초짜내기가 개인으로 앱을 개발하려 한다니 당연히 어려움도 많았고, 부족함 투성이였습니다. 

부족함을 보완하고 더 나아가기 위해 제가 어떤 과정으로 앱을 개발하였는지를 기록해보고자 합니다.

저와 같은 코린이분들이 많은 도움을 얻고 가시기를 바라며 시작하겠습니다.


드디어 돌아온 안드로이드 1인 앱 개발 후기 두 번째 [구현편] 입니다. 생각보다 [기획편]을 서치해서 들어오시는 분들이 많으셔서 [구현편]을 또 다시 들고 왔습니다.

 

안드로이드 1인 앱 개발 후기 첫 번째 [기획편]이 궁금하신 분들은 여기로 가시면 됩니다.

 

기획편에 언급했다 싶이

  • 공중 화장실 데이터 OpenAPI
  • 구글 지도 API
  • 네이버 블로그 검색 API
  • material calendar view 라이브러리

등을 사용해서 개발하고자 하였습니다.


오늘은 이런 기술 및 라이브러리들을 기획에 맞추어 어떻게 사용하였고, 구현해내었는지를 중심으로 기록해보고자 합니다.

 

전체 소스코드는 제 깃허브에서 확인 가능합니다.


기획한대로 구현한다는 것

[기획편]의 화면 스케치를 보면 알듯 저는 정말 화려한 인터랙션을 원한 것도 아니었고, 딱 기본만 하자는 느낌이 강했습니다. 그런데 막상 디자인 구현부터 막히니 정말 앞길이 캄캄했습니다. 심플한 디자인 하나 하는데도 이렇게 오래 걸리니 새삼 앱/웹 디자이너분들이 존경스러워지는 순간이었습니다. 그래도 일단 해야하니 뚝딱거리며 디자인을 시작했습니다.

 

저는 API 사용 같은 기능적인 부분에 초점을 맞추다보니 사실 디자인에 큰 욕심을 내기가 어려웠습니다. 양심상 제출 기간도 얼마 안 남았는데 기능은 안 돌아가고 겉만 휘황찬란하게 꾸밀 수는 없었습니다. 그래서 스케치 해놓은 것과 정말 유사하게 디자인하는데 심혈을 기울였습니다.

 

혹시 본인의 앱을 더 멋있게 꾸미고 싶다면 다양한 오픈소스 라이브러리를 참고하면 좋을 듯 합니다. 아무래도 개인이 프로젝트를 진행하려하면 디자인을 같이 병행하기가 힘들겁니다. 제가 그랬듯이

차라리 기능적인 부분은 에러가 발생해서 이유라도 알고 고치기라도 하지, 디자인은 타고난 감이 없으면 일단 센스가 너무 엉망이고 구현하려할 때 의도한대로 출력이 안되면 세상을 떠나고 싶은 좌절감이 들게 됩니다.

 

AndroidUIOpenSource

다양한 깃허브 UI 오픈소스가 나와있습니다. 원하는 기능도 금방 찾을 수 있고, 수 많은 UI가 존재하니 필요에 따라 고르면 좋을 것 같아서 저장해놨었습니다.

 

 그리고 나름 기획을 구체적으로 했다고 생각했는데 기능 구현을 해보니 추가되는 기능이 더 많았습니다. 그래서 예상한 것 보다 훨씬 많은 량의 Activity가 생성되었고, 기획하지 않은 Activity의 디자인과 동작 정의들을 추가로 정리해놓아야 했습니다. 중간에 다시 기획으로 돌아가는게 너무 힘빠지고 시간적으로도 매우 비효율적이었습니다. 다들 기획을 정말 탄탄하게 해놓으시길.. 오늘도 강조 또 강조합니다.


메인 화면

MainActivity의 경우에는 PoodaysActivity로 이름을 바꾸었습니다.

오늘의 날짜, 인삿말, 배변달력을 표시하는 기능을 합니다. 그리고 스케치에 나와있듯이 하단에 메뉴바를 놓았는데요. 자 여기서 제가 정말 바보같은 생각을 하고 맙니다.

 

안드로이드는 정말 많은 기능의 위젯이 존재합니다. 또 라이브러리도 무궁무진하게 많습니다. 구글링을 조금만 하면 자신이 원하는 기능은 바로 사용할 수 있도록 수 많은 개발자분들이 포스팅을 해놓았을것입니다. 그런데 저는 시간이 부족하다는 압박감에 사로 잡혀 시야가 좁아져 있었고, 하단 메뉴바를 온갖 좋은 기능을 내팽겨둔 채 버튼 위젯을 이용해 혼자 구현을 하기 시작합니다. 당연히 엉망진창이었을 수 밖에 없었지만.. 그래도 어찌어찌 구현에 성공했습니다.

 

저처럼 고생하지 마시고, 하단 메뉴바는 다른 기능을 사용 바랍니다.. 

예를 들어, https://bubblebubble.tistory.com/5 이 분의 포스팅도 좋은 것 같습니다 :)

 

그렇게 완성한 디자인은 바로 이것입니다.

XML 레이아웃 소스코드는 여기에서 볼 수 있습니다.

액티비티 소스코드는 여기에서 볼 수 있습니다.

인삿말

Calendar 객체를 사용해서 오늘 날짜를 알아오고, DB에서 오늘 날짜의 기록이 있는지를 SELECT해서 출력합니다.

배변 기록 여부와 배변 여부 등을 따져서 총 3가지의 인삿말이 출력되도록 하였습니다.

배변 달력

앱을 처음 들어가면 뜨는 화면이라서 달력을 통해 한 눈에 확인이 가능하도록 하고 싶었습니다.

그래서 Material Calendar View 라이브러리를 사용해서 달력을 구현해주었습니다.

조금만 공부해도 금방 구현이 가능했습니다. 배변기록이 있다면 dot을 찍고, 해당 날짜를 클릭하면 배변 기록 액티비티가 실행되도록 해주었습니다. 만약, 배변 기록이 없는 날짜를 선택했다면 Toast로 기록이 없다고 설정해두었습니다.


일일 배변 기록

SQLite를 사용해서 일일 배변 기록을 저장할 수 있게 해놓았는데요. 

이 부분에서 DatePickerDialog를 사용해 날짜를 고를 수 있게 하고, 다양한 선택 가능한 위젯을 넣어서 구성해주었습니다.

날짜 선택

DatePickerDialog를 사용해 구현해주었는데 저 민트색이 상당히 거슬립니다. 근데 이게 초반에 구현해놓고 다른 기능들을 살펴보느라 미처 색깔이 다르다는 것도 인지하지 못한 채 제출해버렸습니다. 기회가 된다면 DatePickerDialog 사용법과 커스텀 방법들을 포스팅해보도록 하겠습니다 ..^^

 

기록 CRUD

배변 기록은 CRUD가 가능합니다. 추가 버튼을 통해 추가하거나, 원하는 기록을 클릭하면 수정, 롱클릭 시 삭제가 가능하게끔 해두었습니다. 사실 이 내용은 저번 학기에 배운 내용이라 막힘없이 구현이 가능했습니다. 

배변 기록은 ListView를 사용해 출력했는데요. ViewHolder를 사용해 재활용성이 높아지도록 했습니다.

 

자세한 소스코드는 AddActivity, RecordActivity, UpdateActivity에서 확인이 가능합니다.

 

배변 활동 여부에 따라서 선택지를 담은 레이아웃의 Visibility 속성을 달리하여 다른 선택지가 보여지도록 코드를 작성했습니다. 

		case R.id.btnBMYes:
                isPoo = 1;
                // 배변을 했다면 관련 기록도 가능하도록
                linearLayoutPoo.setVisibility(View.VISIBLE);

                //선택한 버튼 색깔
                btnBMYes.setBackgroundColor(getResources().getColor(R.color.white_brown));
                btnBMNo.setBackgroundColor(getResources().getColor(R.color.low));
                break;
            case R.id.btnBMNo:
                isPoo = 0;
                // 배변을 안했다면 관련 기록 불가능하도록
                linearLayoutPoo.setVisibility(View.GONE);

                //선택한 버튼 색깔
                btnBMNo.setBackgroundColor(getResources().getColor(R.color.white_brown));
                btnBMYes.setBackgroundColor(getResources().getColor(R.color.low));
                break;

 


이제 구현의 절반 정도를 설명했는데요. 사실 이번 앱의 핵심인 API 설명은 시작도 못 했습니다. 근데 너무 많은 량의 글을 쓰다보니 배가 고프고 머리가 아파서 2개로 나누어서 설명을 해야할 것 같네요.

 

라이브러리나 사용 기술에 대한 자세한 설명은 따로 포스팅을 하도록 하겠습니다. 모쪼록 제 글이 도움이 되셨으면 하네요. 그렇다면 다음엔 API 사용에 대한 글로 돌아오겠습니다.

'Dev > 회고록' 카테고리의 다른 글

[회고] PooDAYS 안드로이드 앱 개인 개발 회고록  (0) 2022.07.11
[회고] MVC 웹 개발 팀 프로젝트 회고록  (0) 2022.01.30
[Android] 1인 앱 개발 후기 #1 기획  (0) 2022.01.13
    'Dev/회고록' 카테고리의 다른 글
    • [회고] PooDAYS 안드로이드 앱 개인 개발 회고록
    • [회고] MVC 웹 개발 팀 프로젝트 회고록
    • [Android] 1인 앱 개발 후기 #1 기획
    newmin
    newmin
    매일 작심삼일로 작심일년

    티스토리툴바