벌써 한 해가 끝나가네요... 올 한 해 정말 많은 것을 실천했고 대부분 결과도 좋았습니다. 저에게 있어 2023년은 좋은 사람들도 많이 만나고 내적, 외적 성장 등 24년 인생 중 가장 만족스러운 한 해입니다.
학생이라는 신분을 마치며 제 인생의 첫 번째 막이 끝나가는 것 같습니다. 그렇다면 전역 후 2019년 코딩을 시작하고 그 동안 배움을 증명하듯(군대 2년은 빼고 ㅎㅎ,,) 만들게 된 애플리케이션에 대해 소개하고 합니다.
대타 알바생 구인 구직 서비스
2022.02.02 ~ 2022.06.15 (3인) (현재 서버는 가동 중이지 않습니다.)
Skills
- Android
- Java (jdk 17)
- SpringBoot (ver. 2.7.8)
- Mysql (ver. 8)
- Firebase(Realtime Database)
담당 파트
- Pull Stack 포지션
- RESTful API 설계 및 구축
- Mysql Database ERD 설계
- Firebase Authentication
- Firebase Realtime Database
- Firebase FCM 푸쉬 알림
- 실시간 채팅 기능 개발
- 코드 리팩토링 및 품질개선
프로젝트 주요 기능
1. 아르바이트 매칭
- 위치 기반 매칭: 사용자는 현재 위치의 위도와 경도 정보를 기반으로 주변 아르바이트 게시물을 검색할 수 있습니다. 거리를 기준으로 근처 아르바이트 정보를 표시합니다.
- 우체국 API 연동: 아르바이트 게시물 작성 시, 사용자는 해당 아르바이트의 위치 정보를 우체국 API를 통해 정확하게 등록할 수 있습니다.
2. 회원 인증 및 보안
- Kakao API 로그인: 사용자는 Kakao API를 사용하여 로그인할 수 있습니다. 소셜 로그인을 통해 편리하게 가입하고 로그인할 수 있습니다.
- JWT (JSON Web Tokens) 적용: JWT를 사용하여 인증 및 보안을 강화했습니다. 사용자 인증 정보를 안전하게 관리합니다.
3. 실시간 구인-구직 연결 및 채팅
- 지원서 작성 및 채팅: 지원자는 아르바이트 게시물에 지원서를 작성하고, 사장님은 해당 지원서를 확인하고 채팅할 수 있습니다. 실시간 채팅을 통해 사용자와 사장님 간의 원활한 의사 소통이 가능합니다.
4. 푸시 알림
- Firebase Cloud Messaging (FCM) 알림: FCM을 이용하여 사용자에게 새로운 채팅 메시지나 중요한 업데이트에 대한 푸시 알림을 제공합니다.
어려움 및 극복과정
1. 실시간 채팅 읽음 상태 처리
문제상황
- 실시간 채팅기능에서 사용자의 읽음 기능을 구현하는 것은 복잡한 문제였습니다. 사용자가 채팅 화면에 들어오면 지금까지 오고 간 메시지들을 읽음 상태로 변경하고, 사용자가 채팅 화면을 나갈 때 또는 앱이 백그라운드로 가거나 종료될 때 읽음 상태를 변경해야 했습니다.
극복 과정
이 문제를 해결하기 위해 고민하던 중, 실시간 데이터베이스의 특징을 살려서 다음과 같은 로직을 고안하고 구현했습니다.
- 사용자가 채팅 화면에 들어올 때:
- 해당 채팅방의 읽음 상태 컬럼을 1로 변경합니다. 이로써 화면에 들어온 순간까지의 메시지들은 읽음 상태로 표시됩니다.
- 화면에 들어온 상태에서는(읽음 상태 값 == 1) 채팅 알림을 전송하지 않습니다.
- 사용자가 채팅 화면을 나갈 때, 앱이 백그라운드로 가거나 종료될 때(Android 생명주기 이용) :
- 읽음 상태 컬럼을 0으로 변경합니다. 이로써 사용자는 화면을 떠났으므로, 메시지를 읽고 있지 않다는 상태로 표시됩니다.
깨달은 점
- 라이브러리 활용의 중요성: 내가 사용하는 라이브러리의 특징을 파악하고 잘 활용한다면 소프트웨어의 기능을 더욱 다양하게 확장할 수 있습니다. 불필요한 추가 라이브러리를 사용하지 않고 이미 도입된 라이브러리들을 효과적으로 결합하는 능력도 중요합니다. 때로는 현재의 라이브러리가 프로젝트에 맞지 않을 때 과감하게 대체하고 새로운 솔루션을 개발하는 판단이 필요합니다.
- 안드로이드 앱의 생명주기 활용: 안드로이드 앱의 생명주기를 이해하고 활용하면 사용자 경험을 향상시킬 수 있습니다. 앱의 네이티브 특징을 파악하고, 이를 활용하여 다양한 로직을 구상할 수 있습니다. 이를 통해 최적의 알고리즘을 개발하고 사용자에게 더 나은 서비스를 제공할 수 있습니다.
- 설계의 중요성: 두 가지 측면 모두 소프트웨어 설계 단계가 매우 중요하다는 것을 깨달았습니다. 라이브러리 선택과 결합, 앱의 생명주기 활용은 모두 설계 단계에서 결정되어야 합니다. 이를 위해서는 다양한 개발 경험이 필요하며, 설계 능력을 향상시키기 위해 노력해야 합니다.
2. Swagger & FCM Token 이스케이프문 처리
문제상황
- Swagger를 사용하여 FCM 알림을 테스트하는 과정에서, Swagger 텍스트 필드가 FcmToken에 있는 이스케이프 문자 처리가 제대로 이루어지지 않았습니다. 이로 인해 알림을 전송하는 데 어려움이 발생했습니다.
극복과정
이 문제를 극복하기 위해 ObjectMapper 클래스의 “writeValueAsString()” 메소드를 활용했습니다. ObjectMapper는 JSON 데이터를 처리하는 Java 라이브러리 중 하나로, 객체를 JSON 문자열로 변환하는 데 사용됩니다.
- 먼저, FCM 알림을 전송할 때 Token을 JSON 형식으로 전달해야 합니다.
- ObjectMapper 클래스를 사용하여 Token을 JSON 형식의 문자열로 변환합니다. 이때 ObjectMapper는 이스케이프 문자 처리를 자동으로 수행합니다.
- 변환된 JSON 문자열을 FCM 알림 요청에 포함시켜 알림을 전송합니다.
깨달은 점
- 다양한 관점에서 생각: 테스트 도구인 Swagger에서만 발생하는 문제더라도, 이를 사용하는 다른 사람들은 해결하는 데 많은 시간이 소비됩니다. 개발자는 자신이 개발하는 API에 대해 다양한 관점에서 생각하고 예외 처리를 항상 고려해야 합니다.
- 외부 도구와의 호환성: 외부 도구나 라이브러리를 사용할 때는 해당 도구나 라이브러리가 어떤 데이터 형식을 요구하며, 어떤 처리를 자동으로 수행하는지를 이해해야 합니다. ObjectMapper와 같은 라이브러리를 적절히 활용하여 호환성 문제를 해결할 수 있습니다.
- 문제 해결 능력 강화: 이러한 경험을 통해 문제 해결 능력이 강화되었습니다. 문제 발생 시 빠르게 원인을 찾고, 적절한 도구나 방법을 활용하여 해결책을 찾을 수 있게 되었습니다.
회고
이건 2023년 05월 당시의 저를 빙의해서 썼습니다. 지금은 15배는 더 성장한 개발자가 되었지요!! 더욱 갓 생을 살았으니까!!
성장의 길은 기울어진 곡선 형태가 아니라 가파른 계단 형태이니까.
프로젝트가 나에게 준 기적같은 선물
지금까지는 개발 자체의 열정이 적은 사람들과 프로젝트를 하게 되어 많이 답답하고 아쉬운 적이 많았다. 하지만 이번엔 달랐다. 배움을 줄 수 있는 팀원과 함께한다는 건 ........ 이게 바로 개발의 묘미 .... 끊을 수 없는 맛을 느껴버렸다. 잘 몰랐던 Spring Security를 적용한 팀원의 코드를 보고 배우거나 로직을 설명하며 혼자 하지 못했던 걸 이해하는 등 정말 꿈에 그리던 내 가치를 증명하고 노력할 수 있는 공간이 생겼다. 성장하는데 최적의 조건이 나를 둘러싸니 나는 물 만난 고기처럼 성장했다.
처음으로 내가 하는 일이 코딩이라는 일이! 기존과 비교 불가능으로 너무나 재밌고 설레었다. 또한 내가 잘 짠 코드를 합칠 때 뿌듯함이란 마치 축구에서 골을 넣은 공격수가 세리머니를 하는 듯한 느낌이었다.
자기 전, 일어나서, 이동 중에 기술 스택 영상이나 블로그를 보는데 일처럼 느껴지지 않고 지적 호기심으로 둘러싸인 온 세상이 코딩이었다. 근데 정말 기이하게도 이런 삶이 행복하고 살아있음을 느꼈다. 이때부터 주변 사람들이 워커홀릭처럼 보인다고 했다 그렇지만 내가 너무 행복하다!! 멈출 수 없숴 !
이 직업의 확신을 가진게 너무나 큰 선물이지 않을까 싶다.
"배워야 하는 기술은 필요할 때 학습하며 적용한다"
이 말의 뜻을 이해한 것도 프로젝트로 얻은 큰 성과인 것 같다. 처음엔 채팅 부분에 대한 기술 스택 선정이 없었다. 하지만 검색하면서 firebase를 알게 되었고 이를 응용하며 NoSQL을 사용하고, 알림을 위해 FCM을 배우며 알림 권한 등에 대한 지식도 공부하게 되었다.
이처럼 꼬리의 꼬리를 물고 점점 깊은 이해가 필요한 부분은 공식 문서를 보는 등 개발자로서의 시야와 능력은 여러 프로젝트를 진행한 경험과 비례한다는 사실을 깨달았다. ( 물론 주도적 참여를 했을 때.. )
이건 미흡했다!
1. 서버에 배포하기는 했지만 CI/CD 배포 파이프라인 적용은 하지 못한 게 아쉽다. 다음 프로젝트 때에는 꼭 CI/CD 파이프라인을 구축하여 애플리케이션의 개발, 테스트, 빌드, 배포 과정을 자동화하여 효율적이고 안정적인 개발 및 배포를 구축해 보고 싶다.
2. 디자인이 미흡하다. 패션의 완성은 얼굴이라는 말이 있지 않은가? 앱의 완성은 디자인이다.
3. 처음엔 없던 기술들이 추가됨에 따라 많은 리팩토링이 필요했고 클린코드 원칙을 준수하지 못하는 등 설계를 완벽히 하더라도 추가되는 부분은 당연히 있다고 생각한다. 이것을 유연하게 대처하고 확장성을 고려한 설계의 중요성을 뼈져리게 깨달았다.
'Android' 카테고리의 다른 글
[Android] AOS - SMS Retriever API 해쉬코드 (0) | 2024.06.12 |
---|