Dairy/Life Memo

스타트업 신입 iOS 6개월차 회고

첫 개발자 취업

if HyeongyuIM == iOS Developer {
	workingStart(at: 2021.02.04)
} else {
	print("현규님은 아직 요리사입니다")
}

제가 처음으로 개발자의 삶에 뛰어든 날짜입니다. 
제가 이전에 남겼던 글에 나와있지만 ㅎㅎ 외주받은 결과물로 혼자 iOS를 관리하며 Android 개발요청하는 것은 쉬운 일은 아니였습니다. 
저도 여타의 신입 구직자들과 같은 마음이였습니다. 사수가 있었으면 했고 개발문화가 있으면 좋겠다 나도 여타의 개발자들과 같은 멋진 개발생활을 하고싶다 라고. 취업이후 이런 생각들은 접어두고 할것들이 신입인 제 눈에도 너무 많이 보여 정신없이 일했던것 같습니다

아래의 정리들은 제가 6개월간 개발자 로서 저의 업무와 앞으로의 목표를 정리하는 글 입니다.

SourceCode Refactoring

 

‎레저에빠지다

‎레저에빠지다를 통해 한층 더 가까워진 레저를 체험해 보세요! 레저에빠지다는 레저와 IT를 접목하여 다양한 레저정보를 제공하고 레저인들의 중고거래 및 레저시설 이용을 돕는 종합 레저

apps.apple.com

레저에빠지다 서비스는 현재 13.2 버전을 타겟으로 개발되었고 기존에 회원/사업자가 같이 있는 형태에서 현재는 사업자로 따로 떨어져서 관리하는 앱은 2개가 되었습니다. 페이지수는 대략 두 서비스 합쳐 100페이지를 넘어갑니다

기존 외주를 통해 받은 앱은 푸시알림, 모델조차 없는 프로젝트 코드였습니다.
외주코드는 제가 상상했던것 보다... 날것의 형태였습니다. API호출 부분은 분리되어있었지만 하나의 페이지 즉 뷰컨트롤러에 모든 비즈니스 로직이 붙어있어 복잡한 페이지는 연관관계를 보는데 여러 사항을 고려해야했습니다...
또한 모델이 없어 Json Parsing을 필요한 데이터마다 일일이 타입캐스팅 하여 사용하고 있었습니다. 해서 받고 나서 초반부는 크리티컬한 버그부터 수정하고 코드에 패턴과 Reference를 관리하기 위해 거의 2주간 밤낮으로 고생했던것 같습니다. 해당 시기 제가 집중적으로 구현한것은 

  • BaseController Pattern -> MVVM Pattern
  • URL, Parameter, HTTP Method -> Route with Generic Method
  • API Model, ViewModel
  • User LoginModule(UserDefault 관리 객체)
  • Delegate -> CallBack Closure
  • GitHub Branch 분리 - Main, Stage, Develop
  • 앱 Target분리 - Release,Debug / Develop( Test )

- 기존 컨트롤러에 모두 의존된 모델생성, 비즈니스 로직, 데이터 요청을 각각 분리 하였습니다
- 데이터 요청의 레퍼런스값 String URL, Parameter를 Enum에 담아 정리하였습니다
   해당 Enum을 호출할때 Route를 만들고 Route로 API를 호출합니다
   레저에빠지다 어플은 수많은 작은 기능들 때문에 API만 120여개가 넘습니다. 각각의 호출 메서드를 최대한 간결하게 작성하기 위해        GET, POST는 같이 처리하고 멀티파트만 분리하여 처리합니다
- API Model은 파싱할 Codable모델을 만들고, 뷰모델에 넘겨주면 뷰모델에서 데이터를 가공후 컨트롤러에 넘기도록 하였습니다 
- 기존에 UserDefault를 페이지 별로 분산되어있어 관리가 어려웠는데 Key를 따로 관리하고 UserDefault를 관리하는 객체를 생성해 해당 클래스가 모든 UserDefault를 처리하도록 하였습니다 
- Delegate패턴은 흐름을 파악하기 힘들어 페이지 하나의 이동같은경우 콜백 클로저를 통해 개선하였습니다
- 기존에 하나의 메인 브랜치로만 관리되던 깃허브 브랜치를 3개로 나누어 관리하였습니다
- Configuration 분리를 통해 앱 빌드시 Test API, Release API를 나누어 테스트 버전 앱 빌드를 만들었습니다

 

리팩토링 이후의 서비스 개발 : 마켓 서비스

  • 기본적인 마켓 서비스 구현
    • 채팅
    • 푸시알림
    • 공유하기
    • 상품등록
    • 상품조회
    • Token

대표적으로 보자면 위의 기능들이 있습니다. 위의 기능들을 구현할때 가장 애를 먹었던 기능은 채팅입니다. 저희 서비스가 소켓을 통해 할필요는 없을것 같아 2초의 주기를 가지고 업데이트를 하고, 푸시알림이 오면 업데이트를 하도록 구현하였습니다. 
그리고 또 어려웠던것은 이미지를 다루는 것이 저한테는 너무 어려웠습니다. 그냥 띄워주면 알아서 해주는 건줄 알았는데 확대, 축소, 화면에 맞는 비율의 선정까지 모두 개발자가 일일이 구현해야 했습니다. 또한 사진을 올리면 그에맞는 이미지 압축도 해야하고... 아직까지 개선해야 할 것들이 많은것 같습니다

 

Swift 5.5, RxSwift, MVVM, TDD, CI/CD, Snapkit, SwiftUI

요즘 관심을 가지고 배우고 있는 학습 목표? 레저에빠지다 서비스에 적용해볼 대상들 이랄까요? 

요즘 개발을 계속하고 리팩토링을 하며 드는 생각은 새로운 기술의 도입보다는 제가 작성한 코드가 잘 쓴것인지 앱의 의존성 구조나 테스트하기는 어떤지를 생각해 보는것 같습니다. 클린코드에서 분명히 메서드는 파라미터가 하나도 없는것이 좋다! 라고해서 쭈욱 작성해높고 보니... 실질적으로 인풋이 없는 메서드는 테스트하기가 어렵다거나... Struct로 구현해도 되는데 Class를 쓴것이 많다거나... 하네요 ㅠㅠ
해서 위의 5.5와 여러 기술들을 관심을 가지고 배우고 있는데 적용하는 시기는 아직 멀은것 같습니다. 

일단 저의 목표는

1. MVVM을 완벽히 이해하고
2. RxSwift를 통해 MVVM을 좀더 간결하게 표현한뒤에
3. BDD또는 TDD를 통해 테스트 코드를 작성하고
4. CI/CD를 붙여 배포의 자동화를 만드는 것입니다. 

이외의 스냅킷, 스위프트UI는 제가 필수는 아니지만 알아두면 좋을 지식들이 되겠네요 ㅎㅎ 

현재 6개월이 넘어 7개월 8개월차에 접어들고 있습니다. 그동안 많은 이슈들이 있었고 새로운 서버개발자, 안드로이드 개발자를 채용해서 이제는 개발팀같은 느낌으로? 돌아가서 이제는 개발자가 된게 실감나기도 하구요 ㅎㅎ
시간이 지나면서 개발 안정화가 조금씩 되고... 오픈톡방에서 지식을 나누는 사람들이 때때로 알수없는 지식의 교환이 이루어지고 제가 이해하기 어려울때마다 뒤처지고 있다는 느낌이 계속 들기 시작합니다

이런 뒤처지는 느낌은 저에게 동기부여가 되는 한편 저에게 제 코드에 대한 불신감을 주었습니다. 당연한 일이지만 사수가 없으니 제가 제대로 하고있는 것인지...  주말에는 괜찮은 레포를 뒤지고 분석하고 부트캠프 졸업생의 코드를 살펴보고 배우고... 현재 나의 수준은 어디인가 깨닫게 되네요

취업을 하고, 첫 직장이지만... 인정받고 연봉이 짧은 기간 두번의 인상이 있었습니다. 저는 더 잘하고 싶고... 더욱 열심히 살아가야 겠습니다