Search
Duplicate

2021년 2월 1주차 회고록

번아웃과 무기력증에서 어느정도 벗어난걸 이제 몸으로 느끼고 있다. 말로만 끝났다 공부해야한다 할때랑 다르게 이제 다시 공부도 시작하고, 프로젝트도 시작하며 톱니바퀴가 돌아가는 것 같다.

1. Background Music

보사노바, 재즈등의 학습목적의 노래는 분명 학습에 도움이 많이 되지만, 이처럼 집중이 안되고 무기력할때는 오히려 나른해져 눕게 만들었다. 그래서 약간의 집중력을 포기하더라도 앉아서 흥얼거리기라도 하면서 책을 보게끔 하기 위해 적당한 플레이리스트를 찾아 듣게되었다.
아예 노래를 다 끄고 업무 및 공부를 한 적도 있지만, 그럼 고요함속에 들리는 잡음, 회의소리, 다른팀에서 일어나는 이야기들에 집중하게되면서 귀에 뭘 꽂아넣지 않고는 힘들다는걸 자각하는 시간이였다.

2. 회사

회사에서 있었던 업무, 사적인 동향에 대해 회고해보자.

2.1 주식

코로나및 부동산 정책들로 인해 갈 곳 잃은 자본금들이 주식으로 많이 흘러들어오다보니, 운좋게 돈버는 사람들이 계속 이슈가 된다. 그래서 그런지 우리 회사에서도 대부분 주식을 하고 점심시간에도 주식얘기만 많이 한다... 테슬라, 삼전, GME 등등..나도 사실 당장 월급으로 가계를 꾸리고 연봉을 아무리 열심히 올린다 하더라도 계산기를 두드리면 올라가는 집값을 건들지도 못하기에 부가 수입이나 여러 강구해야하긴 하다.
하지만, 주식은 내게 너무 위험한 창구같다.
이처럼, 냉장고가 이뻐서 투자한 아내의 수익율이 이런저런 공부를 한 사람보다 높은 수익율을 보장하기도 하고, 그러다보니 함부로 손데기가 꺼려진다.
무엇보다, 지금 주니어 개발자로 당장 하루하루 개발에 대한 학습만으로도 시작이 부족하기에 주식을 공부할 시간이 없다는게 맞는 말 같다.
하지만, 이런 개발과 연관된 부업들이 있는지는 알아봐야할 필요가 있을 것 같다.

2.2 프로젝트 기술검토: Flutter

이제 신규 프로젝트 기술검토가 마무리 단계다. 쉽지 않다.
저번주 내가 검토한 기술은 VOIP 였는데, IOS에서 spring api를 통해 voip push notification을 해서 핸드폰이 foreground, background, locked state, not running state 등 모든 상황에서 전화요청이 오도록 하는 것이였는데, native만 가지고 하는것도아니였고 flutter를 이용해서 하는 것이여서 생각보다 레퍼런스들이 없었고, 무엇보다 나는 앱이아닌 웹개발자(심지어 주니어)이기에 너무나도 힘든 상황이였고 앞으로도 힘들 것 같다. 일주일간 내가 해당 기술검토 및 구현하는데 들었던 흐름을 간략하게 정리해본다.

flutter voip 라이브러리 검색

IOS Native에서 push notification을 받고 전화알람창을 띄워주는데 필요한 api는 PushkitCallkit 이 있다. 그래서 그를 지원하는 flutter 라이브러리를 찾아보았다.
Maven이나 Gradlehttps://mvnrepository.com/ 를 이용해 라이브러리를 검색하듯이 Flutter 는 Pub.dev 를 통해 라이브러리들을 찾는데 여기서 라이브러리를 찾았다.
이는 flutter_ios_voip_kit이라는 라이브러리였는데, 사용법도 쉽고 설명도 잘 되있어서 적용을 해보았다.

라이브러리 코드 적용

찾은 라이브러리를 이제 main.dart에다가 적용해 보았다.
dart 코드에 라이브러리 적용
//라이브러리 추가 import 'package:flutter_ios_voip_kit/flutter_ios_voip_kit.dart'; ... void main() { //비동기 함수를 사용할때는 필수적으로 호출해줘야하는 함수. WidgetsFlutterBinding.ensureInitialized(); runZonedGuarded(() { FlutterIOSVoIPKit.instance.onDidUpdatePushToken = (token) { print('🎈 example: onDidUpdatePushToken token = $token'); }; runApp(MaterialApp( routes: <String, WidgetBuilder>{ //라우터 등록 }, home: //default Widget 등록 )); }, (object, stackTrace) {}); }
Dart
복사
실제 예제코드는 더 길었고 전화가 오거나 전화를 걸거나 메인화면에대한 위젯들도 모두 있었지만, 우리는 다 커스터마이징해서 따로 위젯을 등록할 예정이기에 생략했다.
Native(IOS) 설정 적용
1.
IOS 백그라운드 모드 설정및 Push Notification 추가
Runner - Signing & Capablities에서 Background Meds 설정
2.
ios/Runner/Info.plist 수정
<key>FIVKIconName</key> <string>AppIcon-VoIPKit</string> <key>FIVKLocalizedName</key> <string>VoIP-Kit</string> <key>FIVKSkipRecallScreen</key> <true/> <key>FIVKSupportVideo</key> <true/>
Java
복사
해당 내용을 추가한다.
3.
VOIP 인증서 발급
: IOS는 VOIP를 보내기위해서는 인증서를 발급해야 한다.
아래 사이트에 접속해 VOIP 인증서를 발급받으면되는데, 개발자 등록이 안된상태라면 먼저 등록해주도록 한다.
발급이 완료되었다면, 해당 인증서를 .p12로 변환해준다.
openssl pkcs12 -in voip_services.p12 -out voip_services.pem -nodes -clcerts
Bash
복사
5.
VOIP 발신 및 수신 테스트
기본적인 VOIP 수신 payload는 아래와 같다.
{ "aps": { "alert": { "uuid": Primary Key 식별자 키, "incoming_caller_id": sender 의 서비스 번호(ex: 핸드폰번호), "incoming_caller_name": sender의 서비스 네임, } } }
Bash
복사
이를 curl을 통해 테스트해볼수도 있다.
curl -v \ -d '{"aps":{"alert":{"uuid":"982cf533-7b1b-4cf6-a6e0-004aab68c503","incoming_caller_id":"0123456789","incoming_caller_name":"Tester"}}}' \ -H "apns-push-type: voip" \ -H "apns-expiration: 0" \ -H "apns-priority: 0" \ -H "apns-topic: <your app’s bundle ID>.voip" \ --http2 \ --cert ./voip_services.pem \ https://api.sandbox.push.apple.com/3/device/<VoIP device Token for your iPhone>
Bash
복사
여기서 development 목적이면 그대로 보내되 앱스토어에 등록된 상용버전일경우

문제 발생 및 해결

1.
발신 실패
처음 코드를 제대로 적용하지 않고 curl 을 통해 apns push를 했을때는 앱에서 push message를 받았을 때 후 처리가 제대로 되지 않았기 때문에 killed app이 된다며 앱이 뻗어버리는 현상이 발생했다. 그래서 코드를 수정해가며 다시 apns push를 했는데 어느 시점부터는 foreground 시점을 제외하고는 push notification이 오지 않기 시작했다. 어느 메세지도 오지 않으니 디버깅도 못하는 상태...
검색을 해보니 앱을 리스타트해봐라 flutter를 clean 후 재시작해봐라, 앱을 kill/start 해보라는 말까지 찾아 본 뒤 다 적용을 했으나 결과는 동일했다.
대충 하루를 날려서 찾은 원인은 생각보다 단순했다. 나는 앱을 kill/start 하라는게 앱을 걍 죽였다가 다시 시작하라는걸로 알았지만, 사실은 앱을 삭제 후 다시 설치하라는 것이였다.
apns push서버에서는 일정 횟수 이상 발신에 실패하면 전송을 아예 안하도록 한다는 것이 그 이유였다...
허탈하다....
2.
not running 상태에서의 미수신
: 해당 코드들을 적용하고 테스트한 결과 foreground, background, locked 의 상태에서는 모두 정상적으로 VOIP Push notification을 받았지만 앱을 아예 강제종료해버린 상태 not running 상태에서는 어떠한 메세지도 오질 않았다. 그런데 앱을 종료하면 디버깅조차 못하니 사면초가인 상황... 심지어 다 롤백하고 네이티브로 해야한다는 얘기까지들었을때는 하늘이 무너지는 기분이였다. 웹개발자가 앱을 하는 이상한 상황에 하루아침에 swift하다가 object-C를 하는데 이사님은 다 쉽다 언어 만류귀종얘기를 하고 계시니 주니어 개발자입장에서는 속이 터지는 상황이 왔다..
그래도 어쩌겠는가.. 하나씩 방법을 찾아보았다.
우선 not running 상태에서도 디버깅을 할 수 있는 방법을 찾아보기 위해 여러 키워드로 검색을 해 본결과 이런 해답을 찾았다.
답변을 보고 나는 edit the scheme에 들어가서 Wait for executable to be launched을 선택해서 프로젝트를 시작하니 성공적으로 not running 상태를 디버깅 할 수 있게 되었다.
그래서 우선 이 상태에서 push notification이 오는지를 push registry 에 브레이크 포인트를 잡고 디버깅을 해보았다.
// Handle incoming pushes - (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type { // Process the received push }
Objective-C
복사
그 결과 우선 해당 push notification은 오는 걸 확인했다.
그렇다면 코드내에서 해당 push notification을 제대로 처리해주지 못한다는 결과이기에 조금이나마 해결책을 찾을 수 있겠다는 생각을 했고, 다시 검색및 수정의 수정을 했는데, 생각보다 원인은 별게 아니였다.
나는 IOS Doc에서 제공하는 Best Practice를 거의 그대로 사용했는데, 해당 pushRegistry를 선언해놓고 안에서는 어떠한 동작도 하지 않았기에 에러가 발생하는 것이였다.
그리고, flutter_ios_voip_kit 라이브러리 에서 나와있는바에 따르면 appDelegate에서 FlutterAppDelegate를 상속해줘야했는데 그러지 못했다. 플러터를 사용하면 appDelegate에 빠져선 안되는 항목은 아래와 같다.
FlutterAppDelegate 상속하기
GeneratedPluginRegistrant.register(with: self) 로 플러터 라이브러리 로드해주기
그래서 코드를 아래와 같이 수정해줬다.
@implementation AppDelegate : FlutterAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [GeneratedPluginRegistrant registerWithRegistry:self]; return [super application:application didFinishLaunchingWithOptions:launchOptions]; }
Objective-C
복사
이로써 기본적인 VOIP를 모든 상태에서 받도록 수정이 완료되었다.

3. 플러터 공부

작년에 2일정도 인프런에서 Flutter 입문- 안드로이드, iOS 개발을 한 번에 라는 강의를 듣고 인스타 클론코딩을 하긴했었다. 하지만 개인 취미로 한 것이고 빠르게 듣고는 그 이후 따로 공부나 프로젝트를 하지 않았기에 이미 휘발되어버린 기억.. 근데 이번 프로젝트에서 본격적으로 플러터를 사용해야하는데, 너무 부족한 지식이 짜증나서 책을 사서 포스팅을 시작했다.
예상으로는 두달내로는 모든 챕터 포스팅을 끝내고싶은데, 지금 고려하고있는 것 중 하나가 nextStep의 ATDD 과정을 듣는 것이기에 만약 이 과정을 시작하면 과정 수료 이후로 일정이 밀릴 것이 뻔하기에 고민이 많은 상황이다.
금주에는 1장, 2장 두 챕터를 포스팅했는데, 기초중에 기초인 문법부터 다루는지라 포스팅을 할 지 말지 고민하다가 포스팅을 하고 있다. 하지만 생각보다 시간을 많이 소요한 것 같아서 좀 더 포인트만 다루거나 생략하고 넘어가야할 것 같다는 생각과 그냥 기초챕터를 생략할까 하는 생각도 했는데, 포스팅을 하다보니 조금씩 다트언어가 지원하는 문법들을 보거나 다른점도 보는게 있어서 고민이 깊어진다.

Flutter 포스팅 목록

플러터에 관심이 있다면 살펴보는 것을 추천한다.

4. 집

신혼집으로 들어갈 오피스텔 잔금처리 및 입주날(2월 8일)이 다가온다. 글을 쓰는시점에서는 바로 전날인데, 전세금은 겨우겨우 준비를 마치고, 이제 집안에 들일 가전제품, 가구, 기타 잡화등을 정리했다.

집 실측하기

슬슬 집에 들일 침대나 책상과 같은 가구들을 들여야하는데 집이 작다보니 크기에 예민할수밖에 없었기에 집을 실측하고, 왔다.
회사에서 반차를 쓰고 남은 대출서류(갑종근로소득에 대한 원청징수확인서)를 준비해서 제출하고 집을 실측해서 스프레드시트에 저장을 했다. 그러니 아내는 이 크기를 기준으로 3d 모델링 사이트에서 집을 모델링 해버렸다.
그래서 이렇게 모델링된 3d집에 실제 가구를 넣으면서 인테리어를 시작했고, 집안 인테리어는 아내가 하고싶은대로 한다고해서 나는 그냥 지켜만 봤다...
집 3d 모델링 해주는 사이트

필요 물품 정리

입주에 필요한 전세금, 필요한 가구, 전자제품, 기타 잡화, 욕실용품 등 모든 필요 물품들을 정리 및 적절한 제품을 찾으면 그에대한 구매사이트와 가격도 정리했다.
그러니 막연하던 견적이 구체화 되면서 좀 더 계획적인 돈관리를 할 수 있게 되었었다.

잔금 처리 및 입주일 흐름

입주일이 다가오는데 입주일 미등기 신축 오피스텔에 입주하는 내가 당일 해야하는 흐름은 다음과 같다.
1.
은행에서 대출금 입금 대기
: 대략 오전 10시정도에 입금된다고 하는데 정확한 시간을 알 수 없어 일정 관리가 힘들다.
2.
집주인에게 남은 잔금 입금
3.
집주인이 받은 돈으로 잔금을 치른 다음 잔금 완납영수증 을 받은 뒤 가져온 노트북으로 전입신고 및 전입신고된 주소로 주민등록등본 발급
4.
은행에 완납증명서주민등록등본 제출
5.
입주청소가 10:00 정도 오기로했기에 점심 이후 입주청소 결과 확인
6.
오후 2시부터 오는 가구(매트리스) 받기
7.
현재 집 상태 모두 사진촬영 및 하자보수 필요한 부분 정리하여 하자보수 신청 및 집주인에게 정보 공유.
그외에 머리도 자르고 오후에는 블로그 스터디회고도 참여해야하다보니 매우 바쁜시간이 될 것으로 보인다.