공통 프로젝트가 끝나고 특화 프로젝트가 시작하는 단계에서, 공통 프로젝트에서 맡은 역할, 배운 점들을 정리하려고합니다.
프로젝트 개요 및 결과
서비스명 : 폰고지신
서비스 개요 : 갤럭시 휴대폰 업사이클링
프로젝트 기간 : 23.07.10 ~ 23.08.
프로젝트 인원 : 6명(백엔드 3명, 안드로이드 3명)
결과 : 프로젝트 반 2등 수상
아이디어 기획
팀원들끼리 아이디어를 많이 준비해왔고, 컨설턴트님에게도 이 조는 아이디어들이 괜찮다는 칭찬을 받았다. 컨설턴트님이 1차적으로 걸러주신 아이디어들을 바탕으로, 내부적으로 회의 끝에 휴대폰 업사이클링을 채택하게 되었습니다. 개발하고 싶은 프로젝트를 진행하는 것이 팀적으로 더 효율이 좋다고 생각했기 때문에, 아이디어 기획과 피그마 작업에 시간을 많이 투자한 것 같습니다.
개발과 맡은 역할
안드로이드 개발과 발표를 맡았습니다. Compose나 클린 아키텍처 등 사용해보고 싶은 것들은 많았지만 2주 기획 후 남은 시간동안 개발을 해야하기 때문에, 욕심을 자제했습니다. 대신 평소 개발하던 게시판 crud보다는 다른 부분을 맡아서 진행했습니다.
- 플러스
- 카메라 기능
- 리모컨 기능
- 습온도계 기능
- 유저
- 로그인 기능
- 회원가입 기능
1. 카메라 기능
기능
- 인생네컷과 같은 카메라로, 한번 클릭 시 4번 자동 촬영
- 촬영된 사진은 한장 선택 혹은 4장 모두 선택 가능
- 선택한 사진에 프레임을 씌우기
- 촬영 기기의 갤러리에 저장 기능
- QRcode로 프레임 씌워진 사진 다운로드 기능
- 촬영 버튼과 무관하게 볼륨 버튼 촬영 기능
- 카메라, 저장 권한 처리
구현 방법
1) Camera와 CameraX를 사용한 촬영 기능 구현
- 지원하는 기기의 범위가 안드로이드 api 18부터 33이었기 때문에 롤리팝 이전의 기기는 Camera Api로 롤리팝 이후의 기기는 CameraX Api로 같은 기능 구현
- Counter로 총 20초를 세고 5초마다 촬영 4번 촬영
- 시간 초 내에 리모컨 버튼을 눌러서 촬영하는 모드의 경우 4번 이상 눌렀을 때는 List에 추가하지 않고, 화면 전환
- 촬영한 사진의 경우, 촬영된 시간을 파일 이름으로 설정하여, jpg로 앱 저장소에 저장
- onDestroyView에서 cameraProvider.unbindAll와 camera.release()
2) 프레임 씌우기
- 원하는 프레임 모양의 레이아웃과 사진(1개 혹은 4개)을 화면에 띄우고, 해당 화면을 비트맵으로 만들고, 비트맵을 jpeg로 만들어서 갤러리에 저장
- 사용자가 촬영한 각도 대로 저장하기 위해서 90도 회전 후 저장
- 사용하지 않는 요소는 recycle()
느낀점
- 처음에는 한 화면에서 버전에 따라 다른 camera api를 사용하려고 했으나, 코드가 너무 복잡해지는 문제로 인해서 카메라화면으로 이동시킬 때, 휴대폰의 버전을 확인하고 적절한 화면으로 이동하도록, 같은 화면을 CameraFragment, CameraXFragment로 각각 구현한 점이 아쉽다.
- 지원하는 휴대폰의 범위가 넓어서 저장 권한 및 카메라 권한 처리하는 부분에 대해서 공부했다. 예전 휴대폰으로 갈수록 권한 처리는 간편했고, 현재 휴대폰으로 올 수록 카메라 라이브러리가 잘되어있어 구현이 간편했다.
- 예전 휴대폰의 경우, OutOfMemory 오류가 자주 발생했기 때문에, 버튼 등을 recylerView를 사용하여 만들었고 로티 애니메이션, CardView 사용도 자제했습니다.
2. 회원가입 기능
기능
- 회원가입 기능
-이메일 중복 확인 기능
구현 방법
1) 회원가입하려는 유저 정보가 충분한지 확인
- 회원가입하기 버튼을 누르면, 입력된 정보들을 SignUpInfo 객체로 만들어서 validateUser 함수에 넘기고, 적절하지 않는 정보가 있을 경우 false를 반환하고 각자 부분에서 적절하지 않는 이유들은 EmailValidation.EMPTY_EMAIL와 같은 형식으로 List에 담아서 되돌려줍니다. 각자의 정보입력창 아래로 빨간색 글씨의 설명이 추가됩니다.
- 이메일 인증을 해서 중복되지 않은 이메일이라는 값이 돌아오면 저장하고, 저장된 값과 현재 값이 다르면 다시 인증을 하도록 구현했습니다.
2) 회원가입이 되는 동안 처리
- 회원가입이 되는 동안, 다이얼로그를 띄워서 다른 버튼을 선택하지 못하도록 구현했습니다.
- 베이스 프레그먼트의 isLoading이라는 라이브데이터를 사용해서 true false를 감지해서, 회원가입이 성공 또는 실패라는 알림을 띄우고 다이얼로그를 보이지 않도록 전환했습니다.
- 1초에 한번만 버튼을 클릭할 수 있도록, setDebouncingClickListener를 만들어서 클릭 횟수를 제한했습니다.
느낀점
- LoginViewModelTest 및 SignUpViewModelTest를 만들어서 진행했습니다. 생각나는 부분들은 모두 테스트를 했지만, 오류가 날 수 있는 부분을 잘 거르고 있는 중인지 확신할 수 없어서 테스트코드가 있음에도 불안해서 한번 더 테스트하게 되었습니다. 그리고 갤러리에 저장하고, 센서 존재여부를 테스트 하는 부분이 너무 어려워서 적용하지 못한게 아쉬웠습니다.
- 미리 테스트 코드를 작성하고 그에 맞춰서 코드를 꼼꼼하게 개발한 것이 아니고, 코드를 작성한 다음에 검증 차원에서 추가한 것이 아쉬웠습니다. 다음 프로젝트에서는 미리 테스트할 경우의 수를 생각하고 그것들을 통과할 수 있도록 개발하고 싶습니다. 또한 로직 부분만을 테스트 하는 것이 아니라 UI 부분에 대해서도 테스트 코드를 추가하고 싶습니다.
- 로그인과 회원가입 코드는 서비스의 기본적인 부분이라서 게시판 CRUD와 같이 여러번 작성해봤는데, 이번에 제일 깔끔하게 작성한 것 같아서, 싸피를 진행하며 실력이 증진된 점을 체감할 수 있었습니다.
발표
이번 프로젝트가 실제로 사용자가 사용할 수 있는 것이 아니라 삼성과 연계한다는 가정하에 시작한 프로젝트인 점이 아쉬웠습니다.
기획 발표부터 중간 발표, 최종 발표까지를 맡아서 진행하며 개발시간을 많이 뺏긴 것 같아서 아쉬웠습니다. 또한 기술적인 부분에 대한 발표가 아니라 아이디어톤을 진행하는 것 같은 느낌이었습니다.
운 좋게 최종 발표까지 진행할 수 있어서 좋았습니다. 하지만, 어딘가에 자랑스럽게 코드를 소개할 수 없을 것 같습니다.
프로젝트 후기
6명이 모아서 좋은 아이디어를 생각하고, 개발을 진행하는 것이 즐거웠습니다. 그리고 주말마다 코드를 리팩토링하며 최대한 깔끔하게 유지하려고 노력했습니다. 하지만 마지막으로 갈수록 바빠서 팀원들과의 소통이 잘 되지 않았고, 각자 같은 기능의 함수를 만드는 등의 문제가 있었습니다. 또한 개발을 시작할 때, 코드 리뷰나 컨벤션등을 정하지 않아서 각자 다른 스타일로 개발하는 문제도 있었습니다. 다음 프로젝트에서는 위의 문제를 보완하기 위해서 노력해야겠다고 생각했습니다.
'SSAFYcial' 카테고리의 다른 글
신입 개발자 첫 기술 면접 회고록 (0) | 2023.09.27 |
---|---|
[7월 기획 기사] 구미 캠퍼스 학생들을 위한 앱을 소개합니다! (0) | 2023.07.24 |
[6월 기획 기사] 모바일 트랙을 진행한 결과물을 공개합니다. (0) | 2023.06.27 |
[5월 기획 기사] 남은 반년이 기대되는 이유 (0) | 2023.05.30 |
[4월 기획 기사] 모바일반 최초 취업자 인터뷰 (0) | 2023.04.27 |