2020년 12월 17일 목요일

modelmapper memory leak

최근 추가한 코드를 테스트하는 개발서버에서 아래의 에러 메시지가 발생했다.


java.lang.OutOfMemoryError: Direct buffer memory
        at java.nio.Bits.reserveMemory(Bits.java:694)
        at java.nio.DirectByteBuffer.(DirectByteBuffer.java:123)
        at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
        at io.netty.buffer.UnpooledUnsafeDirectByteBuf.allocateDirect(UnpooledUnsafeDirectByteBuf.java:111)
        at io.netty.buffer.UnpooledUnsafeDirectByteBuf.(UnpooledUnsafeDirectByteBuf.java:68)
        at io.netty.buffer.UnsafeByteBufUtil.newUnsafeDirectByteBuf(UnsafeByteBufUtil.java:626)
        at io.netty.buffer.UnpooledByteBufAllocator.newDirectBuffer(UnpooledByteBufAllocator.java:65)
        at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:179)
        at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:170)
        at io.netty.buffer.AbstractByteBufAllocator.ioBuffer(AbstractByteBufAllocator.java:131)
        at io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator$MaxMessageHandle.allocate(DefaultMaxMessagesRecvByteBufAllocator.java:73)
        at io.netty.channel.socket.nio.NioDatagramChannel.doReadMessages(NioDatagramChannel.java:243)
        at io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe.read(AbstractNioMessageChannel.java:75)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:642)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:565)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:479)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:441)
        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
        at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
        at java.lang.Thread.run(Thread.java:748)



추가한 부분은 udp 클라이언트 용도의 프로그램이었다. 


소스를 분석해 봤지만 문제되는 부분을 알 수 없었다.


visulavm을 이용해 모니터링을 해봤더니, classes의 Total loaded 개수가 계속 증가하면서, Metaspace 영역이 계속 증가하는 현상을 확인했다.

dump를 받아서 mat 프로그램으로 분석했다. 잘 사용할 줄은 몰랐지만 대충 보다 보니 modelmapper가 보인다. 뭐지...


'modelmapper 성능 이슈'로 검색해 봤더니, 이런 글을 찾았다. 


설마 하는 생각으로 modelmapper 부분을 제외했더니, 정상적으로 돌아왔다.


modelmapper는 예전부터 web 프로젝트에서 많이 사용했었기 때문에 이런 문제가 발생할 줄 몰랐다.


'modelmapper memory leak'으로 검색해서 더 알게 된 정보는 modelmapper는싱글톤으로 구성하여 사용하라는 것이다.


modelmapper를 많이 사용하지 않았기 때문에 전부 걷어내고 직접 지정하는 방식으로 변경했다.


이런 문제가 한 번 생기고 나니 modelmapper를 다시 사용하기 꺼려진다.


modelmapper memory leak으로 찾아 본 글

https://www.programmersought.com/article/1444628366/
https://better-dev.netlify.app/java/2020/10/26/compare_objectmapper/
http://modelmapper.org/user-manual/faq/
https://github.com/modelmapper/modelmapper/issues/375

2020년 12월 5일 토요일

오라클 접속이 되다 안되다 하는 현상.

스프링 기반으로 만든 소스에서 오라클 접속이 로컬에서 개발 할 때는 잘 되었다. 
문제는 개발서버에서는 연결 자체가 안됐다. 아예 안 되는 건 아니고, 가끔 연결이 될 때도 있었다. 
오류메시지가 연결되지 않은 것에 대한 메시지만 나오니 이 에러메시지로는 해결책을 찾기가 어려웠다.
이것저것 여러가지를 적용해 봤지만, 해결이 안 됬다. 다음날 다시 검색 시작. 해결법을 찾았다.

해결법은 이거였다.
-Djava.security.egd=file:/dev/./urandom
리눅스에서 오라클 jdbc 드라이버는 기본적으로 random 을 사용하는 데, random은 서버의 엔트로피를 사용하여 random 값을 생성한다고 한다. 여기서 엔트로피란 서버의 노이즈라고 한다.
노이즈는 서버의 디스크 읽기, 키보드 입력, 네트워크 패킷등이라고 한다.
random은 이런 엔트로피가 일정조건까지 채워져야 값을 생성해 준다고 한다. 이 기다림이 문제 였다. 반면 urandom 일정조건을 채우지 않고도 바로 값을 준다고 한다.

잘 이해가 안 가서 검색을 하니, 잘 정리된 블로그가 있었다.

역시 검색을 하려고 해도 뭘 알아야 검색을 할 수 있다.

결국 옵션 하나로 해결한 문제였지만 문제의 원인을 알 수 없을 때는 꽤 골치 아픈 문제였다.

2020년 10월 22일 목요일

ORA-12528, TNS:listener: all appropriate instances are blocking new connections.

 1. 오라클 접속 하려고 했더니 아래와 같은 에러 발생.


oracle.net.ns.NetException: Listener refused the connection with the following error:

ORA-12528, TNS:listener: all appropriate instances are blocking new connections.


2. 오라클 서버에 접속해서 리스너 상태 확인.

lsnrctl stat


상태가 BLOCKED로 나옴.

Instance "orcl", status BLOCKED, has 1 handler(s) for this service...


3. sqlplus 접속해서 오라클 재시작. ORA-00205 에러가 난다.

SQL> shutdown abort;

ORACLE instance shut down.

SQL> startup;

ORACLE instance started.

...

Total System Global Area 1.0133E+10 bytes

Fixed Size     3721272 bytes

Variable Size 1778386888 bytes

Database Buffers 8321499136 bytes

Redo Buffers    29831168 bytes

ORA-00205: error in identifying control file, check alert log for more info

...



4. alert log 확인. alert log의 기본위치는 아래와 같다.

10g 이하는 $ORACLE_BASE/admin/$ORACLE_SID/bdump

11g부터는 $ORACLE_BASE/diag/rdbms/'DATABASE NAME'/$ORACLE_SID/trace



아래와 같은 에러 확인.

Wed Oct 21 17:55:04 2020

starting up 1 dispatcher(s) for network address '(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))'...

starting up 1 shared server(s) ...

ORACLE_BASE from environment = /home/oracle/app

Wed Oct 21 17:55:04 2020

ALTER DATABASE   MOUNT

Wed Oct 21 17:55:04 2020

ORA-00210 : cannot open the specified control file 

ORA-00202: control file: '/oradata/oradata/mydatabase/control01.ctl'

ORA-27086: unable to lock file - already in use

Linux-x86_64 Error: 11: Resource temporarily unavailable

Additional information: 8

ORA-205 signalled during: ALTER DATABASE   MOUNT...

Wed Oct 21 17:55:07 2020

Using default pga_aggregate_limit of 6440 MB


5.

/oradata 위치는 nfs로 연결된 스토리지이다. 

/oradata/oradata/로 이동해서 파일 권한, 소유자 확인 했지만, 이상없음.

파일생성, 삭제, 수정 해봤지만, 정상임.


6.

에러 원인 확인 불가. 해결법은 찾음.

해결법은 에러가 나는 control01.ctl 파일이름을 변경 후 다시 원래 이름으로 복사.

오라클 중지 후 작업한다.

mv control01.ctl control01.ctl.bak

cp control01.ctl.bak control01.ctl


오라클 시작.

control01.ctl의 에러는 사라졌지만, /oradata 위치의 몇몇 파일들이 같은 문제를 일으킴. 역시 위와 같은 방식으로 다시 처리.


정상화 완료.


파일 디스크립터가 어떤 이유로 스토리지에서 열린 상태로 유지되어 발생하는 오류로 보인다. 아마도 네트워크에 뭔가 문제가 생겼을 때, 그냥 끊어져 버린게 아닌가 싶다.





2020년 10월 15일 목요일

버팀목전세자금 대출, 목적물 변경 및 증액 상담 내용.

 최근 직장을 옮기고, 직장 근처로 이사를 위해 집을 알아 보고 있다. 전세로 가기 위해 준비하고 있으나, 내 예산안에 맞는 집을 찾기가 어렵다. 검색해 보다, 기존 전세대출을 목적물 변경과 증액을 이용하는 방법을 찾았다.

목적물 변경은 이사를 하게 되는 집을 바꾼다고 보면 되고, 증액은 기존 대출금에서 더 대출을 요청한다고 볼 수 있다.


인터넷으로는 알아보는 정보에 한계가 있고, 제대로된 정보를 얻기 위해 실제 은행에서 대출상담을 받았다.

내가 알아본 은행은 우리은행이다. 기존에 우리은행을 통해서 버팀목전세자금 대출을 받고 있었다.


대출 상담 내용을 요약하면 이렇다.

1. 1금융권은 재직 3개월이상만 대출이 가능하다고 한다.

2. 대출 증액은 계좌가 새로 생성되는 개념으로 버팀목전세자금 대출의 자격요건을 다시 본다. 증액을 받을 시 자격요건이 맞지 않으면 대출이 안된다.

3. 목적물 변경은 기존 계좌를 사용하는 개념으로 자격요건을 다시 보지 않는다.

4. 대출금을 갚으면 갚은 한도 만큼만 목적물 변경시 다시 대출이 가능하다. 예를 들어 처음 버팀목전세자금 대출을 받을 때, 1억을 대출 받고 도중에 6천을 갚으면, 목적물 변경시 적용되는 대출금은 4천이다. 나가는 이자를 조금이라도 줄이기 위해 대출금을 중간에 조금 갚은 게 오히려 독이 됐다.


결국은 기존에 살던 집의 전세를 넘는 집으로는 가기 어려울 것 같다.


목적물 변경만을 위해 필요한 준비물 및 순서는 다음과 같다.

1. 이사 이후에 전입신고를 한다.

2. 주민등록등본과 확정일자를 받은 임대차 계약서, 등기부 등본을 가지고 은행을 방문하여 신청한다.

3. 처음 대출을 받은 지점과 다른 지점인 경우 필요서류를 해당 지점으로 보내서 처리한다고 한다.


ps . 완료 시점에 가족관계증명서를 제출 요청함. 등기부 등본 제출할 때 같이 제출하면 좋을 듯 하다.

2020년 9월 25일 금요일

Elasticsearch SQL parsing_exception

 엘라스틱서치에서 sql로 쿼리 실행시 특수문자가 들어간 경우 parsing_exception 에러가 난다.

이럴 때는 \" 를 사용하면된다.


ex>

{
    "query" : "select * from \"my.data.day.20200925\""
}

2020년 9월 16일 수요일

사이드 프로젝트는 성취감입니다.

 최근에 이동식 에어컨을 팔았다. 올리자마자 여기저기서 연락이 온다. 대충 비슷하게 시세 알아보고 올리는 데도 항상 너무 싸게 올리는 것 같다. 내가 생각하는 가격에 조금 더 비싸게 올려놓고, 안 팔리면 조금씩 가격을 내려야 하는데, 자꾸 잊어먹는다. 나는 장사 체질이 아닌가 보다. 

파이썬을 배운 김에 뭔가 하나를 만들어 보자는 생각에 중고가격을 한눈에 알아보는 사이트를 만들었다. 중고가격을 책정하는 데에 도움이 되는 사이트가 있으면 좋을 것 같았다. 찾아보니 비슷한 사이트가 없었다. 

중고 가격은 네이버 카페 중고나라에서 가져왔다. 처음에는 크롤링을 하려고 했으나, 네이버 카페 글 검색 api가 있었다. 내가 딱 원하는 api는 아니지만, 가공하면 쓸만한 정보를 얻을 수 있었다. 다 만들고 나니 꽤 그럴듯했다. 그래서 이왕 하는 김에 공부도 할 겸 Vuejs로 프론트도 만들었다. 프론트도 다 만들고 나니 아예 오픈하는 것도 나쁘지 않은 것 같았다. 그래서 도메인도 사서 연결했다. 서버는 AWS 1년 free 서버를 사용했다.

그래서 완성한 사이트가 바로 www.findusedprice.com 다. 많은 애용바란다.  

도메인 만료. 사이트 중단...


사이트를 열고 보니 크롬에서 안전하지 않은 사이트로 뜨는 게 마음에 걸린다.  ‎Let's Encrypt를 이용해서 SSL까지 적용했다.

이것저것 검색해 보니 가격이 완벽하지가 않다. IX940 같은 모델명으로 검색하면 정확한 데이터가 나오지만, 광범위한 검색은 제대로 된 가격을 얻기가 힘들다. 제외 키워드를 넣어서 그나마 조금 더 괜찮은 데이터가 나오도록 했다.

도메인은 3년짜리를 사면 할인을 해 주는데, 3년까지 저 서비스가 남아있을 것 같지가 않다. 일단 1년으로 했다. 구글 애널리틱스를 붙였다. 도메인 만료 전까지 사용자가 어느 정도 있으면 연장을 하고 거의 없으면 그대로 사장 시킬 예정이다.

최근에 취업하게 되어 출퇴근하고 있다. 출퇴근한다는 거 자체가 별거 아닌 거 같지만 꽤 힘들다. 정시 퇴근을 하고 집에 와도, 씻고 밥 먹고 조금 TV보고 하면 금방 잘 시간이다. 밥 먹으면서 졸기도 한다. 그 잠깐 시간하고 주말에 시간을 내서 완성하고 보니, 뿌듯함이 생긴다. 이래서 작은 일이라도 끝내는 일이 중요하다고 하나 보다.


2020년 9월 6일 일요일

변기 배관 막힘

 변기가 막혔다. 음식물 쓰레기를 잘못 버린 게 문제였다. 혼자 사는 지인의 집에 갔을 때, 음식물 쓰레기를 변기로 처리하길래 좋은 방법이라고 생각했다. 멍청한 생각이었다.

나흘 동안 변기를 뚫기 위해 온갖 방법을 다 동원했다. 그간의 노력을 기록으로 남긴다.


1. 페트병

예전에 한 번 뚫었던 적이 있어서 시도했으나, 이번에는 잘 안 됐다. 막힘의 정도가 달랐다.


2. 뚫어펑

다이소에서 샀다. 1,000원이다. 안된다. 뚫어뻥은 고무가 얇은 게 잘 뒤집어지지 않아 좋다고 한다. 다이소에서는 한 가지밖에 없었다.


2. 뚫어펑 액체

액체를 붓고 30분 정도 지나 물을 내려 확인했으나 그대로였다. 자기 전 부어 넣고, 아침에 확인했으나 역시 그대로였다.

0.5L를 넣으라는 걸 1L로 넣은 거였는 데도 그렇다.


3. 철사 옷걸이

절대 안 된다. 이걸로 된다는 사람들은 도대체 어떻게 했다는 건지 모르겠다.


4. 세제와 뜨거운 물

역시 안된다.


5. 미스터 펑

거금 5만 원을 주고 샀다. 이전 버전이 3만 6천 원 정도인데, 나중을 위해 올인원이라는 신형을 샀다. 택배를 받은 후 기쁜 마음으로 도전했다.

참패다. CO2가 2박스가 같이 오는데, 한 박스에 10개가 들어 있다. 11개를 썼지만, 안됐다. 댓글 간증을 너무 믿었다.

구멍을 막는 고무가 작다. 물이 튄다. 한 박스를 다 써도 안되니 더는 시도해 볼 용기가 나지 않는다. 한 박스면 6천 원이다.

중고나라 행 결정이다.


6. 관통기

나의 구세주. 철물점에서 9천 원에 샀다. 온라인에서는 5천 원 정도다. 배송비 생각하면 비슷한 가격이다. 관통기 역시 처음에는 안됐다. 땀을 삐질삐질 흘리며 힘써 봤지만, 안됐다.

거의 자포자기였다. 업체에 예약을 하고 혹시나 하는 마음으로 다시 시도했다. 됐다. 물이 내려가는 게 믿기지 않았다.

다시 한번 확인했다. 물이 잘 내려간다. 이때의 카타르시스는 뚫어 본 사람만 안다. 모든 방법을 다 동원하고 자포자기하고 있을 때 뚫리는 순간의 기쁨을 모를 것이다.


변기 막힘으로 인한 검색으로 참 많은 걸 알게 되었다. 대표적인 게 비데용 물티슈라는 거다. 물에 분해 되는 성분으로 만들었다고 한다. 이게 다 마케팅이다. 내가 쓰고 있는 물티슈 역시 물에 녹는 재질이라고 했다.

실험해 봤다. 컵에 수돗물을 받고 물티슈를 넣고 1시간을 기다렸다. 티슈는 전혀 분해 되지 않았다. 믿을 게 하나도 없다.

얼마나 많은 사람이 변기에 음식물 쓰레기를 버리는지 알게 됐다. 음식물 쓰레기는 쉽게 분해 되지 않기 때문에 배관이 막히는 원인이 된다. 변기에는 변과 휴지만 넣기로 다짐했다.

2020년 8월 30일 일요일

자동 출첵 파이썬 프로그램 cron 등록

 개인적으로 시놀로지를 사용하고 있다. 이전에 만든 자동 출첵 프로그램을 주기적으로 실행하기 위해 시놀로지에 도커를 사용해 centos를 설치했다.

centos를 설치 하고 나서는 파이썬 환경을 설치했다.

스크립트 실행은 cron을 사욯했다.

파이썬 환경 설치가 생각만큼 쉽지는 않지만 크게 어렵지도 않은 정도이다.

일단 사이트 2개만 스크립트 만들어서 사용중인데, 조금 더 늘어나면 구조화 시켜야 할 듯 하다.


2020년 8월 28일 금요일

파이썬으로 지마켓 자동 출석 체크

 파이썬을 어디다 쓸까 생각하다 보니, 자동 출석 체크가 역시 만만했다.

예전에 casperjs를 통해 11번가 자동 출첵을 만들었었는데, 지금은 지마켓을 이용하고 있어서 새로 만들었다.

지마켓의 룰렛을 클릭하는 데, NoSuchElementException 아래와 같은 에러가 났다.

확인해 봤더니, 룰렛만 iframe으로 되어 있어서 찾지 못하는 현상이 있었다.

그래서 iframe으로 바꿔줘야 한다.

iframe 이름이 'AttendRulletFrame'이고, //*[@id="wrapper"]/a 이 룰렛 클릭 버튼의 xpath다.


  
  WebDriverWait(driver, 10).until(
    EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//iframe[@id='AttendRulletFrame']")))

roulette_btn = driver.find_element_by_xpath('//*[@id="wrapper"]/a')
roulette_btn.click()


iframe으로 바꾸면 잘 된다.

2020년 8월 26일 수요일

행복한 삶

 사람은 왜 사는 가에 대한 질문은 사춘기 시절 이후부터 마음 한쪽에 남아있던 오래된 질문 중 하나이다. 그것에 대한 법륜스님의 답변이 꽤 마음에 들었다.

'사람은 그냥 사는 것이다'. 저기 굴러다니는 돌멩이와 내가 하등 다를 바가 없는 존재라고 한다. 이런 이야기에 동의하지 못하는 사람도 있겠지만 나에겐 큰 깨달음으로 다가왔다. 이 말씀은 큰 우주를 보면서 느끼는 감정과 꽤 닮아있다.




보이저 1호가 태양계를 벗어나며 찍은 지구의 모습을 '창백한 푸른 점'이라고 부른다. 이 사진을 보면 지구는 단지 하나의 희미한 푸른 점의 모습을 띠고 있다.

우주에는 관측 가능한 은하로만 약 1,700억 개가 있고 하나의 은하에는 1,000억 개의 항성이 존재한다고 한다. 그중 하나의 은하에 태양계라는 작은 변두리에 우리가 사는 지구가 있다.

사람은 저 큰 우주의 시선으로 보면 정말 티끌보다도 작은 존재란 것을 느낀다. 그러나 사람은 티끌보다도 작은 지구에서 치열하게 살아간다. 사람은 그냥 산다는 말에는 산다는 것은 아무 목적이 없다는 뜻이 있다. 사람은 아무 목적 없이 살 수 있다. 그러나 또 한편으로는 살아가는 의미조차 자신이 만들 수 있는 자유가 있다. 내가 사는 동안 나만의 삶을 내가 만들 수 있는 자유가 있다.


예전에는 행복이라는 의미를 너무 크게 두었다. 기쁜 일이 있을 때만 행복하다고 생각했었다. 그러나 어느 순간 불행하지 않은 삶이면 행복한 삶이란 것을 알게 되었다. 행복의 기준을 낮추면 하루하루가 행복이라는 것을 느낄 수 있다.

많은 사람이 자유롭고 행복한 삶을 꿈꾼다. 행복하게 사는 삶은 걱정이 없다. 과거에 연연하지 않으며, 미래를 걱정하지 않고 오롯이 현재에 충실한 삶을 살 때 행복은 있다.


2020년 8월 24일 월요일

뜨는 언어 파이썬

최근 구직사이트를 열심히 보고 있다. 그중 의외로 많이 보이는 언어가 node.js와 파이썬이다.
그 중 파이썬과는 조금 인연이 있었다. 서버 관리를 하던 시절 서버 프로그래밍으로 잠깐 펄과 파이썬을 살펴보았다. 그러나 펄이나 파이썬은 대부분 필수로 설치가 되어 있지 않아, 고객사 서버에 함부로 설치하기가 어려웠다. 그래서 대부분 쉘스크립트로 처리했었다.
2020년 파이썬은 Java, C 다음으로 인기있는 언어 3위라고 한다. 파이썬을 공부해보기로 했다. 
파이썬을 조금 배우고 느낀점은 굉장히 쉽다는 거다. 기본적인 프로그래밍을 아는 사람이면 쉽게 배울 수 있다. 초보자가 배우기에도 적당한 것 같다.
그리고 파워풀하다. 웬만한 라이브러리는 대부분 다 있다. 자동로그인 후 자동출첵, 엑셀 제어, 파일 제어등 내가 원하던 기능들을 단 몇 줄이면 개발이 가능하다.
나는 유틸성 프로그램을 만드는 걸 좋아한다. 반복되는 업무는 웬만하면 프로그램으로 만들어 쓰길 좋아한다. 그런데 파이썬이 이런 면에서는 딱 맞은 것 같다.

구직사이트를 보던 중 RPA(Robotic Process Automation) 개발자를 구한다는 구직을 보게 됐다. RPA가 뭔가 싶어 검색을 해보니, 반복되는 작업을 자동화해주는 솔루션이다. 내가 반복되는 업무가 싫어서 개발했던 프로그램을 솔루션의 차원으로 승화시킨 것 같았다. 나한테 잘 맞는 업무라 생각해서 나도 모르게 지원을 했다. 그러나 내 경력이랑 다르므로 연락 올 일은 없을 것 같다. 어쨌든 이런 솔루션이 있다는 것을 알게 된 것만으로도 큰 소득이다. RPA 역시 한 번쯤 공부해 두면 좋을 것 같다.

2020년 8월 21일 금요일

팀장의 어려움

경력이 10년을 넘다 보니, 최근에는 팀장 자리를 많이 제시한다. 팀장은 첫 회사에서 한번 해봤다.

당시 회사는 전체 직원 6명인 업체였고, 내 위가 다 나가서 내가 팀장을 맡게 됐다. ㅡ.ㅡ;

팀장 자리를 맡긴 했지만, 아주 어렵지는 않았다. 주간 업무를 보고, 업무를 배정하고, 기술적 부분을 조언해주는 게 다였다.

팀원은 2명이었다. 팀장이라 봤자 밑에 팀원과는 1년 여정도 밖에 차이가 나지 않았기 때문에 격의 없이 지냈다.



그러던 어느 날 사건이 발생했다. 멀쩡하던 서버가 갑자기 다운됐다. 급히 살리긴 했지만, 서버가 다운됐다는 건 매우 심각한 사건이다.

그때 당시 마침 팀원 A가 IDC에서 작업 중에 있었다. IDC에서는 작업하던 도중 간혹 실수가 발생하기도 한다. 혹시나 해서 A 직원에게 실수가 있었는지 물었지만, 아무것도 잘못한 것이 없다고 했다.

어찌 됐든 서버가 다운된 원인을 알기 위해서 로그를 분석하던 결과, A 직원의 잘못으로 볼 수 있는 로그를 확인했다.

로그를 보여주며 다시 한번 물었다. 그랬더니 한다는 소리가 "제가 그랬나 보죠. 뭐." 였다.

순간 솟아오르는 분노를 감추기 어려웠다. 살면서 그렇게 화가 났던 경우는 처음이었다. 내가 화가 나면 말이 없어진다는 것도 그때 처음 알았다.

그 사건 다음 날 이후로 나는 A 직원과 거리를 두었다. A 직원과는 나이도 같았기 때문에 말도 편하게 하던 사이였다. 그것도 하지 않도록 했다. 서로 존대하는 사이가 됐다.



팀장이라는 자리는 팀원들과 너무 멀어도 안 되지만 너무 가까워도 안 되는 것 같다. A 직원과는 나중에 풀게 되었지만, 그 사건은 아직도 팀장이라는 직책의 어려움을 느끼게 되는 계기가 되었다.

개발 문화

잘 다니고 있던 직장을 그만두고 스타트업 회사로 이직한 이유는 반복되는 개발이 지겨워졌기 때문이다. 새로운 기술이 나오면 혼자서 따라하기를 해 봤지만, 맛보기에 지나지 않았다. 갈증은 채워지지 않았다. 실제 프로젝트에 써먹고 싶었다.
대규모 프로젝트의 대부분은 스프링(전자정부프레임워크) 기반에 mybatis를 사용한다. 어떤 프로젝트이냐에 따라 다르겠지만 적어도 내 기준에는 그랬다.
어떻게 보면 당연하다. 개발자 구하기도 쉽고, 기존에 성공 사례가 많은 안정적인 환경이기 때문이다.

스타트업으로 가고 나서 개발 대부분을 위임했기 때문에 mongodb나 spring webflux 등 신기술을 실제 프로젝트에서 사용해 볼 수 있었다. 이 부분은 스타트업의 장점인 것 같다. 하지만 스타트업에서 정작 중요한 건 개발 문화였다. 형상 관리 툴을 전혀 사용하지 않고, 소스를 개발자 본인이 가지고 있었다. 업데이트할 때면 ftp를 사용하였다. 팀장님이 개발자 출신이셨지만, 형상 관리나 CI/CD의 중요성을 전혀 인지 하지 못하고 계셨다. 대부분의 다른 개발자 역시 그냥 되는 대로 일하고 있다는 느낌을 지울 수 없었다.
그나마 같이 일했던 분께서 이런 부분의 중요성을 인지하고 계셨고, 그분과 프로젝트를 할 때는 gitlab을 설치하여 소스를 관리했다. 다른 개발자에게도 gitlab을 설치했으니 같이 쓰면서 소스 관리를 하자고 했지만, 들어 처먹지 않았다. 강제성이 없었다. 팀장부터가 형상 관리를 하지 않았으니 말 다 했다.
반복되는 것 같은 개발이 싫어서 이직했는데, 만족도가 그 전보다 더 나아지진 않았다.

신기술을 적용해 볼 수 있는 환경이 중요한 게 아니였다. 정작 중요한 건 개발 문화였다. 어떤 이슈가 있을 때, 열린토론을 할 수 있으며, 이슈를 해결하는 데에 최적으로 해결 할 수 있는 기술이 있다면 도입하는 데, 주저 하지 않는 문화가 필요했던 거다.

정작 중요한 건 개발 문화였던 것이다.

2020년 8월 18일 화요일

제주도에서 같이 일해 보지 않을 래?

 예전에 같이 일했던 형이 오랜만에 연락이 왔다. 현재 구직 중이라고 하니 자기가 다니는 회사에서 같이 일하자고 제안을 줬다. 그런데 지역이 제주도다. 제주도... 제주도에서 일하는 건 생각도 안 해 봐서 이틀만 생각할 시간을 달라고 했다. 제주도에서 일하는 상황에 대해 검색을 해 봤다. 나름대로 장단점이 있었다. 장점이라면 역시 제주도의 자연 친화적인 환경이었다. 누구나 한 번쯤은 꿈꿔봤을 것이다. 출근길 혹은 퇴근길 푸른 바다와 상쾌한 공기를 마시며 주말에는 집 앞에 나가는 것만으로도 휴가를 온 것 같은 상상 말이다. 또 하나의 장점으로는 기본적으로 일과 삶의 균형이 잘 지켜진다고 한다. 그러나 직종 특성상 그러한 것은 별 믿을 게 못 된다고 생각했다. 단점은 평균적으로 낮은 임금이다. 이것은 미리 알려줬다. 희망 연봉만큼은 못 챙겨주겠지만 그만큼 힘들지 않다고 했다. 힘들지 않다는 건 일 해봐야 아는 것이지만 연봉은 고정된다. 연봉이 높지 않다는 건 지방으로 가는 특성상 어쩔 수 없이 감당해야 하는 것 같다. 다른 하나는 꽤 높은 물가이다. 섬 지역이다 보니 육지에서의 배송비가 꽤 많이 든다. 그렇다 보니 일반적인 생필품은 모르겠지만 온라인 쇼핑으로 주문은 배송비가 비싸다고 한다. 배송비가 비싸면 어쩌면 온라인 쇼핑을 잘 안 할지도 모르겠다. 비싼 배송비를 생각하며 한 번 더 생각하지 않을까. 집을 구하는 문제도 있지만 이건 기숙사를 제공한다고 했으니 상관이 없었다.

결론적으로는 제주도로 가는 것은 무리인 것 같다고 알렸다. 한 번쯤 제주도에서 일하는 것도 나쁘지는 않은 것 같다. 그런데 그런 로망은 나에게 아직 큰 의미가 없다고 생각됐다. 또 하나는 지금 가지고 있는 짐의 처분 문제가 걸렸다. 제주도로 이사하기는 어려워서 대부분 처분하고 거의 몸만 가는 형태가 돼야 하는 데, 이게 힘든 일이 될 것으로 생각됐다.

결국에는 거절했지만, 제안해 줘서 고마웠다. 같이 일해보자는 제안만으로도 힘이 되었다. 최근 이력서를 조금씩 내기 시작하면서 약간 조바심이 났던 것 같다. 그러나 아직은 나를 알아주는 사람이 있다는 사실 하나만으로도 힘이 났다.

직장에서의 관계는 비즈니스 그 이상도 이하도 아니라는 글을 어디서 읽은 적이 있다. 나는 그렇게 생각하지 않는다. 매우 힘든 업무를 할 때도 같이 일하는 사람이 누군가에 따라서 업무가 재미 있어진다. 야근하더라도 힘들지 않다. 반면에 아주 간단한 일도 합이 잘 맞지 않는 사람과는 아주 괴롭고 힘든 일이 된다. 직장 관계를 단지 비즈니스로 본다면 사회생활은 매우 삭막할 것 같다.

2020년 8월 16일 일요일

퇴사 10개월...

회사를 퇴직한 지도 벌써 10개월 가까이 지났다. 방송통신대 졸업을 남겨 두고 있는 상태에서 마지막 학기만큼은 제대로 공부해 보자는 마음으로 지내다 보니, 이리 오래 쉴 줄은 몰랐다. 지나고 나니 이제야 체감이 된다.

방송대 시험이 코로나 여파로 인해 시험장에 가서 치르지 않고, 과제물 온라인 제출로 바뀌었다. 시험공부도 어렵지만, 과제물을 작성한다는 건 시험공부와는 다른 어려움이 있다. 과제를 쓰기 위해서는 아는 것이 전무하면 첫 단어 자체를 떼지 못한다. 어디서부터 시작해야 하는지 조차 모르기 때문이다. 또 어설프게 아는 건 반드시 다시 한번 찾아봐야 한다. 그렇기에 과제를 완성하는 건 그것 나름의 어려움이 있다. 시험공부가 암기력 위주의 공부라면, 과제물은 깊은 이해와 새로운 사고방식, 큰 틀에서 바라볼 수 있는 시선이 필요하다.

방송대 다니면서 A를 받아 본 적이 거의 없다. 이번 학기는 처음으로 ALL A를 받았다. 자랑이지만 좀 열심히 했다. 그러나 시험으로 채점을 했다면 어려웠을 것이다. 과제 채점 방식이라 가능했던 것 같다. 사실 그동안 매우 불성실한 학교생활이었다. 나에게 필요한 건 단지 4년제라는 타이틀이었다. 누구도 알아주지 않지만, 이력서 제한의 문턱인 4년제를 넘기 위해서였다. 그렇기에 F만 아니면 된다는 마음가짐이 있었다. 그렇지만 이번에 제대로 공부하면서 공부가 재미있다고 느꼈다. 공부는 때가 있다는 말이 실감하기도 했다. 지금의 마음을 학창 시절 가졌으면 좋았겠다는 생각도 들었다. 학창 시절이 공부만 하면 되는, 공부하기에 매우 좋은 시기이지만, 역설적이게도 공부하기 가장 싫은 시절이다. 아이러니하다. 10개월의 공부 시간은 마치고 이제 돌아가야 한다. 험난한 취업전선으로...


문제는 10개월 가까이 있는 공백이다. 나름 공부했다는 핑곗거리가 있긴 하다. 당연하지만 공부만 한 건 아니다. 놀았다. 매우 잘 놀았다. 논다는 것의 정의는 사람마다 각자 다르겠지만 내 나름대로 잘 놀았다. 그것으로 인해 발생하는 커리어의 단절은 감당해야 한다. 사실 지금껏 인식하고 있었지만, 애써 무시한 지도 모른다. 통장 잔고가 바닥을 보이는 현시점에 무시의 한계에 도달했다. 취업의 목표는 통장잔고와 반비례하여 증가하고 있다.

사실 그동안 돈 버는 것에 관해 많은 관심을 쏟았다. 주식을 공부하고 시작했으며, 부동산에 관심을 두게 되었다. 개발로 돈 버는 법을 찾아보았다. 지나고 생각해 보니 약간 장밋빛 미래를 상상했던 것 같다. 일하지 않는 삶은 누구라도 꿈꾸는 삶이 아니겠는가. 그러나 주식은 이런 나의 망상을 철저히 부셔 버렸다. 코로나 여파로 인해 투자 했던 주식이 반토막 나고 나서야 정신을 차렸다. 

주식을 하면서 느낀 건 목돈의 부재였다. 주식으로 돈을 조금 벌긴 했지만, 그리 큰돈은 되지 못했다. 1000만 원의 5%라고 해봐야 50만 원이다. 5%의 이익을 내는 게 그리 쉬운 일도 아니다. 부동산 역시 그렇다. 부동산에 투자하기 위해서는 목돈이 필요한 것이다. 알고 있었지만, 다시 한번 깨달은 것은 돈이 많아야 돈도 잘 벌 수 있다는 사실이었다. 

돌고 돌아 결국 내 목적지는 취업전선으로 결정 되었다.

첫 번째 직장 이후 처음으로 길게 가진 쉼이었다. 이전에는 일한다는 것에 큰 거부감이 없었다. 그러나 일하지 않는 즐거움을 알고 나서 다시 취업한다는 것은 다른 의미로 다가온다. 일과 삶의 균형의 중요성을 조금은 느끼게 된 것 같다.

1억이 매우 우습게 느껴지는 시대이다. 그러나 내게는 여전히 머나먼 나라의 이야기이다. 돈이 넘쳐나는 시대에 사는 데, 정장 내 돈은 하나도 없다니, 매우 슬프다.

2020년 4월 11일 토요일

표식, 나를 이 세상에 묶어주는 것.

 예전에 봤던 애니 중에 '혈계전선' 이라는 애니가 있다. 이 애니는 초능력을 가지고 있는 많은 인물이 나오는데,
그중에 자신의 흔적을 없애서 누구에게도 들키지 않고 적진에 침투하는 케릭터가 있다. 삼엄한 적진에 침투하기 위해
점점 흔적을 지우다 보면 결국 자기 자신이 사라지고 만다는 설정이다. 자신이 사라지기 전에 자신을 이 세상에 붙들어 주는 것들을 정하고 표식으로 삼는다.
어떤 이는 자신의 아이를 표식으로 삼았으며, 어떤 이는 술을 너무 좋아해서 술을 표식으로 삼은 사람도 있다. 점점 사라지는 나를 붙들어 줄 만큼 소중하고 사랑하는 것들이다.

내게 그런 능력이 있고 이 세상에서 사라지지 않기 위해 하나의 표식으로 삼아 한다면 나는 무엇을 표식으로 삼을 수 있을지 생각해 봤다. ... 나는 이 세상 사람이 아니므니다...
표식으로 삼을 만하게 무척 좋아하고 소중해서 내가 이 세상에 남아 있게 하는 무언가가 나는 없다...
물론 부모님도 생각해 봤고, 형제, 가족, 친구 모두 생각해 봤다. 그렇지만 아주 강력하게 나를 잡지는 못하는 것 같다.

내게도 나를 잡아 줄 표식이 생겼으면 좋겠다.

2020년 4월 10일 금요일

나에 대해 알아 가는 것.

 어렸을 때는 좋아하는 것과 싫어하는 것이 명확하지 않았다.

그래서 '아무거나'라는 말을 자주 썼다.


커가면서 조금씩 좋아하는 것과 싫어하는 것이 생겼다.

나이를 먹는다는 건 경험이 쌓이면서 좋고 싫음이 생기는 것 같다.


아이유의 노래 중 팔레트에는 아이유 자신이 좋아하는 것들을 가사에 적었다.

내가 아이유를 좋아하는 이유는 많지만 큰 부분을 차지하는 것은 성숙한 생각이다. 

많은 부분을 배우게 된다.


나는 내가 좋아하는 것조차 명확히 알고 있지 못했다. 뭐를 좋아하냐고 물으면 마냥 대답할 수가 없다.

내가 좋아하는 것과 싫어하는 것, 잘하는 것과 못하는 것을 알고 싶어 졌다.


그리고 계속해서 찾아나가고 싶다.

2020년 1월 10일 금요일

산다는 건 뭘까...

 초등학교 6학년 때가 아마도 내 사춘기 시절이었던 것 같다.

내성적인 성격이라 크게 튄 건 아니지만 기억나는 장면이 있다.

당시 담임 선생님이 내가 벽에 쓴 낙서를 지우라고 했다.

낙서는 "나는 커서 뭐가 될까?"였다. 그때 당시에는 몰랐지만 중학교에서 사춘기에 대해 배우며 내가 썼던 낙서가 사춘기에 발생하는 일들 이란 걸 알았다.


 현재의 내가 만들어 진건 어찌 보면 아주 단순하다. 해커 영화를 보았고 해커가 멋있어 보였으며 해커를 양성한다는 학교를 갔다.

결과적으로 해커는 되지 못했지만 그 언저리쯤에는 있는 것 같다.

어떻게 보면 인생이란 이렇게 단순한 게 아닌 가 싶다. 그냥 막연하게 해커가 되고 싶었던 나는 프로그래머가 되었다.


그때는 막연하게나마 목표가 있었던 것 같다.

그런데 지금은 그런 목표조차도 없다. 꿈이 뭐냐는 질문이 가끔 들어오면 '평생 놀고먹는 것'이라고 대답하곤 했다. 이게 꿈이 될 수 있는지는 둘째 치고 목표가 흐리멍덩하다.

약간 풀어 본다면 평생 놀고먹으려면 경제적 자유로움이 당연히 있어야겠지. 그럼 역시 돈을 벌어야 하는 게 목표가 될 거다.

그래 내 목표는 돈을 버는 거다. 아주 많이. 놀고먹고살 수 있을 정도로.


...


정말 그걸로 될까... 음... 아마 될 것 같다. 그럼 어느 정도의 돈이 필요할 까. 정확히 계산해 보진 않았지만 검색해 본 결과로는 30억 정도 있으면 될 것 같다.


좀 더 풀어 보자. 왜 놀고먹고 싶은 가. 그것에 대한 답은 모든 사람들이 바라는 것. 행복해 지기 위해서다.

행복이란 이런 사전적 의미가 있다.


  생활에서 충분한 만족과 기쁨을 느끼어 흐뭇함또는 그러한 상태


많은 사람들의 목표 이기 때문에 역시 많은 연구들이 있다.

최근 본 유튜브에서는 행복해 지기 위한 방법들을 알려줬다. 생각나는 대로 적어보면 이렇다.


행복한 사람과 가까이 하라.

친구 나 가족과 시간을 가져라.

3개를 맞추고 싶은 데  2개밖에 기억이 안 난다.


돈과 사람. 어떻게 보면 뫼비우스의 띠.

돈을 벌려면 사람들과의  시간을 갖기 어렵고, 시간을 가지면 돈을 벌기 어렵다.


적당히 벌고 사람과의 시간을 많이 가지는 것도 나쁘지 않다.

하지만 그러면 노후가 걱정된다.


음... 길어진다...


마무리하자면

돈을 많이 벌기 위해 노력.

사람과의 관계를 위해 노력.

하자.