루딘프 앱은 Lucid Dream + Information의 줄임말로 루시드 드림(자각몽)에 관한 정보와 도구를 제공하는 앱이다.
자각몽이란 자신이 꿈을 꾸고 있다는 것을 인지하고 있는 상태에서 꿈을 꾸는 것이다.
꿈은 상상의 세계이지 않는가? 자각몽을 꾸면 꿈을 마음대로 조종하면서 나만의 세계에서 자유롭게 뛰어놀 수 있다.
본인도 자각몽에 대해 관심이 매우 많고, 자각몽에 대한 앱의 부족함을 느끼고 앱 개발을 시작하게 되었다.
루딘프 앱의 주요 기능은 크게 정보 공유, 꿈 일기장, 어시스턴트가 있다.
정보 공유는 강좌, 사전 등의 자각몽에 관련된 다양한 정보를 앱에서 사용자에게 공유하는 기능을 하고,
꿈 일기장은 이름과 패스워드를 이용해 가입하면, 작성한 일기장이 데이터베이스에 저장돼서 언제든지 불러올 수 있다.
어시스턴트는 자각몽을 도와줄 수 있는 특수한 기능이고, 팔 떨어짐 감지 알림, 스마트폰 토템화, 렘수면 알리미가 있다.
정보 공유는 간단하다! 자각몽 강좌, 사전 등의 정보를 ListView에 담아 사용자가 쉽게 읽을 수 있도록 했다. 단, 사전 기능은 추가되고 수정되는 단어가 많기 때문에 서버에서 정보를 가져오게 구현되어있다.
중요한 건 꿈 일기장이다.
꿈 일기장은 앱에서 회원가입을 하고 첫 일기장을 작성하는 시점에 diaryUser에 이름과 암호화된 패스워드 값이 입력된다.
그리고 각 user마다 특별한 userid가 부여된다. 루딘프 앱에서는 가입 시 입력받는 정보가 이름과 패스워드밖에 없기 때문에, 누군가를 특정하기 어렵다. (이름, 패스워드 둘 다 다른 유저와 겹칠 수 있는 정보이기 때문)
그래서, 가입 한 순서대로 userid를 부여받고, 이를 다른 사이트에서의 ID처럼 사용한다.
그리고, 유저가 작성한 일기장이 userid와 함께 DreamDiary에 저장된다.
보면 pwd라는 필드가 있는데, 앱 초기 때는 사용자의 패스워드를 원문 그대로 데이터베이스를 저장했기 때문에 아직까지 흔적이 남아있다. 현재는 pwd필드의 값이 다 NULL로 되어있음을 확인할 수 있다.
그리고, 앱에서 일기장을 불러올 때는 서버의 getList.jsp 에 파라미터로 writer(작성자)와 pwd(비밀번호)를 보내서 가져온다.
그리고, 작성된 일기장을 수정하거나 즐겨찾기 설정을 할 수도 있고, 사용자가 일기장을 삭제할 수도 있다.
수정은 새로운 내용을 수정할 일기장과 똑같은 id에 덮어쓰기 하는 방식으로 구현했고.
즐겨찾기는 파라미터 fav의 상태를 true / false로 바꾼 상태에서 똑같은 title과 content로 updateDiary.jsp 한다.
삭제는 간단하게, 해당 id의 일기장을 DB에서 삭제하면 된다.
이렇게 받아 온 일기장 리스트는 diaRecyclerViewAdapter을 통해 RecyclerView에 뿌려진다.
추가로, 사용자가 꿈 일기장의 비밀번호를 바꿀 수도 있다.
하지만 사용자의 비밀번호는 이미 암호화되어있기 때문에 먼저 암호화를 풀어서 일기장에 로그인해보고, 로그인에 성공한다면 비밀번호를 바꾼 뒤, 다시 그 비밀번호를 암호화하는 방식으로 구현했다.
또, 최근에 만든 기능 중 하나인 ' 자각몽 후기 게시판 ' 이 있다.
루시드 드리머분들의 커뮤니티를 활성화하기 위한 목적으로 개발을 진행했다.
먼저, Android Studio에서 프론트엔드 디자인을 했고, 유저가 서버에 게시글을 올릴 수 있도록 만들었다.
위 코드를 보면 getReviewList.jsp 가 불려지고 있는데, 이렇게 getReviewList.jsp 가 실행되면
서버에 있는 ReviewController.java가 실행된다.
여기서 getReviewList() 안에 있는 코드가 실행이 되고,
DBconn에 접속을 시도한 뒤 SELETE * FROM ReviewBoard를 통해 ReviewBoard에 insertReview.jsp를 통해 작성된 모든 게시글을 불러오게 된다.
이렇게 얻어온 게시글들은 RecyclerView를 통해 앱 리스트에 뿌려지게 된다.
얻어온 정보를 RecyclerView에 넘기는 과정에서 Adapter 개발이 많이 힘들었는데,
저번에 작성한 Adapter 코드를 참고해 작성했다.
마지막으로 네 번째 주요 기능은, 어시스턴트다.
어시스턴트는 자각몽을 꿀 수 있게 도와주는 기능이며, 팔 떨어짐 알림, 스마트폰 토템화, 렘수면 알리미 등이 있다.
먼저 팔 떨어짐 알림은 어시스턴트를 켜 놓고 핸드폰을 침대 위에 올려놓으면, 침대 위에 팔이 떨어졌을 때 '띵' 소리로 알려주는 어시스턴트다.
아마도 이해가 잘 안 될 것이다. 자각몽에서 와일드라는 기법의 핵심은 몸이 이완이 되어야 한다는 것인데.
자기 전, 침대에 누운 뒤 팔꿈치를 ㄴ자로 침대에 세워서 잠에 들면, 잠에 드는 순간 팔에 힘이 풀리면서 팔이 침대로 떨어지게 된다. 그러면 루딘프 앱의 팔 떨어짐 알림이 울리게 되고, 사용자는 '띵' 소리를 듣고 잠에서 깨게 된다. 이러면 자연스럽게 잠에 들기 전 몸의 상태는 이완기를 넘어서 과도기, 과도기를 넘어서 안정기에서 깨게 된다! 즉, 꿈으로 들어가기 직전에 깨게 된다는 것이다. 결국엔 '띵' 소리를 듣고 꿈으로 들어가기 직전에 깬 뒤, 다시 바로 잠들면 의식을 잃기도 전에 꿈 진입 과정 중 중간단계인 과도기에 도달하게 된다! 이로써 자각몽의 확률은 몇 배나 늘어나게 된다.
본인은 침대에 폰을 올려놓았을 때, 침대에 떨어지는 팔을 감지하기 위해 실험적인 연구와 많은 노력을 기울였다. 그렇게 침대에서 뒤척이는 건 감지를 하지 않으면서, 팔이 침대에 떨어졌을 때만 감지를 하는 알고리즘을 만들게 되었다.
감지 방법은 마이크와 핸드폰의 가속도 센서를 이용해 감지를 했다.
팔이 침대에 묻히는 소리와, 가속도 센서의 일정한 흔들림을 잡아서 알고리즘을 구현했다.
이렇게 알고리즘을 만들고, 정말 성공적인 감지력을 보여줬다.
하지만, 바로 문제가 생겼다.
바로 침대의 종류마다 팔이 침대에 묻혔을 때 나는 소리의 크기와, 진동 값이 달랐다.
어떤 침대는 푹신푹신하고, 어떤 침대는 탄력이 있다. 그래서, 나는 사용자 설정 말고 더 좋은 해결책을 낼 수 없었다.
그래서 Radio Button을 통해 사용자가 알맞은 값을 설정할 수 있도록 하고, 또 사용자가 설정한 값이 알맞은지 테스트할 수 있도록 어시스턴트 테스트 기능을 만들었다. 각 소스코드마다 if (!isTestRecording) 이 존재하는 이유다.
그리고 스마트폰 토템화는 아주 간단한 기능인데, 단순히 상단바에 지워지지 않는 Notification을 하나 띄워놓는 것이다.
이로써 사용자는 이 Notification을 볼 때마다 이게 꿈인지 현실인지 조금이라도 생각하게 되고. 이것이 습관이 되어간다.
마지막으로, 렘수면 알리미 기능이 있다.
렘수면 알리미 기능은, 렘수면 주기마다 알람을 울리는 기능이다.
렘수면이란, 깨어 있는 것에 가까운 얕은 수면이며 급속 안구 운동 수면이라고도 불린다.
우리가 꾸는 꿈은 렘수면 도중에 일어난다, 그러므로 자각몽도 렘수면 도중에 일어나게 된다.
그러므로, 렘수면 주기에 외부 자극 때문에 꿈에서의 내가 "어? 이게 무슨 소리지?"라는 생각을 하게 만드는 게 렘수면 알리미의 역할이다.
렘수면 알리미는 일정한 주기로 (REM 수면 주기) '띵' 소리를 반복해서 들려준다. 이를 통해 사용자는 꿈에서 외부 자극에 대한 의식을 갖게 되고. 이는 곧 자각몽 확률을 높여줄 수 있게 된다.
주요 기능이 더 추가되었다.
https://hacanna42.tistory.com/45 - 자각몽 후기 게시판
https://hacanna42.tistory.com/55 - 꿈일기 분석 서비스
https://hacanna42.tistory.com/56 - 테크닉 리스트
https://hacanna42.tistory.com/57 - HOW TO 방침
https://hacanna42.tistory.com/58 - 꿈일기 바
https://hacanna42.tistory.com/110 - 가이드(튜토리얼)
https://hacanna42.tistory.com/68 - 그림 첨부(1)
https://hacanna42.tistory.com/71 - 그림 첨부 기능(2)
사서 고생하기 | 44일차 | 앱 일기장에 그림 첨부 기능 추가하기 - 3
오늘, 반나절 동안 엄청 집중해서 루딘프 일기장 그림 첨부 기능을 모두 구현했다. 먼저, 클라이언트에서 보내는 사진을 받는 uploadPhoto.jsp를 먼저 만들었다. uploadPhoto에서는, 이미지 이름을 랜덤
hacanna42.tistory.com
사서 고생하기 | 42일차 | 앱 일기장에 그림 첨부 기능 추가하기 - 1
루딘프 일기장에 그림도 같이 올릴 수 있도록 하게 해 달라는 요청이 지금까지 꾸준히 많이 들어왔었다. 그렇지만 서버 용량이 이미지를 담을 정도로 크지 않아서 만들지 않고 있었지만 최근에
hacanna42.tistory.com
사서 고생하기 | 앱 대형 업데이트? 튜토리얼 추가
앱에서 자각몽을 도전하는 유저분들의 이탈률이 매우 높아져서, (93% 이상) 앱에 인트로와 튜토리얼을 추가했다. 구현하는데 무려 9시간 넘게... 삽질했다. ( 이번에도 타임랩스 있음 ) https://www.you
hacanna42.tistory.com
사서 고생하기 | 34일차 | 꿈일기 바 추가
루딘프 앱에 꿈일기 바를 추가했다. 꿈일기 바란 최근 30일간 쓴 일기장의 개수를 조사해서, 얼마나 꿈 일기를 꾸준히 쓰는지 프로그레스바 형태로 표시해놓은 것 이다. 현재 날짜가 12월 7일이라
hacanna42.tistory.com
사서 고생하기 | 33일차 | HOW TO 방침 추가
HOW TO 탭을 추가했다. 꿈에서 원하는 것을 실현하기 위한 행동 방침을 정리해놓은 리스트다. ( 말은 매우 어렵다.. ) 이것도 테크닉 리스트와 같이 View Object 만들고, item 만들고 리스트 만들고.... ) 이제 안..
hacanna42.tistory.com
사서 고생하기 | 32일차 | 테크닉 리스트 추가
와일드 유도 테크닉 기법들을 배울 수 있는 테크닉 리스트 탭을 추가했다. 이제 Adapter와 View Object를 만드는 것은 익숙하다. 또, DB에서 긁어온 텍스트의 엔터가 제대로 표시되지 않아서, 개행 문자를 서버단..
hacanna42.tistory.com
사서 고생하기 | 31일차 | 꿈 일기 분석 서비스 추가! (루딘프)
오늘은 꿈 일기 분석 서비스를 개발했다. 꽤나 힘들었지만, 그래도 만들어놓으니 정말 뿌듯하다 :) 먼저, 꿈 일기를 분석하고 분석한 결과를 글로 자연스럽게 풀어나가기 위해 몇 가지 정보가 필요했다. 1. 서비스..
hacanna42.tistory.com
여기에 서술하지 않은 많은 기능들과 패치노트등은 아래 링크에서 확인할 수 있다.
hacanna42.tistory.com/search/%EB%A3%A8%EB%94%98%ED%94%84
STOP wasting my life
hacanna42.tistory.com
이렇게 주요 기능의 작동 원리 설명이 모두 끝났다.
앱을 만들고 출시하기 시작한 지는 18년에서 19년으로 넘어갈 때쯤인데.
다 만들고 보니 하나의 큰 업적이 된 것 같아 좋다.
특히 유저분들의 리뷰와 앱이 성장해나가는 모습을 보면 너무 뿌듯하다.
현재(2020.09.25<수정>) 루딘프 앱은 하루에 일기장이 약 100건 정도가 작성되고 있고, 하루가 다르게 증가한다.
데이터베이스에 누적된 일기장은 약 40000개나 된다.
또, 꾸준히 일주일에 270명 정도의 새로운 유저가 생긴다.
현재는 앱의 개발보다는 서비스 안정화, Exception 처리에 중점을 두고 있다.
알 수 없는 Exception이 안드로이드에서 많이 일어나기 때문에, try {} catch로 잘 잡아주고, 사용자에게도 상황을 잘 알려줘야 이탈을 막을 수 있다.
포스팅을 마치며,
한 사람이 매일 일기장을 썼다고 가정했을 때,
이 앱은 109년 분량의 일기장을 담고 있다.
완벽한 애플리케이션이 될 때까지, 개발을 멈추지 않을 것이다.
(수정:2020.09.25)
지금은 루딘프 Android+iOS 통합 버전 리뉴얼을 위해 공부하고 있다,
Flutter, React Native 둘 다 공부하고 있는데 좀 더 루딘프에 적합하다고 판단되는쪽으로 개발을 시작할 예정이다.
'IT 관련 활동' 카테고리의 다른 글
앱 KPI 실적 (0) | 2019.08.20 |
---|---|
NYPC 대회 종료! (0) | 2019.08.20 |
2019 NYPC 토크콘서트 (0) | 2019.07.30 |
국민대학교 OSS 여름 캠프 | 마지막 날 | Lunar Lander (0) | 2019.07.29 |
국민대학교 OSS 여름캠프 3일차 (0) | 2019.07.29 |