홈 피트니스 트레이너(Home Fitness Trainer)

제작동기

집에서 혼자 운동하는 것이 참 어려운 일입니다. 여러가지 운동 관련 앱을 받아서 따라해 보려고 하면 너무 빨라서 할 수 없는 경우가 많았습니다. 여러가지 동작자체는 참 좋은데 제한된 시간내에 하려니 어려웠습니다. 문득 각 동작별로 소요되는 시간과 휴식시간을 내 수준에 맞게 조정해서 규칙적으로 알려주는 앱이 있으면 좋겠다는 생각이 들었습니다. 시간만 표시해 주는 것 보다는 옆에서 누가 구령을 붙여주면 더 좋을 것 같았습니다. 홈 피트니스 트레이너(Home Fitness Trainer) 라는 이름의 앱을 제작하게 되었습니다.

제작과정

먼저 해본 운동 위주로 설계를 했습니다. 몇번 동작을 하고 휴식하고 이것을 몇 세트 반복하는 것이 일반적이었습니다. 하나의 동작을 반복하는 운동은 거의 비슷한 형식이었습니다. 입력 받는 항목을 최대한 줄이고 운동별(플랭크, 암워킹…)로 분리해서 등록할 수 있도록 했습니다.

설정 화면
설정 화면

월별로 운동한 날짜를 보여주는 간단한 화면도 추가해서 동기부여가 되도록 했습니다.

선택한 월의 운동실행 상태를 보여주는 화면
선택한 월의 운동실행 상태를 보여주는 화면

이번에도 Room Persistence Library 를 이용했습니다. 그리고 Android Architecture Components 를 이용해서 MVVM 패턴을 적용했습니다. MVVM 패턴은 검색해 보시면 다양한 자료를 보실 수 있습니다. 본인에게 맞는 자료를 참조하시면 됩니다. AAC+MVVM 패턴을 적용한 예제 자료도 많이 있으니 참고하시면 됩니다.

처음에는 별도의 클래스(ViewModel, Repository)가 추가 되어 번거롭게 느껴졌습니다. 그러나 DB 연결을 통한 자료를 가져오는 부분이 깔금하게 정리되고 더 명확해 지는 장점이 있었습니다. 충분히 적용할 가치가 있다고 생각됩니다.

음성 부분은 방송일을 하셨던 지인분께 부탁을 해서 전달 받았습니다. 처음에는 단순히 숫자와 나머지 음성 부분만 자르면 되겠다고 생각했습니다. 음성이 설정한 시간에 맞게 나와야 하는데 그것이 생각처럼 쉽지는 않았습니다. 설정에 맞게 음성이 나오도록 편집을 다시 했습니다.

처음에는 진행된 시간만 나타났는데 실제 사용해 보니 한 동작을 하는데 남은 시간이 있으면 좋겠다는 생각이 들었습니다. 추가 후 사용해 보니 중간 휴식시간이 또 얼마나 남았는지 정보가 없으니 답답했습니다. 이것도 있어야 할 것 같아 추가했습니다.

실제 실행 화면
실제 실행 화면

앱은 다음 주소에서 확인하실 수 있습니다.

https://play.google.com/store/apps/details?id=jaeyoung.kim.fitnesstrainer.free

MySQL 프로시저 변수값에 따른 where 및 order by 변경

개요

MySQL 프로시저내에서 인수로 전달받은 값에 따라 where 및 order by 부분을 달리하고 싶은 경우가 있습니다. Dynamic SQL로 가능하지만 이 글에서는 case 문을 이용한 방법을 살펴보겠습니다.

where 절

프로시저의 인수로 전달받은 값에 따라 where 절의 조건을 변경하는 방법입니다. 회사ID 가 0이면 모든 회사를 보여주고 회사ID가 0 보다 크면 해당하는 자료만 보여주는 쿼리를 보겠습니다. _company_id 가 인수로 전달받은 변수입니다.

select
    *
from
    company
where
    1 = 1
    and case when _company_id > 0 then company_id = _company_id else 1 = 1 end

7행을 보면 and 뒤쪽에 case 문을 이용해서 조건을 변경한 것을 알 수 있습니다.

order by

프로시저 인수로 특정한 필드의 정렬 조건을 넘겨받는 경우가 있습니다. 토글 형태로 오름차순과 내림차순이 번갈아 가면서 order by 부분에 적용되어야 합니다. 정렬을 적용해야 하는 필드가 적으면 조건으로 나누어 처리할 수 있습니다. 하지만 필드의 개수가 많아지면 조건으로 나누어 작업하는 것이 조합이 많아지게 되어 불가능 합니다. where 절과 마찬가지로 case 문을 이용해서 order by 부분의 필드와 정렬기준을 변경할 수 있습니다.

회사이름과 직원수 필드로 정렬하는 쿼리문을 예로 들어보겠습니다. _company_name_sort_order, _employee_sort_order 가 인수로 전달받은 변수입니다.

select
    *
from
    company
where
    company_id > 0
order by
    case when lower(_company_name_sort_order) = 'a' then company_name end asc
    , case when lower(_company_name_sort_order) = 'd' then company_name end desc
    , case when lower(_employee_sort_order) = 'a' then employee end asc
    , case when lower(_employee_sort_order) = 'd' then employee end desc

8-11행을 보면 case 문으로 전달된 변수의 값으로 정렬기준을 변경한 것을 알 수 있습니다. 쿼리문이 이상하게 보이는 것 같지만 이런 방식으로 프로시저의 크기를 줄일 수 있습니다.

이상으로 MySQL 프로시저 변수값에 따른 where 및 order by 변경 방법에 대해 알아보았습니다.