6년 간의 아파트 생활을 뒤로 하고 드디어 내 이름으로 등록된 집을 사게 되었다.


여기저기서 많은 정보를 보긴 했지만, 혹시라도 내 뒤로 집을 사게 될 사람을 위해서 진행 내용을 한 번 정리해 보기로 했다.


0. Down pay 송금

   - 미국에서 충분히 돈을 가지고 있다면 모르겠지만 아마도 대부분의 한인들은 한국에서 돈을 가져와야 할 것이다.

   - 주택 구매등을 목적으로 목돈을 한국에서 돈을 송금하기 위한 방법을 찾아 보니 세가지 정도 였다.

      - 일반 무자료 송금 ( 연 $50,000 제한 ) 

      - 주택구매를 위한 송금

      - 해외동포 재산 반출 ( $100,000 까지는 무자료 송금, $100,000 이상은 국세청에서 자금 출처 확인서 필요 ) 

   - 주택 구매 송금의 경우 2년에 한 번씩 주택 소유 내용을 한국에 신고해야 하고, 주택을 판 이후에는 해당 금액을 한국에 다시 송금해야 하므로 좋은 옵션은 아닌 듯

   - 해외 동포 재산 반출의 경우 10만불 까지는 편하게 송금을 할 수 있지만, 영주권이 필요하고 10만 불 이후 금액의 경우는 국세청에서 자금 출처 확인서를 받아서 진행해야 하기때문에 지속적으로 한국에서 돈을 가져올 일이 있을 경우에도 좋은 옵션은 아니다. ( 특히나 인터넷 뱅킹으로 해외 동포 재산 반출을 지원하는 은행이 신한은행 밖에 없는 듯 싶다. ) 

   - 우리는 내가 해외동포 재산 반출로 10만불 가까운 돈을 가져오고 집사람은 일반 무자료 송금으로 나머지 금액을 가져오는 방식으로 처리했다.

   - 돈 송금을 처리한 후에 검토해본 결과 일반 무자료 송금으로 몇 년간에 걸쳐 한국에서 가져오는 게 제일 좋은 방법이라는 생각이 든다. 물론 이 돈을 주택 구매에 사용하면 안된다고 제약 사항이 명시 되어 있지만 과연 그걸 한국에서 체크할 까 싶기도 하고..그래서 이게 제일 안전한 방법인 듯 싶다. 

  

1. Agent 선정 

   - 다들 얘기 하지만 Open House가 집을 구경하는 것도 있지만, Buyer Agent를 찾을 수 있는 좋은 기회이다.

   - 우리 가족도 근 2~3년간 시간 될때마다 Open House를 갔었고, 1년 정도 만나는 Agent들을 꼼꼼히 지켜보다가 최종적으로 Keller Willams에서 일하는 Kristen이라는 Agent와 함께 하기로 했다. 재밌는건... Kristen이 지금 우리가 구매하는 Community에 살고 있어서 Agent에서 Neighbor가 될 것이라는 거.. ( 뭐..Community 가 커서 자주 보게 될지는 모르겠다. )  

2. 집 서치

   - 여러방법이 있겠지만, Agent와 일하기 전에는 Zillow ( 혹은 Redfin ) 같은 사이트에 검색 조건을 걸어 놓고 Daily Update메일을 받는 방법이 일단 좋은 것 같다.

   - 하지만 Agent와 일하게 되면 , Agent에게 원하는 조건을 얘기하면 mls 사이트의 Daily메일을 보내준다. Zillow가 나름 여러 정보들을 많이 보여주지만, 대부분의 정보가 mls 및 다른 사이트들의 정보를 가져와서 편하게 보여주는 것이기 때문에 mls가 제일 빠르고 정확한 정보일 가능성이 크다. 

  - 좋은 방법은 MLS의 Daily 메일을 통해 원하는 매물을 찾고, 상세 정보 ( 학군 - 학교 rating , Price History, Tax ) 등은 Zillow로 확인하는 게 제일 좋은 방법인듯 하다.

  - Agent와 일하게 되면 집 보기 위한 Schedule잡기가 편하기 때문에 집 구매를 심각하게 고려하게 될 때쯤은  Agent를 선정해서 함께 하는게 좋다.   

3. Pre-approval

  - Pre-approval은 말 그대로 은행에서 해당 사람에게 대출 하는 것을 Pre-approval했다는 서류이고, 집에 offer를 넣을 떄 반드시 필요하다. 뭐 Pre-approval이라고 해서 무조건 대출이 되는 건 아니라는 것.

  - 일단 한 번 Pre-approval을 받을 당시 은행에서는 조회한 Credit점수를 3개월 동안 유효한 것으로 취급하기 때문에 3개월 안에 내가 집을 살 것 같다고 하면 미리 받아 놓는 것이 좋을 수 있다.만일 3개월 이후가 되면 다시 Credit 조회가 이루어 지기 때문에 신용점수에 안 좋은 영향을 준다.

  - Pre-approval을 받을 때는 가능하면 많은 은행에서  Pre-approval을 1주 안에 받아 놓는 것이 좋다.  같은 용도로 1주일 안에 여러 Credit 조회가 이루어 지는 것은 한 건으로 신용점수 계산시 취급된다고 하고, 많은 은행에서 Pre-approval을 받아 놓는 것이 나중에 은행을 선택할때 선택의 폭을 넓혀준다.

4. Offer

  - 맘에 드는 집을 찾으면 Offer를 넣으면 된다. 보통 Offer를 넣을 때 Pre-approval을 받은 은행을 명시해 넣는 경우가 있는데 가능하면 TBD로 놓고, Pre-approval받았던 은행들에 최종 offer를 받아서 1주일 안에 결정해서 통해 해 주는 것이 좋다.

  - 우리 집의 경우는 Offer문서에 Agent가 추천한 은행이 명시되어 있기에 이 부분을 TBD로 수정해 달라고 요청하고 처리하도록 했다.

5. Inspection

  - Offer가 accept되면 보름(?) 안에 Inspecton 이 진행되어야 한다. 생각 만큼 준비 기간이 길지 않아서 Inspection 업체 알아 볼 시간이 부족해서 결국은 Agent가 추천 한 회사에서 진행했다.

  - 집을 살 생각이라면 Inspector를 미리 미리 알아 보는 것이 좋을 듯 싶다.

6.  Loan process

  - Loan이 진행되는 동안 은행에서 요청하는 서류를 잘 보내주면 된다.

  - 그리고 진행하는 중간에 혹시라도 목돈이 들어올 일이 있다면 가능하면 Loan officer랑 상의 하는 것이 좋다. 나도 한국에서 송금을 좀더 받으려고 했는데, Pre-approval할 때 이미 2달치 Bank Statement로 Down Payment 내역을 냈어도 그 뒤에 큰 돈이 움직이는 것에 대해서는 계속 증명이 필요하다고 한다.

  - 내 집을 사면서 여러 이슈 ( 특히나 한국에서의 송금 ) 가 있었는데, 집을 구매하면서 다른 사람들은 현지인이랑 함께 했지만, Loan 은 한국인 Banker랑 진행하면서 크게 도움이 되었다. 가능하면 Banker는 한국인 Banker랑 함께 하는 걸 추천한다.

  - 참고로 나는 Agent가 BOA 가 Loan Process가 느리다고 같은 경고를 주었는데도 BOA의 Lucia Lee랑 함께 했고, 대출 조건도 좋았지만 송금 문제 등 여러 문제 들에 대해서 큰 도움을 받게 되었다.

7. Closing & Move

 

집을 구매하면서 제일 도움이 되었던 글은 아래 글이었고, 미국 생활하는 정보를 얻기에는 제일 좋은 사이트 이다.

https://www.milemoa.com/bbs/board/1699572

'사는이야기 > 미국생활' 카테고리의 다른 글

뉴욕에서 친구 만나기  (0) 2017.08.15
회사  (0) 2017.03.03
한국에서 미국 송금 하기  (0) 2015.12.07
뉴스룸, 9/11 , 빈 라덴  (0) 2014.07.01
Verizon to Comcast  (0) 2013.12.02
Posted by headiron
,

Scala

개발자세상/자바세상 2016. 6. 16. 01:27

팀을 옮긴지 근 1년이 되는 시점에 드디어 Scala로 개발한 Product를 Release하게 되었다.


개발자로 경력시작하면서 의도하지 않게 asp, php를 배운이후로 새로운 언어를 배우는게 근 15년 만인듯 싶다.


1년 가까이 Scala, Play를 공부하며 매달려서 드뎌 하나를 개발했다는 자부심도 느끼지만, 아직도 Scala에 대해서 절반도 이해하지 못한 듯 싶어 너무 아쉽기도 하다.


가끔은 이렇게 어려운 언어가 왜 Popular할까 하는 생각도 하게 되는데... 내가 너무 오랫동안  OOP언어에 갇혀 있었기 때문이 아닌가도 생각된다.

아마도 예전에 Cobol로 개발하던 사람들도 Web시대로 오면서 비슷한 느낌이었을 까..


어쨋든 새로운 창 하나를 얻었다는 것이 기쁘고.. 

또 이번 Project를 하면서 얻었던 정보도 잊기 전에 기록해 두는 것이 좋을 듯 싶다.


회사의 Fireglass Framework을 사용하였지만 그 근간은 Play 2.3이다.

Fireglass에는 여러 Module들이 있는데 그 중 Moria라는 DB 모듈이 있다.

원래대로라면 DB Framework으로 이걸 사용해야 하는데, 어찌 하다 보니 다른 솔루션들을 검토하게 되었고, 그 중에  SkinnyORM을 사용하게 되었다.


http://skinny-framework.org/documentation/orm.html


Skinny Framework의 Sub framework 인데 Light weight하면서도  기능도 Powerful한 Framework이다.

ORM자체로서의 기능도 좋고, 근간이 ScalikeJDBC라는 Native SQL을 사용하기 때문에 Native Query를 사용할 수도 있다.

또 Skinny 에서 제공되는 Validator도 사용방법이 간단하면서도 쉽게 Expandable하게 되어 있어서 선택하게 되었다.


물론 MYSQL을 사용할 떄 다른 DB에 있는 TABLE을 지원하지 못하는 제약사항이 있기는 한데.. 

https://groups.google.com/forum/#!topic/skinny-framework/7zF4cQp3CLY

일단 DB만큼의 DB Pooling을 생성하고 각 Model별로 DB connection name을 overloading하는 방법으로 workaround할 수있었다.


Play와 연동은 아래 문서를 참조하면 되었다.

http://scalikejdbc.org/documentation/playframework-support.html


나는 일단 Play 2.0 ~ 2.3의 scalikejdbc-play-plugin을 이용하는 방법을 사용했는데 , 테스트를 진행하다 보니 Play의 DB config를 읽어 와서 자체 DB Pooling을 생성하여 사용하는 구조였다.

Redundant한 DB Pooling이 생기고 Play에서 설정된 DB Pool관련 Enhanced Option을 사용하지 못하는 문제가 발생했다. 특히나 Play에서 설정한 idleConnectionTestPeriod 설정을 읽지 않아서 DB Connection이 close되는 이슈가 발생했다.

이 문제는 scalikejdbc-play-dbplugin-adapter를 사용함으로써 해결이 되었다.


DB Pooling관련 이슈를 Followup하면서 발견한 사실인데 Play의 경우 2.3 에서 2.4로 넘어 가면서 DB Pooling library가 바뀌었다.

2.3에서는 BoneCP 라는 library를 사용하였는데, 2.4에서 Hikaricp로 변경이 되었다.

 BoneCP : http://www.jolbox.com

 HikariCP : https://brettwooldridge.github.io/HikariCP/


왜 바꾸었는지 보다 보니 BoneCP Framework이 Deprecate되어서 HikariCP로 넘어 가게 되었다.


일단 우리는 2.3을 사용하니 BoneCP에 맞추어 아래와 같은 Advanced Option을 사용하였다.


connectionTestStatement = "/* ping */ select 1"
idleConnectionTestPeriod = 1 minute

idleMaxAge = 10 minute
connectionTimeout = 20000
partitionCount = 2
minConnectionsPerPartition = 2
maxConnectionsPerPartition = 5
poolMaxSize = 10

다른 Option들에 대해서는 좀더 체크해 봐야 겠지만 특히나 좋은 부분은 idelConnectionTestPeriod인것 같다.

여기에 설정된 Duration에 맞추어 connection 을 테스트 하기때문에 DB 서버에서 Timeout 되어서  DB close하는 이슈를 방지할 수 있다.


일단 새로운 언어, 새로운 Framework에 대해서 알게 되었으니 좀더 공부해서 완전한 나의 창으로 만들어야 겠다.

특히나  Type System, Actor Model, Monad 등 좀더 고급 기능에 대해서 좀더 파해치다보면 Scala전문가가 될 수 있지 않을까 싶다.

 


'개발자세상 > 자바세상' 카테고리의 다른 글

Chronos Notification issue  (0) 2018.06.09
POI로 Pivot테이블 만들기  (0) 2017.11.28
Mockup 테스트  (0) 2016.02.02
java.lang.OutOfMemoryError: unable to create new native thread  (0) 2015.08.15
Control character in XML  (0) 2014.05.28
Posted by headiron
,

Ladybug 율이...

Ikea에서...

율이가 이제는 자신의 어떤 모습이 예쁜 모습인지 아는것 같다. 시키지 않았는데 자연스럽게 예쁜 모습이 나온다.


올해도 어김없이 집 앞 목련 나무는 예쁘가 피었다.


우연히 알게된 필리 유일의 일본 가게 마이도... 가끔 일본 음식이 생각 나면 가곤 한다.

뭐... 뉴저지의 미쯔와 만큼은 아니지만 뭐.. 그래도 그럭저럭 일본음식을 즐길 수 있다.

아마 율이가 엄마 뱃속에 있었을 때 알았다면 더 좋았을 텐데..








올 봄에도 어김없이 가본 Longwood Garden. 올 봄 날씨가 좀 Crazy해서 인지 벗꽃 구경도 못하고.. -.-

그래도 예쁜 Tulip을 보면 늘 기분은 즐겁다.

예전에는 생각도 못했는데 이제는 마트에서 김밥 사서 즐기기도 한다는..


우리 율이에게 새로 생긴 도깨비 친구..

영미 누나 고마워요..

세계에서 제일 큰 크레용 에서



우연히 뉴저지 사는 지인 통해서 알게된 Creyola Experience.

우리 집에서 한시간 거리의 Easton이라는 곳에 있다.

한 번 가봐야지 하다가 비오는 날에 맞추어 가서 놀아 보았다.

율이보다는 한 두살 많은 아이들에게 좋은 곳일 듯 싶었는데 

율이는 재밌었는지 자주 가고싶다고 졸라대곤 한다.

조만간 비오는 주말에 한 번쯤 더 가볼 듯...


갈 수록 이뻐지고 있는 우리 율이

그래도 배고 푼건 못 챂는 듯..


세 살을 맞이 하여 이번에는 제대로 된 케잌으로 축하해 주었다.

촛불에 불을 붙이자 갑자기 율이가 울기 시작한다.

왜 그럴 까 생각해 보니 지난 겨울에 화재가 났던 아파트가 생각 나서 불이 무서웠나보다.

( 아파트 단지내의 다른 건물에서 불이 났었는데 .. 우리는 다음날에 서야 알게 되었다. 종종 아파트 산책하다 불에 탄 집을 보다 보니 불이 조금은 무서워 졌나보다. ) 



우리 율이는 생일 소원을 뭘 생각 했을까..


처음 먹어 본 케잌이 맛있었는지. 케잌이 있는 4일 동안 항상 우리에게 생일 파티하자고.. ( 케잌목자고) 졸라 대곤 헀다.

아직까지 사탕 같은 건 안주고 있는데.. 조금씩 먹게 되는 단 음식 까지 못 먹게 하기는 조금 힘 들다. 


세살 맞이 정기 검진...

그동안은 그냥 검진을 받았는데.. 이제는 일반 병원 처럼 환자 가운을 입혀준다. 

몸무게나 키도 어른 처럼 일반 체중계를 사용하고, 

그리고 이제는 1년 뒤 네살이 되면 오면 된단다. 다만 네살 때 오면 예방 주사 몇 개 맞을꺼라고..

그동안 한달 두달 세달 이렇게 조금씩 기간을 늘려가면서 체크업을 했었는데 아마도 3살 아기는 특별하게 조심해야 하는 부분들이 많지 않기 때문인 듯 하다. 다만 이제는 Social activity를 신경 써야 한다는 얘기를 하는데.. 마침 이날이 회사에 자녀들 대려오는 날이라 병원 검진 끝나고 회사로 gogo..


아직은 어리지만 다른 애기들 이랑 어울려서 잘 놀고.. 또 아빠 엄마랑은 먹어 보기 힘든 단 음식도 많이 먹어 보고..


마침 율이 세살 생일 다음주에 대사관 가야 할 일이 생겨서 식구들 모두 대리고 뉴욕으로 향했다.

나는 회사 가서 일하고 율이랑 엄마는 Central Park가서 시간을 보내고..


율이가 앵무새가 좋았는지.. 계속 Parrot보고 싶다고...

펭귄도 있었다는데.. 펭권 보는 것 보다는 수족관 주위 돌아 다니는 걸 더 좋아했다던가..

놀이터에서 다른 아이들과 놀고 있는 율이 

회사 동료가 나눠 준 인형 들고 좋아 하는 율이..

동료는 필리 오프스에 가져다 놓아 달라고 한거였는데.. 율이가 너무 좋아 해서 다시 가져가기 조금 힘들었다는 ..

뉴욕 대사관 민원실 옆에 있는 한국 문화관에서.. 생각해보니 나도 이런 것 앞에서는 사직 찍어 본적이 없는 것 같은데..


구글 컨퍼런스 갔다가 받았던 선글라스인데 결국 율이 장난감이 되어 버렸다.

너무 좋아 했는데.. 자주 쓰다가 눈 나빠질까바.. 나중에 조용히 치워버렸다..


필리 시청 옆 공원에 있는 분수 앞에서 한컷..


율이 세살 생일 전후로... 여러 일이 있었다.

뭐. 그 중에서 제일 기뻤던 건 병원에서 율이를 어른 처럼 대하기 시작했다는 것이다.

그리고 지난 삼년 동안 크게 아픈 기억없이 잘 자라 주어서 너무 기쁘고 감사했다.

미국에 오면서 제일 걱정 했던 것이 병원 이었고, 특히나 율이가 나을때 쯤 에는 집 사람이나 율이가 아프면 내가 잘 대처할 수 있을 까 걱정이 많았는데.. 그냥 나의 기후로 만들어 준 게 너무 고마웠다.

율아.. 지금까지 별 탈 없이 잘 자라줘서 고마워...

아빠 엄마가 아직 미숙하지만.. 우리 율이 사랑 하는 마음은 세상 어떤 것과도 비교할 수 없단다.


노스웨일즈 김씨 가문의 Claire 율은 오늘도 무럭 무럭 잘 자라고 있다.






'사는이야기 > Claire' 카테고리의 다른 글

가을과 겨울 사이...  (0) 2016.12.15
2016년 여름 ( 세번째 여름 )  (0) 2016.08.18
2년 겨울  (0) 2016.02.09
2살 그리고 몇 개월 즈음  (0) 2015.09.11
율이 2살 즈음..  (0) 2015.05.27
Posted by headiron
,

팀을 옮기면서 익히기 시작했던 Chronos. 핵심은 Mesos에서 실행되는 App에 불과하지만 분명 좋은 Tool인 것은 부인할 수 없다. 근데 문제는 Mesos, Chronos 모두 패키징을 제공하지 않아서 사용자가 스스로 BUILD해서 사용해야 한다는 점이다. 그런 부분이 좋은 BIZ Model이 되었는지 MESOSPHERE라는 회사에서 MESOS, CHRONOS를 묶어 PACKAGING을 제공하고 있다.

회사는 CENTOS6 이어서 그에 맞추어 RPM을 설치 했고, GOOGLING을 통해서 /sbin/start , /sbin/stop, /sbin/restart command로 각 Daemon을 start/stop할 수 있게 되었다.

근데 최근에 start option을 일부 수정할 이슈가 생겼는데, 어디를 수정해야 하는지 모르겠다는 점이다.

/sbin/start{stop,restart}를 체크해 보니 결국 /sbin/initctl의 link들이고 아래 article을 보니 /etc/init에 각 daemon 관련 config를 읽어 온다는 정보를 알게 되었다.

http://serverfault.com/questions/489525/linux-how-to-pass-parameters-to-service-foo-start-at-command-line

결국 CHRONOS 실행 Script를 찾았는데... 이 Script에 재밌는 부분이 보인다.

function load_options_and_log {

  set -x

  # Load Chronos options from Mesos and Chronos conf files that are present.

  # Launch main program with Syslog enabled.

  local cmd=( run_jar )

  if [[ -s /etc/mesos/zk ]]

  then

    cmd+=( --zk_hosts "$(cut -d / -f 3 /etc/mesos/zk)"

           --master "$(cat /etc/mesos/zk)" )

  fi

  if [[ -d $conf_dir ]]

  then

    while read -u 9 -r -d '' path

    do

      local name="${path#./}"

      if ! element_in "--${name#'?'}" "$@"

      then

        case "$name" in

          '?'*) cmd+=( "--${name#'?'}" ) ;;

          *)    cmd+=( "--$name" "$(< "$conf_dir/$name")" ) ;;

        esac

      fi

    done 9< <(cd "$conf_dir" && find . -type f -not -name '.*' -print0)

  fi

  logged chronos "${cmd[@]}" "$@"

}


/etc/mesos/zk파일을 읽어 와서 HOST설정하는 건 알고 있었는데, CONF_DIR에 파일들에 대해서 --<파일NAME>=<파일CONTENT>형태의 OPTION을 설정해 주는 부분이 정말 흥미로웠다.

일단 CONF_DIR에 내가 필요한 옵션 이름으로 파일을 만들어서 CHRONOS를 RESTART해 보니 과연 해당 파일 내용을 읽어와서 대몬을 START시켜준다.

항상 느끼는 거지만 SHELL을 잘 사용하면 사용할 수록 개발자들의 편의성이 없어 지는 듯 싶다.

Posted by headiron
,

Cron 시스템을 설치 하고 난 후 한 참 후 Log파일을 보니, 

신기하게도 어떤 파일들은 Compress되서 5개 파일로 Rotate되는데 어떤 파일들은 그대로 남아 있다.

마침 궁금해 하고 있었는데 Jie가 로그가 많이 빨리 쌓이니 파일들을 Rotate해 달라고 한다.

일단 파일들을 보니 root계정으로 처리 되어 있어, root cron script를 보다 보니 특별한게 없다.

다른 사람들한테 물어봐야 하나 하고 있는데 예전에 OAS 일하면서 cron script가 /etc/cron.d 밑에도 등록될 수 있던게 생각이 나서 뒤져 보니 /etc/cron.d에 logrotate가 있고,
logrotate는 /etc/logrotate.conf 정보를 읽어 보고 있고, 최종적으로 /etc/logrotate.d/ 폴더를 읽어 오게 되어 있다.

grep으로 로그가 저장되는 폴더를 찾아 보니 드뎌 아래를 발견했다.

# cat /etc/logrotate.d/syslog

/var/log/corp/*.nzlog /var/log/corp/*.info /var/log/corp/*.warning /var/log/corp/*.crit /var/log/corp/*.notice /var/log/corp/*.err /var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron /var/log/kern {
    missingok
    copytruncate
    sharedscripts
    rotate 5
    size=5M
    compress
    postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

리뷰해 보니 일반적으로 시스템에서 log rotate하는 설정에 회사 관련 로그파일들을 넣었던 것이다.

생각해보니 형태가 시스템 파일들 로테이션 하는 것과 유사 했다.

덕분에 새로운 걸 알게 되었는데, 한편으론 아직도 왜 나는 "Why"라는 생각을 가지고 뭔가 파고들지 않을까 하는 자괴심도 든다.

뭐.. Googling을 해보니 꽤 괜찮은 Article도 보인다.

http://www.ducea.com/2006/06/06/rotating-linux-log-files-part-2-logrotate/



'개발자세상' 카테고리의 다른 글

JavaScript polling  (0) 2017.03.17
BoneCP DB Pooling  (0) 2016.11.22
Continuous Integration with Jenkins  (0) 2016.03.04
Hibernate interceptor  (0) 2015.05.20
Curl에서 SOAP API 사용하기  (0) 2014.05.07
Posted by headiron
,

Console 관련 업무를 시작하게 되면서 새롭게 경험하게 된 분야가 DevOps & CI 부분이다.

원래 계획은 어땠는지 모르겠지만, 

원준씨가 퇴사하면서 Chronos 부분을 인수인계 받아 진행하게 되면서 업무에 익숙해 지기도 전에 이 일을 맏게 되었다.

덕분에 지난 6개월 동안 Puppet, Jenkins, Stash 같은 여러 Tool들을 다뤄 보게 되었다.

뭐.. 어떻게 될 지 모르니 이 쯤에서 새로운 것들 정리해 보는 것도 좀 필요할 듯 싶다.

1.  Puppet

원준씨 퇴사하고 Chronos관련 업무를 맏고 나서 제일 황당했던 건 시스템을 Release하기 위해서는 Puppet Manifest를 작성해서 Production 에서 실행시켜야 한다는 거였다. 정말 황당했지만 뭐 어쩌랴. 덕분에 Puppet을 속성으로 공부해야 했고, 기존 API 시스템 Release용으로 작성되어 있던 Puppet Manifest를 수정해서 Chronos 용으로 사용하게 되었다. 업무를 하면서 어려웠던 건 선언적언어라는 패러더임과 AppNexus의 Coordination 시스템과의 연계 부분을 알게 되는게 많이 힘들었다.

2. Jenkins

예전에 대권이 Jenkins를 처음 소개 했을 때는 좋은 툴이라는 생각, 그리고 관련 업무는 대권에게 다 맞겼었다.

근데 Chronos 에 올라가는 Application들은 내가 관리하게 되니 해당 Application관련 Jenkins Job은 내가 다 작성해야 했다.

다행히 지금까지는 API팀에서 사용하던 코드들이 넘어 오는 상황이라 API팀이 작성했던 Jenkins Job을 Copy해서 시스템에 적용해 나갔다.

근데 Jie가 Master뿐만아니라 개발 branch의 update시에도 실행되는 Jenkins  Job을 작성해 달라 한게 좀 Research가 필요했다.

우선 Jenkins의 branch부분을 *으로 처리해서 Job을 등록했더니 git checkout시 계속 문제가 생겼다.

알고 보니 Jenkins  Git Repositories 부분의 Repository Name을 비어놓았더니 Jenkins가 remote 이름을 아무이름이나 부여해서 ${GIT_BRANCH}에서 나오는 origin/<branch name>을 인식하지 못하는 것이었다.

Source Code Management -> Git -> Repositories -> Advanced -> Name을 "origin"으로 수정하고 나니 우선 문제 해결.

이제는 master를 제외한 나머지 branch에 대해서만 실행하는 방법을 찾아야 했는데 찾아 보니 하나의 Article이 나왔다.

http://stackoverflow.com/questions/21314632/how-to-exclude-git-branch-from-building-in-jenkins

Source Code Management-> Git 부분의 전체 정보를 master에 맞추어 작성하고, Additional behavior에 Inverse 를 선택해주면 master이외에 다른 branch에 대해서 실행이 된다는 것이다.

나름 테스트 해보니 master제외한 다른 branch에 대해서 실행은 되는데 코드가 수정이 되지 않아도 Polling Schedule시점에 마지막으로 실행되었던 branch기준으로 계속 테스트가 실행이 되는 것이다.

그래서 곰곰히 Help Doc을 읽어 보니 branch부분이 정규식을 지원한단다. 

그럼 master를 제외하는 정규식을 설정하면 되겠다 싶어서 :^(?!.*master).*$ 를 넣어 보고 테스트 해보니 master이외의 branch가 Update될때 잘 실행이 된다.


결론적으로 master이외의 branch에 대해서 Auto test를 수행하려면 

1. Source Code Management 의 Git설정시 Name부분을 origin으로 설정하고, 

2. Branches to build를 :^(?!.*master).*$ 로 

3. Build Trigger -> Poll SCM 부분을 H/3 * * * *으로 설정하게 되면 

Jenkins가 3분마다 git을 Polling하여 수정된 branch가 있을 경우 해당 branch에 대해서 Jenkins job을 수행하게 된다.



3. Stash Jenkins연동

기존 코드의 Migration이 어느정도 진행이 되자 Jie가 이젠 master branch업데이트 되는 걸 PR로만 진행할 수 있게 하자고 한다.  당연히 할 일이긴 한데, PR할때 Test를 실행하게 해달라고 한다.

생각해보늬 DevOps가 Puppet manifest수정  자동 승인시 Jenkins build진행시키는게 생각이 나서  corpwiki와 DevOps팀의 Jenkins Job을 참조해서 아래와 같이 진행했더니 PR이 생성시  Jenkins Job을 실행 할 수 있게 되었다.

1. Stash설정 - Stash의 Project 설정의 Hooks화면의 "Stash Webhook to Jenkins"를 설정한다.

2. Jenkins

   Git의 Refspec부분을 +refs/pull-requests/*/from:refs/remotes/origin/pull-requests/*/from +refs/heads/*:refs/remotes/origin/* 로 설정하고, Post Build Actions에 Notify Stash Instance를 설정하면  PR 생성시  Jenkins job이 실행되고 결과도 PR로 전달된다.




개발 관련되서는 많이 공부하고 있었으면서도 CI/CD에 대해서는 조금 뒤쳐저 있었었는데 이번에 Chronos관련 업무를 맞게 되면서 많은 것을 공부하게 되어서 나름 유익한 경험이었다.

미리 좀 준비 할 여유가 있었다면 더 좋았을 텐데 말이지만...

'개발자세상' 카테고리의 다른 글

BoneCP DB Pooling  (0) 2016.11.22
Rotating Linux Log file  (0) 2016.03.10
Hibernate interceptor  (0) 2015.05.20
Curl에서 SOAP API 사용하기  (0) 2014.05.07
자바?  (0) 2011.04.01
Posted by headiron
,


볼티모어 아쿠아리움에서 사온 돌고래 인형이 어느덧 우리 율이의 좋은 친구가 되었다.

지금도 가끔 피시피시 얘기하는 걸 보면 참 잘 다녀왔다는 생각이 든다.

평소 주말처럼 YMCA에 수영을 배우러 갔더니 산타 할아버지 사진 찍는 행사를 했다.수업을 끝나고 사진 찍어야지 했는데, 행사는 끝났고 사진 찍는 배경은 남아 놨기에 마침 받은 수료증을 가지고 한번 찍어 봤다.

올 겨울도 Longwood Garden  Lightening구경으로 GoGo... 

처음 봤던 작년 만큼은 덜 하지만 그래도 역시 참 멋있다는..



눈 오는 날에 필리 시내 레스토랑에 놀러 갔다가 소화도 시킬 겸 Love Park에서 사진 한 컷.
갈때마다 사람들이 많아서 몰랐는데 알고 보니 Love상이 벤자민 플랭클린 로드 방향으로 설치 되어 있었다.



이번 겨울도 어김없이 폭설이..
주말내내 일기예보 보느라 TV보고... 그리고 삽질..
남들은 군대서 하는 삽질을 나는 40이 넘어서 하고 있다니..-.-
나중에 집 사면 Snow blower를 꼭 사야지..

뭐.. 암만 4시간 동안 삽질 하는라 힘들어도 썰매 타는 즐거움을 빼먹을 수는 없지..

영미누나가 친구 편으로 보내주신 한국 어린이 책...
율이가 잘 읽고 인형도 너무 좋아해요. 매번 고마워요 누나




동네 몽고메리몰 놀이터... 겨울에 처음 알게 됐는데.. 비 오는 날은 자주 가게 된다.



날이 따뜻해 져서 찾아왔던 몬다욱 공원.
이젠 율이도 버블 놀이를 제법 잘 한다는...





'사는이야기 > Claire' 카테고리의 다른 글

2016년 여름 ( 세번째 여름 )  (0) 2016.08.18
세살 즈음에  (0) 2016.06.04
2살 그리고 몇 개월 즈음  (0) 2015.09.11
율이 2살 즈음..  (0) 2015.05.27
율이 2살 기념 Puerto Rico 여행  (0) 2015.05.05
Posted by headiron
,

몇 년동안 일하면서 항상 하고 싶었지만 해보지 못했던 일중에 하나가 RPM 파일을 만드는 거였다.

일단 시간도 없었고.. ( 게으르다고 해야 할 까 .. ) 그리고 개발쪽 관련 공부에 집중하다 보니..

근데 이번에 원준씨가 이직하면서 본의아니게 Cron시스템을 인수인계 받아 진행하다 보니 RPM을 만드는 일이 생겼다.

일단 PUPPET관련해서 작업 끝내고, SYSOPS가 시스템까지 구축해준 상태에서 최종 확인을 하다 보니 새로운 RPM을 설치하는 게 진행이 되지 않는 것이었다. 시스템 문제인가 생각했는데, 잠시 시간 날때 확인해 보니 내 PUPPET에 문제가 있었다.

그래서 PUPPET을 고치고 새로운 RPM을 설치해 보니 RPM은 설치 되었다고 나오는데 설치되어 있어야 할 파일들이 없다. PUPPET을 이리저리 바꿔보고 했는데도 되지 않고... 시간 만 보내고 있는데 불연듯 RPM이 잘못 된건 아닐까 생각이 든다.


그래서 spec파일을 검토해 보고 googling을 해보니 아래 article이..

내용은 RPM에서 spec파일에 선언되어 있는 명령문들은 아래 순서 대로 실행된단다.
 1. %Pre of new package
 2. %Post of new package
 3. %Preun of old package
 4. %Postun of old package
http://stackoverflow.com/questions/7398834/rpm-upgrade-uninstalls-the-rpm

마침 나는 api spec파일을 copy하면서 Postun섹션을 넣었는데... 이게 실행이 되면서 설치 폴더들이 다 지워 지는 것이었다.api는 multi version을 위해서 rpm설치할 때 해당 version을 폴더 경로에 넣어서 uninstall도 하지 않지만 하더라도 해당 버젼 폴더만 지우니 문제가 없는 것이었다. 

나도 지금이라도 버젼을 넣어서 처리 할 까 생각하다가 어차피 자바로 포팅하기 까지만 지금 구조로 갈꺼니깐 없어 진 파일 패키지에 남아 있다고 해서 큰문제는 생기지 않을 듯 싶다.

흐미... SPEC파일에 대해서 조금만 봤어도 하지 않았을 실수 때문에 거의 하루를 날려버리게 되다니..

COPY를 하더라도 정확히 이해하고 해야지.. 그리고 다음에는  RPM만들떄 꼭 버젼을 고려해야 겠다.

결국 %Postun을 없애고 나니 RPM삭제이후에도 파일들은 시스템에 남아 있게 되는거 아닌가...


Posted by headiron
,

그동안 주로 EJB로 개발하다보니 Mockup테스트를 알고 있으면서도 사용하지 못했었는데 Cron Project를 진행하면서 사용하게 되었다. 알고 있는지는 10년은 된것 같은데 이제서야 쓸 생각을 하다니..

일단 시작은 Mockito를 사용해서 Mock객체를 생성해서 테스트를 진행해 보았다.

http://mockito.org

쓰는 방법은 간단했다.

mock(new ObjectO))를 실행하면 헤당 Object의 method를 실행할 수 있는 Mock객체가 생성된다. 

그 후에 when()등의 메소드를 사용하여 특정 메소드가 호출 될 경우 특정 결과를 Return하게 하도록 한후,

해당 Mock객체를 실제 객체에 Wiring하고  

객체 메소드를 호출하면 Mockup객체에 등록된 메소드에 따라 결과가 Return되고, 이를 통해서 실제 객체가 잘 실행되는지를 확인하게 되는 것이다.


처음 Mock을 사용할 때 when()메소드로 선언하는거 이외에는 원래 객체의 메소드를 호출하는 걸로 오해하고 진행을 해 보니  Mock객체는 객체의 메소드들을 가지고 있는 정말 Mockup객체일 뿐이었다.

특정 메소드 이외에 다른 메소드는 원래 코드를 실행하게 하기를 원할 경우는 mock()이 아닌 spy()를 사용해야 한다.


마침 내가 개발하는 코드가  Method가 여러개이지만,  각 Method가 다른 API를 호출하는 형태에서 API호출하는 부분을 별도의 private  메소드로 추출했고, 해당 부분을 spy() 하게 되면 외부 API를 사용하는 코드도 테스트 할 수 있게 될 듯 했다.

근데 문제는 Mockito는 private메소드에 대해서는 spy()를 진행할 수 없었다.

그래서 Search를 해보니 PowerMockito를 사용하면 private 메소드를 spy()할 수 있다고 한다.

일단 pom.xml에 PowerMockito dependency를 등록하고, 

<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-easymock</artifactId>
<version>1.6.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.3</version>
<scope>test</scope>
</dependency>

import org.powermock.api.mockito.PowerMockito;
...

@

Connector mockConnector = PowerMockito.spy(connector);

....

@Test

public void testThirdPartyConfig(){

PowerMockito.doReturn(configJsons).when(mockApiConnector, "list",
"thirdparty-config", queryParam);
FacebookConfig config = mockConnector.getThirdPartyConfig();

참고로 내가 테스트 하려는 코드를 connect.getThirdPartyConfig 메소드이고, getThirdPartyConfig는 connect.list("thirdparty-config",queryParam) 메소드를 호출하여 외부 API를 호출하고, 그 결과를 파싱해서 사용자에게 객체로 리턴해준다.따라서 list메소드를 spy하면 외부 API를 호출하지 않고 getThirdPartyConfig메소드가 잘 실행되는지 확인할 수 있는 것이다.


잘 되기는 하는데 private메소드에 대해서는 좀 이상하게 실행이 되어서 Abstract메소드를 protected로 변경했더니 잘 싱행이 된다. 

그리고 진행을 하다 보니 PowerMockito가 Mockito를 사용하는 Test보다 훨씬 느리다.

서치를 해보니 내부적으로 객체 생성을 많이 한다고, 가능하면 Mockito를 사용하라는 걸 보니 , 이게 좀 문제 인듯 하다.


성능 부분을 제외한다면, PowerMockito가 꽤 괜찮은 솔루션으로 보인다.




'개발자세상 > 자바세상' 카테고리의 다른 글

POI로 Pivot테이블 만들기  (0) 2017.11.28
Scala  (2) 2016.06.16
java.lang.OutOfMemoryError: unable to create new native thread  (0) 2015.08.15
Control character in XML  (0) 2014.05.28
jboss db pooling timeout  (0) 2014.03.01
Posted by headiron
,
열흘 간의 윈터 브레이크를 가족과 즐기며 파란 만장 했던 2015년을 마무리 해본다.

올해를 시작하면서 OAS acquision이 이렇게 많은 일을 겪게 할 줄은 미쳐 예상하지 못했는데...

연초부터 본의아니게 팀장 아닌 팀장역활을 하다가... 다시 팀원으로 강등..

그리고 다른 부서로의 Transition.

덕분에 8년 넘는 시간을 함께 했던 OAS 와는 작별을 고하게 되었고, 다시 PHP로 돌아 갔지만,

Continuous Delivery, Scala, Play, Puppet등 그 동안 해보지 못했던 많은 것들을 새롭게 해 볼 수 있게 되었다.

일주일에 이틀간 뉴욕에서 일하게 되면서, 집 사람은 조금 힘들었지만, 

덕분에 나는 공부할 수 있는 시간을 많이 가질 수 있게 되었다. 

뭐... 5일 정도 무료로 숙박할 수 있는 호텔 포인트는 그에 대한 보상이라고나 할까..


생각해 보니 미국에서 지낸 5년 동안 한국 다녀오는 것 말고는 여행을 못 했었는데,

올해는 푸에르토리코, 워싱턴도 다녀오며 

좀 힘들었어도 나름 즐거운 추억들을 만든 것 같다.


2016년은 어떤 일들이 나를 기다릴 지 모르겠으나,

적어도 지금보다는 좀더 나의 Spectrum도 넓어 지고, 

우리 식구 행복하게 살 수 있는 보금자리와 이제는 미국 밖의 새로운 곳을 경험해 보는 그런 한해가 되었으면 한다.


아디오스 2015


'사는이야기' 카테고리의 다른 글

2017년 후반기  (0) 2018.01.03
Past 10 years, Next 10 years  (0) 2017.10.27
RIP N1, Good bye OAS  (0) 2015.09.04
부활  (0) 2014.04.21
재준이 침대  (1) 2013.03.18
Posted by headiron
,