SSAFYcial

싸피 9기 2학기 공통 프로젝트 후기 - 우수상

five2week 2023. 8. 28. 15:52

공통 프로젝트가 끝나고 특화 프로젝트가 시작하는 단계에서, 공통 프로젝트에서 맡은 역할, 배운 점들을 정리하려고합니다. 

 

프로젝트 개요 및 결과

서비스명 : 폰고지신

서비스 개요 : 갤럭시 휴대폰 업사이클링

프로젝트 기간 : 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명이 모아서 좋은 아이디어를 생각하고, 개발을 진행하는 것이 즐거웠습니다. 그리고 주말마다 코드를 리팩토링하며 최대한 깔끔하게 유지하려고 노력했습니다. 하지만 마지막으로 갈수록 바빠서 팀원들과의 소통이 잘 되지 않았고, 각자 같은 기능의 함수를 만드는 등의 문제가 있었습니다. 또한 개발을 시작할 때, 코드 리뷰나 컨벤션등을 정하지 않아서 각자 다른 스타일로 개발하는 문제도 있었습니다. 다음 프로젝트에서는 위의 문제를 보완하기 위해서 노력해야겠다고 생각했습니다.