행복한 크리스마스를 보내고 계십니까? 올해는 저도 행복한 크리스마스를 보낼 것 같습니다. 시간이 조금 남아서 다시 맥북을 들었습니다 ㅎㅎㅎ

요즘 어떤 개발자가 되고 싶은지 나아가서는 어떤 사람이 되고 싶은 건지 이런 생각들을 다시 많이 하게 됩니다. 

신입일 때는 열정과 패기로 많은 것을 배우고 많은 것을 경험해보는 그냥 잘하는 개발자가 되고 싶었습니다. 경력이 쌓이고 라이브 서비스도 하면서 개발자는 참 할일이 많다는 생각이 들었습니다. 특히 협업(기획, 운영, 디자이너, PM 등등)을 할 때 개발자는 모든 일에 관여할 수 밖에 없다는 생각이 들었습니다. 협업에 대한 관리가 잘되지 않으면 일이 끝나지 않는 느낌도 들었습니다. 때로는 내 일이 아닌것 같고 책임도 나에게 없지만 나서지 않으면 일이 원활하게 진행되지 않는다는 생각도 들었고 반대로 왜 개발자인 내가 그런 역할을 해야하나 모른척 한적도 있습니다.

이런 중요한 역할?!을 하는 개발자에게 가장 필요한건 좋은 인성이라고 생각합니다. 협업을 할 때 편한 사람은 실력이 있는 사람이기도 하지만 본인의 전문 분야가 아니고 정말 못하지만 않는다면 다른 분야의 실력을 구분하기는 쉽지 않습니다. 실제로 저는 잘한다고 생각했던 사람도 타팀 내부에서는 낮게 평가되거나 반대로 못한다고 생각했던 사람도 높게 평가되는 경험도 종종 있었습니다. 심지어 비슷한 분야에서도 별로라고 생각한 사람이 높게 평가를 받고 있기도 했습니다. 아마도 사람을 평가하는 기준이 다르기 때문일 것입니다.

인성이 중요한 또 한가지의 이유는 개발만큼 여러가지 방법을 통해서 결과물이 나오는 분야가 별로 없고 그만큼 과정에 대한 평가가 어렵고 결과물에 대해서 잘한건지 못한건지에 대한 평가도 때로는 어렵습니다. 그렇기 때문에 소위 사기꾼도 많다고 생각됩니다.

개발자로서 조심해야 하는건 '아는 것만큼 보인다'라는 말처럼 본인이 아는 것이 전부라고 믿는 분들 입니다. 정도의 차이지만 이런 경향이 강한 분들은 협업까지는 할 수 있지만 피곤함을 많이 느끼게 합니다. 본인이 잘아는 부분일 수록 그쪽으로 개발방향을 정할려고 하거나 본인이 모르는 부분에 대해서는 증명을 해주기를 바랍니다.

그래서 제가 하고 싶은 말은 그냥 개발자는 누구나 할수 있지만 진짜 개발자는 어려운 일이고 나무가 아닌 숲을 보고 본인이 부족한 부분은 끊임없는 노력으로 채워나가야 합니다. 앞의 내용을 충분히 채우고 있더라도 개발자 이전에 괜찮은 사람이 되어야 합니다.

저작자 표시 비영리 변경 금지
신고
Posted by resisa

오랜만에 글을 쓰고 있네요 ㅎㅎ 12월이 지나면 어느덧 저도 개발 10년에 접어들게 됩니다. 믿기지 않네요 ㅎㅎㅎ

최근 회사를 이직하고 이제 적응(출근적응 ㅎㅎ)도 되고 글쓰기 관련 도서를 읽으면서 문득 블로그질을 하고 싶다는 생각이 들었습니다.


신규 프로젝트에 많은 오픈 소스를 사용하다 보니 관련 글을 쓰려고 합니다. 먼저 오픈 소스를 사용하는 것에 대한 이야기를 하려고 합니다. 어떤 개발자 분이 오픈 소스 관련 대화를 하다가 '의미있는 바이너리를 만들어내야 한다.'라는 이야기를 한적이 있습니다. 이 말에 대략적인 의미는 아래와 같습니다.

1. 오픈 소스처럼 의미있는 것을 만드는 개발자가 되어야 한다.

2. 오픈 소스가 모든 것을 해결해주지는 못한다. 즉 한계가 존재하여 직접 만들 수 밖에 없다.


1번은 이상적이고 멋있는 개발입니다. 아마도 이분은 2번에 더 많은 의미를 실어서 이야기를 한다고 느껴졌습니다. 


언제부터인지 개발자를 보면 1. 기술에 관심이 많은 개발자 2. 업무에 관심이 많은 개발자로 분리가 됩니다. 교과서적인 이야기지만 기술 + 업무가 조화를 잘 이루어야 진짜 의미있는 결과물이 나옵니다. 1번이 강한 사람은 2번에 관심이 없고 2번이 강한 사람은 1번에 관심이 없습니다. 모두가 그런 것은 아니지만 제가 봐온 많은 개발자들은 편차가 심합니다. 아마도 위에 언급한 분은 기술에 관심이 많고 업무에는 별 관심이 없는 개발자입니다. 기술에만 관심을 가져도 되는 분야가 있습니다. 하지만 업무가 중요한 부분을 기술에만 관심있는 개발자가 설계를 하고 리드해가는 과정과 그 결과물을 보면서 '앙꼬없는 진빵'이라는 생각이 들었습니다. 누구를 위한 기술이고 무엇을 위한 기술인지 알수가 없었습니다. 물론 저의 생각이고 시야가 좁아 그런걸 수도 있습니다. 업무가 중요한 분야에서 업무에 대한 관심과 분석 없이는 좋은 결과물을 만들어낼 수 없다고 확신합니다.


그럼 이제 본론?!으로 들어가서 오픈 소스 선택에 대한 기준에 대해서 이야기를 해보겠습니다.

동일한 기능을 제공하는 오픈 소스들이 많이 있습니다. 

예를 들어 IoC Container만 하더라도 20여 가지가 넘습니다.

저는 아래와 같은 기준으로 오픈 소스를 선택합니다.

1. 성능

2. 기능

3. 레퍼런스 사이트

4. 문서, 커뮤니티 기타 등등


1번째로 성능입니다. 여기서 순서는 우선순위를 의미합니다. 많은 기능을 가지고 있더라도 성능이 떨어지면 제외가 된다는 의미입니다. 성능을 가장 우선순위에 놓은 이유는 성능에 관련된 문제가 발생하게 되면 사용한 오픈 소스에 전체 구조 및 문제점을 분석 해야하고 수정을 하면 수정으로 인한 부작용까지 감수해야 하는 어려움 때문입니다. 기능에 대한 단순 버그를 수정하는 것과 근본이 흔들리는 성능은 큰 차이점이 있다고 생각합니다. 그리고 의외로 기능만 보고 오픈 소스를 선택하는 경향이 있습니다. 기능이 되기 때문에 일단 도입을 해서 사용을 하다가 성능 때문에 고생을 한 경우를 몇 번 보았기 때문이기도 합니다. 성능을 고려할 때 절대적인 수치로만 고려할 부분은 아니고 상대적인 수치로 조금 성능이 낮더라도 기능이 우수한 오픈 소스를 선택하는 경우도 있습니다.

2번째는 역시 기능입니다. 원하는 기능이 되지 않으면 당연히 의미가 없습니다. 기본 기능을 살펴보고 당장은 사용하지 않더라도 확장성을 고려해서 선택합니다.

3번째로는 해당 오픈소스를 사용한 레퍼런스 사이트입니다. 예를 들어 Dapper와 같은 매퍼는 Stackoverflow에서 사용한 오픈 소스로 레퍼런스 사이트만 들어도 신뢰가 생기는 오픈소스입니다.

마지막으로는 문서, 커뮤니티, 사용성 등등 고려해야할 요소들이 있습니다. 


위의 내용을 기준으로 제가 이번에 선택한 IoC Container는 SimpleInjector입니다.

1번째 성능에 의해서 SimpleInjector와 Lightinject를 선택하였습니다. 2번째 기능에 대해서 IoC Container 본연의 기능과 추후의 확장가능한 기능인 AOP를 둘 다 제공합니다. 3번째는 잘 모르겠고 문서, 커뮤니티 등등 우열을 가리기가 쉽지 않았습니다.

작년에 LightInject를 간단하게만 사용해보았고 이번에 검토를 하면서 SimpleInjector를 사용해보았습니다. 사용해본 느낌은 LightInject는 유연한 느낌이고 SimpleInjector는 엄격한 느낌입니다. 이런 느낌의 근거는 의존성 주입이 되는 객체가 1개 또는 N개에 따라서 컬렉션(List<T>)으로 받을 수 있는지 없는지에 대한 차이 때문입니다. 전자는 받을 수 있고 후자는 예외가 발생합니다.

평상시에 저라면 유연한 것을 선택했을 확률이 높은데 컨테이너는 엄격해야 한다는 생각이 들었습니다.

이번에 검토를 하면서 이전에 사용해봤던 Spring, Unity, Windsor, MEF는 유물이 된 느낌이였습니다. 일단 성능 수치가 상대가 안되었고 요즘 아이들은 이름처럼 간단하고 가벼운 느낌이 들었습니다.


IoC Container로 프로젝트를 처음부터 해본적이 없었는데 적용을 해보면서 경험해봐야만 알 수 있는 내용과 왜 사용하였는지에 대해서도 해당 프로젝트의 1차 개발이 끝날때쯤(한3월초? ㅎㅎ) 작성해보도록 하겠습니다.

저작자 표시 비영리 변경 금지
신고
Posted by resisa

이번에는 Android와 관련된 내용입니다.


1. cross-walk, User-Agent 관련

이건 이전 글로 대체합니다.

http://resisa.tistory.com/170


2. 푸시 관련

여러가지 푸시 플러그인이 있는데 저는 아래 플러그인으로 최종 선택하였습니다.

아래 플러그인이 사용도 가장 심플하고 다른 플러그인에서 안되는 기능도 됩니다.

https://github.com/Code1Tech/phonegap-plugin-push


푸시에서 GCM토큰을 받아오는 초기화 코드의 경우 앱 실행 타이밍과 연관이 있습니다. 입이 실행 되자마자 해당 초기화 코드가 실행되면 토큰을 정상적으로 가져오지 못합니다. 그래서 setTimeout()를 사용하여 2.5초 정도의 딜레이를 주고 실행시키고 있습니다. 2초정도로 했을 경우 특정 디바이스에서 토큰을 받아오지 못하는 현상이 있어 해당 시간을 늘렸습니다.


요구사항 중 앱이 실행 중인 경우에도 푸시가 왔으면 좋겠다는 의견이 있었습니다. iOS 푸시에서는 앱이 실행 중일 때는 푸시가 올 수 없습니다. 그래서 일반적으로 iOS에서는 앱이 실행 중일 경우 푸시가 오는 것처럼 앱내에서 구현을 해주고 있습니다.

여튼 안드로이드에서 앱이 실행 중일 경우 푸시가 오도록 하려면 위의 플러그인을 사용하여야 하며 아래 코드를 추가해주어야 합니다.


- GCMIntentService.java

@Override  

 public void onMessageReceived(String from, Bundle extras) {

            // if we are in the foreground and forceShow is `false` only send data

            if (!forceShow && PushPlugin.isInForeground()) {

                Log.d(LOG_TAG, "foreground");

                extras.putBoolean(FOREGROUND, true);

                PushPlugin.sendExtras(extras);

            }

            // if we are in the foreground and forceShow is `true`, force show the notification if the data has at least a message or title

            else if (forceShow && PushPlugin.isInForeground()) {

                Log.d(LOG_TAG, "foreground force");

                extras.putBoolean(FOREGROUND, true);

                PushPlugin.sendExtras(extras);

                showNotificationIfPossible(getApplicationContext(), extras);

            }

            // if we are not in the foreground always send notification if the data has at least a message or title

            else {

                Log.d(LOG_TAG, "background");

                extras.putBoolean(FOREGROUND, false);


                showNotificationIfPossible(getApplicationContext(), extras);

            }

    }


3. ThemeableBrowser Plugin

iframe내에 링크가 걸려 있을 경우 인앱브라우저 화면에서 아무런 버튼도 보이지 않는 현상이 있습니다. 직접 해당 플러그인을 사용하는 코드에서는 상관없지만 iframe내의 링크의 경우에 해당하는 내용입니다. 아래처럼 자바 코드에 close관련된 부분만 변경하여 넣어줬습니다.

 public boolean execute(String action, CordovaArgs args, final CallbackContext callbackContext) throws JSONException {

            final Options features = parseFeature("{ closeButton: { image: 'close', imagePressed: 'close_pressed', align: 'right', event: 'closePressed'}}");

}


4. MenuButton 관련

Android에서는 메뉴 버튼과 뒤로 가기 버튼이 있어 해당 부분에 대해서도 신경을 써줘야 합니다. 아래 링크로 대신합니다. 메뉴 버튼의 경우 기기에 따라서 다르게 동작합니다.


- CordovaWebViewImpl.java

https://forum.ionicframework.com/t/android-hardware-menu-button-not-working-with-cordova-5-1-1-and-ionic-1-1-0/33128/3



저작자 표시 비영리 변경 금지
신고
Posted by resisa


티스토리 툴바