개발이야기 118

지난 2년(17, 18년) 동안의 개발 블로그 운영 회고

개발 블로그의 시작처음 시작은 Effective Java 스터디를 시작하면서 공부했던 내용을 정리하자는 차원에서 시작하였다. # 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라.# 예외는 예외적 상황에만 사용하라# 불필요한 점검지정 예외 사용은 피하라# 표준 예외를 사용하라# 메서드에서 던져지는 모든 예외에 대해 문서를 남겨라# 어떤 오류인지를 드러내는 정보를 상세한 메시지에 담으라# 실패 원자성 달성을 위해 노력하라# 예외를 무시하지 마라# int상수 대신 enum을 사용하라# 작명 패턴 대신 어노테이션을 사용하라# Override 어노테이션은 일관되게 사용하라# 자료형을 정의할 때 표식 인터페이스를 사용하라 처음에는 에버노트에 할지, 네이버 블로그, google blogger, 티스토리 ..

개발이야기 2018.12.04
Spring boot에 AWS Elasticbeanstalk의 ebextensions 적용하기

Elasticbeanstalk란? Elasticbeanstalk는 Java, .NET, PHP, Node.js, Python, Ruby, Go, Docker를 사용하여 Apache, Nginx, Passenger, IIS와 같은 친숙한 서버에서 개발된 웹 애플리케이션 및 서비스를 간편하게 배포하고 조정할 수 있는 서비스이다. Tomcat 배포시 web server configuration?Spring boot MVC를 war package하여 Elasticbeanstalk(tomcat)을 통해 배포하면 자동으로 WAS, WEB 서버가 프로비져닝되어 배포된다. 아주 간편하고 쉬운 배포지만 was control 뿐만아니라 web server을 어떻게 컨트롤 할지 의문이든다. 이 때를 위하여 Elasticbe..

개발이야기/AWS 2018.11.19
app의 강제종료로 인해 FCM cloud messaging 푸시를 받지 못하는 이유?

FCM cloud messaging을 사용하면 google의 푸시서버를 활용하여 각 기기에 push를 날릴 수 있다. 그런데 QA를 하던도중 흥미롭게도 push를 받지 못하는 단말이 생겼다. # 단말 재시작 후# 안드로이드 settings에서 force kill(강제종료) 흥미로운 사실은, 카카오톡이나 라인과 같은 App들은 단말기를 껐다 켜도, 그리고 강제종료 하더라도 잘 된다는 사실이다. 이를 해결하기 위해 FCM 공식문서를 찾아봤지만 뚜렷하게 나올만한 해결책이 없었고 stackoverflow에서 아래와 같은 정보를 얻게 되었다. 원본 글 : Android app not receiving Firebase Notification when app is stopped from multi-task tray ..

IaC(Infrastructure as Code)를 통한 Enterprise환경에서 Infra 운영프로세스의 한계 해결방안

Enterprise환경의 infra 운영프로세스 지옥 - 사례1개발자 A씨는 운영하고 있는 5개의 서버에 대해 X라고 하는 네트워크 정책을 가져가려고 한다. 이때, 거쳐야 하는 과정은 아래와 같다. 1) 5개 서버에 대한 X 정책에 대해 정의하고 티켓을 만들고 보안담당자에게 할당한다.2) 해당 티켓을 보안담당자가 검토한다.3) 보안 확인 후 네트워크담당자에게 할당한다.4) 네트워크 담당자는 X 정책에 대해 확인하고 5개 서버에 적용한다.5) 적용이 되면 네트워크 담당자는 A씨에게 적용되었음을 알린다.6) A씨는 적용이 되었음을 확인하고 계속 일을 진행한다. Enterprise환경의 infra 운영프로세스 지옥 - 사례2사례1이 일어나고 5년뒤(이미 A씨는 퇴사) 개발자 B씨는 5개의 서버를 추가(scal..

Rest api에서 Content-Type 헤더의 역할 및 Spring boot 예제

Rest api를 개발할 때 사용하는 Content-Type의 역할, 그리고 예제를 통해 어떻게 헤더의 정보를 활용하는지 알아보자. Content-Type Header? The purpose of the Content-Type field is to describe the data contained in the body fully enough that the receiving user agent can pick an appropriate agent or mechanism to present the data to the user, or otherwise deal with the data in an appropriate manner. - w3.org Http request를 통해 data가 전달될 때, 데이터..

Amazon web service 한달 최대 2,500원으로 마음껏 쓸 수 있는 서버 호스팅 하기(Reserved Instance)

AWS에는 EC2 서비스를 통해 Linux서버(혹은 윈도우, 우분투 등)를 사용할 수 있다. 그러나 막상 쓸려고하니 금액이 어떻게 되는지도 모르겠고, 나중에 요금 폭탄을 맞을까바 두렵다. 이때는 Reserved Instance(예약 인스턴스)를 사용하면 아주 저렴한 가격(기존가격 -30%)에 요금폭탄 걱정없이 서버를 사용 할 수 있다. 준비물- AWS 계정- AWS 결제 가능한카드- 5분 Region을 선택하고, Reserved Instance를 선택(속도때문에 Seoul Region을 사용함) Reserved Instance 검색페이지가 나온다.가장 spec이 낮은 t2.nano를 선택한다. t2.nano instance에 대한 가격리스트를 확인 할 수 있다. 12개월에 35달러 - 4만 5천원(역산하..

개발이야기 2018.07.20
spring boot scheduler의 cron은 UNIX의 cron과 다르다!

결론 : Spring boot scheduler의 cron과 unix의 cron은 다르다! spring boot scheduler의 cron에 대한 설명을 살펴보자 @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(Schedules.class) public @interface Scheduled { /** * A cron-like expression, extending the usual UN*X definition to include * triggers on the second as well as minute, hour, day of month,..

컨트리뷰터가 되기 위해 opensource에 pull request날린 후기 #2 - pull request 날리기

pull request를 날릴 repository를 정했으니 이제 pull request를 만들어 날려보자! 해당 repository를 내 계정으로 fork정상적으로 fork되었는지 확인fork한 repository를 내 local에 clone하여 작업어느 브랜치 이든 상관없다. 수정할 부분을 수정하고,나는 master branch에 바로 commit & push!fork 한 repository에서 처리가 다 되었다면, 다시 원본 repository로 가서 New pull request 클릭!compare across forks를 누르게 되면 해당 repository가 아닌 다른 계정의 repository에서가져와서 pull request가 가능하다.내 계정의 repository를 클릭pull reque..

개발이야기 2018.07.19
컨트리뷰터가 되기 위해 opensource에 pull request날린 후기 #1 - 어떤 프로젝트에 기여할까?

오픈소스에 기여하여 컨트리뷰터가 되는 것은 많은 초보개발자들에게 꿈만 같은(?) 일이다. 하지만 github의 opensource들에 기여하는 법은 생각보다 간단하고 놀라울만큼 쉽다. 아래 목록에 해당되는 개발자라면 오픈소스에 기여할 준비가 되었다는 증거이다. 오픈소스 준비물java, c, c++ 셋중 하나라도 사용할줄 안다.주석을 달고 읽을 줄 안다.(영어)git을 사용할 줄 안다. 이제 어떤 오픈소스 repository에 pull request를 날려볼까? 아래는 대표적인 오픈소스 repository들이다.(아무래도 유명한 오픈소스에 기여해야 뽀대가 난다.)(저는 텐서플로우 컨트리뷰터입니다^^ 같은..) 쿠버네티스 https://github.com/kubernetes/kubernetes엘라스틱서치 h..

개발이야기 2018.07.19
도커 기초, 컨테이너와의 관계 및 명령어

Docker은 기본적으로 리눅스 커널 위에서 돌아간다. Docker 버젼 확인 방법$ docker version * client는 docker-cli의 버젼 * server는 docker-server의 버젼 Docker 이미지란* tar파일로 묶어 놓은 파일 시스템 Docker alpine linux이미지 가져오기 & 실행alpine linux : 최소로 경량화된 리눅스$ docker image pull alpine$ docker image ls $ docker container run alpine ls -l * docker run : 내 repository에 alpine이라는 image가 있는지 확인하고, 격리된 container안에서 alpine을 실행시켜라!* alpine 이미지, 컨테이너로 실행 ..

[ConstraintLayout] 효과적인 ConstraintLayout 사용방법

[Android Knights 2018] 지금은 ConstraintLayout 시대 speaker. 안세원 - 카카오 모빌리티 안드로이드 개발자 최근 참여 앱 카카오 T 택시 기사용 카카오 T 카카오톡 Guide, Chain 등에서 부터 최신 업데이트된 기능까지! 혼자 알기 아까운 ConstraintLayout, 복잡한 구조도 한방에 멋지게! 복잡한 레이아웃을 단순한 계층구조를 이용해 표현할 수 있는 View Group Relative layout과 아주 비슷하지만 유연하고 다양한 기능을 제공함 ex. relative layout에서 4 depth이상 들어가야하는 것도 1 depth로 가능!!! ConstraintLayout 장점 Linear Layout을 써야만 했던 뷰 비율 조절도 간단히 가능(dep..

[Instance app]설치 없이 네이티브앱의 사용경험을 제공할 수 있는 방법

[Android Knights 2018]Best practice on Android Instance Appsspeaker. 김종식 - 원티드팀 안드로이드 개발자 만약 내가 개발한 앱이 설치없이 동작한다면? 설치 없이 네이티브앱의 사용 경험을 제공할 수 있는 인스턴트앱의 개발과정을 환경 설정 구성부터 배포까지 준비하였습니다. 이를 작업하면서 알게 된 많은 내용과 배포를 하면서 경험했던 유의사항, 인스턴트앱을 이용하여 시도했던 다양한 경험과 기존 프로젝트에 함께 적용하는 방법 등을 공유하려고 합니다. 일반적으로 웹에서 부터 딥링크방식을 많이 제공함 -> url에서 제공하는것을 네이티브로 연결(일반적임) but 설치가 되어있지 않다면 다시 play store로 이동해야하는 문제가 있다. 만약 설치가 없을 경우..

[asciinema] shell script, terminal 영상으로 녹화하기!!

개발자가 자신이 개발한 내용을 포스팅할때 이때까지 불편하게 colorscript(링크)나 혹은 github의 gist(링크)를 통해서 개발한내용을 블로그에 embedded 하곤 했다. 그러나 asciinema(링크) 를 쓴다면 더 동적으로 실시간으로 터미널을 녹화하여 포스팅 할 수 있다. 준비물macbook or linux computer with terminalhomebrew터미널에 설치 방법brew install asciinema 녹화 방법시작 : aciinema rec 끝 : exit 영상 파일 블로그에 포스팅 방법녹화 완료.cast 파일 업로드script 다운로드 및 추가 js, css 다운로드 : https://github.com/asciinema/asciinema-player/releasese..

[Hazelcast]Java concurrent lock 구현하기

Hazelcast Lock 하젤케스트에서 사용하는 ILock은 java.util.concurrent.locks.Lock 의 상속구현체이다. 즉, 모든 클러스터에서 네트워크상에 이상이 없는한, lock이 잡힌 critical section은 한번에 한 쓰레드만 도는 것이 보증된다. Lock 구현은 매우 신경써서 하지 않으면 문제점이 바로 생겨날 가능성이 있으므로 주의하여 구현해야만 한다. Try-catch구문을 사용하여 Lock 사용하기 lock안쪽 구문은 반드시 try-catch 구문을 사용해야한다. 만약 critical section에서 에러가 났을때 unlock 가능하도록 도와주기 때문이다. 또한 lock구문에서 에러났을때 unlock되는 것을 막기 위해 lock method의 밖에도 try-catc..

IMDG 소개 및 하젤케스트 오픈소스 솔루션 소개

IMDG가 필요한 이유?일반적인 1 server, 1 application 구조에서는 memory상에 자신이 쓰고자 하는 자료구조(map, lock, list 등)를 올려두고 쓰면된다. 그림. 일반적인 1 server, 1application 구조 그러나.. 만약 *(many) server, *(many) application 구조에서 특정 자료구조(map, lock, list 등)를 공유해서 사용하고 싶다면 In-Memory Data Grid가 그 해법이다. 그 중에서 추천하는 것은 JVM위에서 돌아가는 Hazelcast를 강추한다. 그림. Hazelcast(IMDG)를 사용하여 자료구조를 공유하여 동시에 사용가능 IMDG란?IMDG : In memory data grid더 빠른 결과를 제공하기 위한 ..

[Intellij] 200% 활용하기(toolbox, jira, git 등)

인텔리j를 그저 text edit로 사용하고 있는 것이 아닌가? Jetbrain toolbox jetbrain 관련 툴을 한눈에 보고 관리 가능cmd + shift + acommand action 관련 시작 가능JIRAPreference > Tools > Tasks > Servers > jira 서버 추가alt + shift + n나의 jira 선택가능jira에 대한 progress를 선택, 브랜치 생성 등 가능GITGit flow 관련해서 필요한 것들을 intellij 내부에서 자동으로 처리 가능(ex. develop에서 feature 따기)Preference > Plugin > Git Flow integration 설치JIRA 관련 task 진행Gitflow operationGit flow 버젼에 맞..

개발이야기 2018.02.24
Oracle 권한 추가 후 오류 [ORA-00942 테이블 또는 뷰가 존재하지 않습니다]

ibatis로 mapper나 기타 등등의 방법으로 개발하다가 권한 추가할 때가 있다. A라는 계정으로 person이라는 테이블에 insert, select 권한을 추가하고 insert를 실행 했지만 동작하지 않고 아래와 같이 오류를 내뿜는 경우가 있다. ORA-00942 테이블 또는 뷰가 존재하지 않습니다 위와 같은 경우 아래의 경우를 의심해봐야 한다. oracle synonym처리때문에 계정이 접근을 못하고 있는가? -> synonym관련 테이블 권한을 확인한다. insert구문안에 sequence구문이 있는가? -> 각 sequence에 대해서 권한을 추가한다.

crontab grep 특정 문자 찾는 방법 & crontab 옵션 정리

crontab 내부에 있는 line 중, 특정 문자열(ex. target 문자)이 들어간 줄만 grep하고 싶다면? $ crontab -l | grep 'target' crontab option list file Load the crontab data from the specified file. If file is a dash ("-"), the crontab data is read from standard input. -u user Specifies the user whose crontab is to be viewed or modified. If this option is not given, crontab opens the crontab of the user who ran crontab. Note: u..

개발이야기 2018.02.08
[Telegraf + influxDB + Grafana]10분만에 데브옵스를 위한 모니터링 시스템 구축하기

각 솔루션이 하는 역할 위와 같은 솔루션을 선택한 이유 -> [Telegraf + influxDB + Grafana]DevOps를 위한 서버 모니터링 솔루션 선택 보러가기(클릭) 무엇을 할까? 내 컴퓨터를 위한 시스템(cpu, memory 등)을 모니터링하는 이쁘고 귀여운 모니터링 시스템 준비사항 * 10분 * 맥북 * Homebrew 앱 설치, 설정(3min) 1. 텔레그래프 설치 $ brew install telegraf 2. 텔레그래프 설정 $ cd /usr/local/Cellar/telegraf/1.5.1/bin $ telegraf config > telegraf.conf $ vi telegraf.conf ###################################################..

[Telegraf + influxDB + Grafana]Setup DevOps monitoring system in 10min

The role of each solution What you'll build Beautiful system metric monitoring system for own computer(localhost). What you'll need * About 10 minutes * Macbook * Homebrew Install & setup apps(3min) 1. install telegraf $ brew install telegraf 2. setup telegraf $ cd /usr/local/Cellar/telegraf/1.5.1/bin $ telegraf config > telegraf.conf $ vi telegraf.conf ##########################################..

[Telegraf + influxDB + Grafana]DevOps를 위한 서버 모니터링 솔루션 선택

DevOps는 개발자가 갖추어야할 기술중 하나인 시대이다. DevOps를 한마디로 표현하자면 아래와 같은 벤다이어그램으로 설명 가능하다.(출처:위키피디아) 개발을 함 뿐만아니라 품질관리, 운영까지 모두 담당하는 것이다. 이 모든것이 가능하게 된 것은 자동화된 솔루션들의 발전때문일 것이다.(특히 오픈소스 솔루션) 그 중 DevOps 밴다이어그램의 한 부분을 차지하는 Operation(운영)에 필수적으로 필요한모니터링 오픈소스 솔루션에 대해서 이야기 하고자 한다. 모니터링의 가장 기본 옵션인 System metrics(CPU, memory, disk 등)을 모니터링하는 솔루션을 구축하는 방법을 찾아보면 아래와 같은 옵션이 있다. 장점 단점 직접 개발 커스터마이징 극대화 가능 개발하는데 시간이 오래 걸림 유료..

비트코인과 리플코인, 퀀텀코인 개발자 분석을 통한 호재 파악

이 글에서는 비트코인과 리플코인 그리고 퀀텀코인을 개발하는 개발자가 누군지, 어떻게 개발하고 있는지에 대해 알아보겠다.(메인 개발자는 commit 개수(소스 등록 개수) 기준으로 한다.) 비트코인개발소스 : https://github.com/bitcoin/bitcoin메인 개발자 : laanwj(https://github.com/laanwj) - 1,529개의 commit 리플코인개발소스 : https://github.com/ripple메인 개발자 : JoelKatz(https://github.com/JoelKatz) - 4,243개의 commit 퀀텀코인개발소스 : https://github.com/qtumproject/qtum메인 개발자 : laanwj(https://github.com/laanwj)..

개발이야기 2018.01.09
구글 게임 플레이 서비스 디버깅 방법

구글 게임 플레이 서비스 디버깅Google Play Game Service(이하 GPGS)를 디버깅하다보면 나오는 무시무시한 에러가 있다. failed to sign in. please check your network connection and try again 만약 이 글을 읽는 개발자가 GPGS의 Document에 따라서 잘 개발했다면(혹은 GPGS sample app을 다운받아서 디버깅할때) 마지막 남은 관문을 넘지 못해서 나오는 오류인 것이다. GPGS는 디버깅시에 signed apk를 사용하여 디버깅해야만 한다. GPGS 디버깅 방법GPGS와 사용자의 google 계정 연결 혹은 업적과 같은 기능의 테스트를 위해서는 일반적인 Android studio의 RUN으로는 불가능하다. 해당 내용은 G..

React 기초 핵심정리 - 데이터 다루기

React에서 추천하는 데이터를 다루는 방법 redux의 시작은 view를 다루는 곳에다가 데이터까지 다루는 코드가 있는 것이 싫어서이다. 뷰는 결국, 이벤트나 데이터의 변경에 의해서 변경이 일어남. 자연스럽게 데이터에 의해서 React기반의 View부분이 다시 렌더링 될 수 있는 어떠한 장치가 있으면 좋겠다. Flux는 architecture 컨셉을 제공하는 역할을 하고, 실제 다양한 구현체가 등장했는데 대표적인 구현체가 Redux이다.(http://redux.js.org/) Redux의 원리데이터와 뷰간 직접호출을 할수도 있음.(그러나 데이터와 뷰 간의 결합도가 높다) 그림. 데이터와 뷰간 결합도가 높음 데이터와 뷰 간에 직접적인 호출을 하지 않고 이벤트가 일어났음을 알려주는 로직을 사용할 수 있음...

React 기초 핵심정리 - 개발환경 구축

React-Redux를 통한 모델다루기 왜 Redux를 사용할까? Redux는 JavaScript 어플리케이션에서 data-state 와 UI-state 를 관리해주는 도구 React 개발 환경 CLI(Command Line Interface)로 빠르게 구성하기 1. 프로젝트 준비 front-end프로젝트는 framework를 쓰기 시작하면서 복잡하다. 특히 빌드해야 할 것들이 늘어나면서 환경구성과 프로젝트 디렉토리 구조를 정리하는 것이 어려움. boilerplate라고 기본환경을 제공하는 오픈소스가 꽤 있음. url : http://andrewhfarmer.com/starter-project/ 2. React 기반 기본 환경 만들기. React Create App을 쓰자. 깔고나면 매우 clean함. ..

React를 위한 ES6 핵심정리 2

React를 위한 추가적인 ES6 문법들React를 하기위한 ES6문법 : http://voidmainvoid.tistory.com/67 14. String enhancements123startsWith() endsWith() includes()cs 15. Array enhancements ‐ for/of1234567891011var arr = [1,2,3,undefined, null, ""]; Array.prototype.getIndex = function() {}; for ( let value of arr) { console.log(value); } //function까지 노출된다.for ( let value in arr) { console.log(arr[value]); }Colored by Colo..

React를 위한 ES6 핵심정리

React를 하기 전! ES6문법에 대해 알아야한다. ES6를 모르고 한다면 여러가지 ES6문법들이 React에 종속된 문법이라고 착각할 수도 있기 때문에 ES6문법에 대한 최소한의 이해는 필수적임. 주의점 아래 여러가지 기능들은 크롬이나 사파리에서 작동은 잘 되지만, but 제대로 지원이 되지 않을 수도 있으니 Babel(Babel.io)을 사용하여 변환하는 기능을 사용해야한다. ES2015 ES6 === ES2015 (ES2016, ES2017 ..) 개선된 Javascript 문법. ES6 Browser compatibility의 휼륭한 지원. ES6를 기반으로 한 JavaScript 생태계의 확산. 1. scope enhancements ‐ let ES6 에서는 let 키워드를 사용해서 변수를 사..