2020년 4월 11일 토요일

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

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

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

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

2020년 4월 10일 금요일

나에 대해 알아 가는 것.

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

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


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

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


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

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

많은 부분을 배우게 된다.


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

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


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

2020년 1월 10일 금요일

산다는 건 뭘까...

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

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

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

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


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

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

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


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

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

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

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


...


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


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

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


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


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

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


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

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

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


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

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


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

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


음... 길어진다...


마무리하자면

돈을 많이 벌기 위해 노력.

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

하자.

2019년 7월 10일 수요일

grep 사용 예제.

로그 데이터에서 필요한 부분만 추출하려고 하였다.
필요한 부분은 [f1]이라는 부분의 바로위 라인 이다.
처음에는 노트패드++에서 모든 파일을 열고 하나씩 복사 하려고 했는데, 데이터가 어마어마하게 많아서
grep 으로 처리 했다.
윈도우10에서 명령어 창을 열고 bash 라고 커맨드를 입력하면 linux 커맨드를 사용할 수가 있게 된다.


실제 데이터 샘플
...
2019-06-25 오후 1:14:53 [INTERFACE] [310166] [2201] [211.252.80.44:5614] Receive Reqeust ==================================================
2019-06-25 오후 1:14:53 [INTERFACE] [310166] [2201] [211.252.80.44:5614] [02 20 19 06 25 13 14 51 0A 84 02 33 31 30 31 36 36 32 32 30 31 66 31 00 B7 00 05 00 00 00 FF FF FF FF FE 00 00 28 DC 31 30 31 30 30 31 30 31 30 37 33 38 37 30 35 32 00 00 02 A2 01 16 27 00 00 00 00 00 02 20 19 06 25 11 57 53 13 23 45 00 00 07 04 BF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE 7A 03 ]
2019-06-25 오후 1:14:53 [INTERFACE] [310166] [2201] Thread reqINS [f1]
...


조건
1. [f1]를 찾아서 한줄 위에 있는 부분을 가져온다.
2. 그 중 Send가 들어간 부분을 제외한다.
3. 시간 순서대로 sorting 해야 한다.



최종 명령어
grep -h -r -B1 '\[f1\]' ./  | grep -vE '\[f1\]'  | grep -v '\-\-' | grep -v 'Send' | sed 's/\ \([0-9]\)\:/\ 0\1\:/g' | sort  -k2 -k3.1,3.2 -k3.4,3.5 -k3.7,3.8  > sort_match.txt


--------설명--------
:: << 구분

-h :: 파일이름 없이 출력
-r :: 하위 디렉토리
-B1 :: 검색된 위치 바로 위
'\[f1\]' :: 실제 검색 할 키워드, original keyword : [f1]
./ :: 검색 위치
grep -vE '\[f1\]' :: 바로 위 라인만 필요하고 실제 검색 된 위치는 필요없으므로 제외 시킴
grep -v  :: '\-\-' 검색 라인마다 추가되는 데, 옵션이 따로 있을 것 같지만 급해서 제외 시킴
grep -v 'Send' :: Send 는 제외
sed 's/\ \([0-9]\)\:/\ 0\1\:/g' :: sort 를 해야 하는 데, 데이터의 시간 일자가 '2019-06-25 오후 2:58:06' 이런식으로 시간이 02가 아닌 2이라서 sort가 안됨. 그래서 ' 2:'를 ' 02:'로 변경시킴
sort  -k2 -k3.1,3.2 -k3.4,3.5 -k3.7,3.8 :: '2019-06-25 오후 2:58:06' 의 형태를 sort 시킨다. 일자는 모두 같은 날이여서 포함 시키지 않았다.
k2 는 오전, 오후를 부분,
k3.1,k3.2 는 시(02),
k3.4,3.5는 분(58),
k3.7,3.8는 초(06)를 기준으로 sort 한다.

2019년 6월 20일 목요일

spring boot mybatis 에서 rollback 이 안되는 문제, 해결 한 결과


기본 base가 되는 table이 있고, 그 테이블에 대한 이력을 저장하는 history테이블이 있을 경우, base가 insert가 성공하고, history에서 에러가 발생할 경우 rollback이 되지 않는 문제가 있어서 여러가지 테스트를 해 본 결과이다.


1. 컨트롤러에서 base와 history 두개의 service를 가져와서 처리하는 경우 rollback이 되지 않는다.
서비스단에서 @Transactional 를 주고 처리를 해야 rollback이 된다.

2.Transactional 어노테이션은 클래스에 줘도 적용된다.


3. 이 부분 때문에 고생했다.
아래와 같이 강제로 익셉션을 발생시키면서 try catch로 잡으면 rollback이 안된다.
아래와 같이 메소드에서 throws Exception을 해 줘야 한다.
이 때 강제로 발생시키는 익셉션은 (rollbackFor = Exception.class) 옵션을 줘야 rollback이 된다.

@Transactional(rollbackFor = Exception.class)
public class CompanyRoleService extends GenericService<CompanyRole, CompanyRoleRequest> {

...
    public int saveWithHistory(CompanyRole object) throws Exception {
        AddBaseEntity.addCreatedBy(object);
        object.setUseYn("Y");
        object.setDeleteYn("N");
        int baseSuccessCount = baseMapper.insert(object);
        if(baseSuccessCount>0){
            throw new Exception("test");
        }
...


2019.07.26 추가.
4. try catch로 롤백 하는 방법
https://stackoverflow.com/questions/25738883/spring-transactional-annotation-when-using-try-catch-block


메소드에 선언.
@Transactional(rollbackFor={MyException1.class, MyException2.class, ....})
public Result doStuff(){
   ...
}

or

프로그램 방식으로 rollback
public Result doStuff(){
  try {
    // business logic...
  } catch (Exception ex) {
    // trigger rollback programmatically
    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  }
}


2019년 6월 19일 수요일

queryDsl로 groupBy having 사용시 에러 발생.

queryDsl로 groupBy having을 사용할 때 아래와 같은 에러가 발생한다.
nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: having near line 3, column 1 [select count(distinct multiLangInfo.languageCode)\nfrom com.charzin.cems.api.model.multiLang.MultiLangInfo multiLangInfo\nhaving multiLangInfo.languageType = ?1]


문제의 원인은  fetchCount()라는 전체 개수를 가져오는 함수를 사용하는 데, 이 함수가 만들어 주는 sql 쿼리문이 잘못 되었다. 위에 오류내용에 나와 있듯이 그냥 groupby를 없애버리는 쿼리를 만든다.

할 수 없이 전체 개수를 구해오는 쿼리를 따로 만들었다.

보통 group by 카운트를 가져오는 from 절 subquery는 queryDsl에서 지원하지 않는다.
여기서 확인.

할 수 없이 네이티브를 사용했다.

2019년 5월 27일 월요일

spring mongodb Sort시 에러.

spring mongodb Sort시에 아래와 같은 에러가 발생한다.

Query failed with error code 96 and error message 'Executor error during find command :: caused by :: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.' on server localhost:27017

조회하려는 테이블이 log성 테이블이라 백만건이 넘어간다.
Sort 하려는 필드는 lastUpdated 이다. 해당 필드를 index에 추가 해서 해결했다.
index 추가하는 건 compass로 접속 해서 collection 선택하면 나오는 index 탭에서 쉽게 할 수 있다.

근데, compass에서는 index 설정을 안해도 잘 된다. 어떻게 되는 건지 모르겠다.