전원생활도 재테크다
국내도서
저자 : 박인호
출판 : 신진리탐구 2011.05.30
상세보기



기자출신이 쓴 책 치고는 문장이 좀 싼티(?)나긴 하지만. 나름 실속있는 정보들로 구성되어 있다.


'똠방'을 비롯한, 경험하지 않고는 알수 없는 지식을 전달함은 물론, 오래 준비한 저자의 노하우와 인사이트를 아낌없이 풀어놓았다.


특히, 토지전용부터 준공까지의 과정과 비용을 한눈에 파악할 수 있도록 요약한 부분은 액기스중의 액기스다. 비용 1원까지 공개함은 저자의 진정성을 느껴지게했다.


적은 예산으로 귀농/전원생활을 준비하는 사람에게 기꺼이 추천한다.



저작자 표시 변경 금지
신고
Posted by A.J.Kuhn

훅(Hooked)

2017.04.08 14:04
훅 Hooked
국내도서
저자 : 니르 이얄(니르 이얄 Nir Eyal) / 조자현역
출판 : 리더스북 2014.12.20
상세보기


습관적으로 사용하게 되는 제품을 만들어가는 일련의 공식을 제시한다.


사실 이러한 중독성있는 제품들은 대부분 '우연히' 생겨난다.

우연히라 말할 수 있는 이유는 처음부터 중독을 염두에 두고 만들지 않았기 때문이다. 하지만 묘하게도 사용자들이 중독되고, 이를 유지할 수 있을 만큼의 후속조치들이 계속되면서 우리가 알고 있는 대단한 일상제품이 탄생한다.


이 책은 이러한 제품들을 '의도적'으로 만들 수 있는 공식을 제시한다.

비록 저자의 공식이 믿음이 가지도 않고 검증 되지도 않았지만, 이러한 시도를 하는 것 자체로 큰 의미는 있다.

이러한 것을 만들고자 할때 아무런 가이드도 없는 것보다는 낫기도 하거니와, 기존의 제품을 이 공식에 대입해서 SWOT를 판단하기에도 좋아보인다.



여기서는 주로 IT 제품/서비스에 포커스를 맞추고 있으며, 아래와 같은 흥미를 주제를 던진다.


* 당신이 지금 개발하고 있는 상품은 비타민인가 진통제인가?

* 어떤 행동을 하지 않을 경우, 약간의 고통이 유발된다면 그것은 습관이라고 할 수 있다.

* 마케팅 서적에서 빈번하게 사용되는 '고통'이라는 단어는 실제 '고통'보다는 '가려움'에 더 가깝다.

* 사용자의 행동을 촉발시킬 동기와 능력 중, 능력의 향상에 먼저 투자하라.

* 우리의 행동을 유도하는 것은 보상 그 자체에서 느끼는 기분이 아니라 그런 보상에 대한 열망을 완화시키고자 하는 욕구이다.

* 생산자의 흥미를 위해 소비자를 공개하는 것은 익명성 파괴의 역효과를 낼 수 있다.

* 상대방에게 선택권이 있다는 사실을 확인시켜주었을 때 오히려 상대방이 설득당할 가능성이 높다.

* 가변성이 한정된 활동은 참여도가 점점 떨어질 수밖에 없다. 그런 활동의 결과를 충분히 예상할 수 있기 때문이다.

* 사람들은 비이성적일 정도로 자신의 노력을 중요시한다.

* 다른 사람의 액션에 반응을 보이는 것은 그에관한 알림메시지를 보내는 것에 암묵적으로 동의한다는 뜻이다.

* 조종 매트릭스

* 상품 설계자는 언제나 적어도 한 명의 사용자 즉, 자기 자신과 연결되어 있기 때문에 자신의 욕구를 살펴보는 활동은 커다란 발견과 새로운 아이디어로 이어질 수 있다.



저작자 표시 변경 금지
신고
Posted by A.J.Kuhn

序.
서비스의 라이브러리를 대대적으로 업데이트하는등의 리팩토링 작업을 진행했다.

테스트 서버에서 아무 문제가 없는 것을 확인한 후 실서버에 배포를 했는데, 서버 20대 중 일부 서버들에서만 catalina.out에 로그가 쌓이지 않는것이다. 정확히는 tomcat이 찍는 스타팅 로그들은 쌓였지만 이후 발생하는 서비스 로그들이 하나도 쌓이지 않았다.



1. 몇차례 서버를 재기동해 보기도 하고 재배포해보기도 했다. 여전히 쌓이는 놈은 쌓이고 안쌓이는 놈은 안 쌓임.....

2. 서버별 환경차이를 확인
서버들이 한꺼번에 받았던 것이라, os버전은 물론 모든 어플리케이션 버전이 차이가 없었다. 파일 시스템의 권한도 완벽했으며, 용량 문제도 전혀 없었다. 

3. 로그가 잘 쌓이는 서버와 안 쌓이는 서버의 tomcat 스타트로그를 처음부터 찬찬히 살펴보았다. 70여 라인까지는 아주 정확히 똑같이 쌓였는데, 이후로 미묘한 차이를 보였다.

잘 쌓이는 놈

...

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/web-app/WEB-INF/lib/logback-classic-1.1.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/web-app/WEB-INF/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

Feb 02, 2017 10:30:43 PM org.apache.catalina.core.ApplicationContext log

INFO: Initializing Spring root WebApplicationContext

[2017-02-02 22:30:43][localhost-startStop-1] INFO  o.s.web.context.ContextLoader - Root WebApplicationContext: initialization started

...

안 쌓이는 놈

...

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/web-app/WEB-INF/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/web-app/WEB-INF/lib/logback-classic-1.1.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

Feb 02, 2017 10:16:44 PM org.apache.catalina.core.ApplicationContext log

INFO: Initializing Spring root WebApplicationContext

log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).

...


현재 서비스의 로깅 Facade는 SLF4J 고, 실제 사용하는 로깅 프레임워크는 logback 이다. 따라서 logback 관련한 설정만 되어 있는 상태다.

SLF4J가 클래스패쓰 상에서 에서 두개의 로깅 프레임워크를 발견했고, 발견 순서가 달라지면서 잘 쌓이는 놈은 logback을 제대로 Actual binding한 반면 안 쌓이는 놈은 log4j를 Actual binding 한 것이다.  log4j 관련 설정은 아예 하지 않았으므로 appender가 설정되어 있을리 없고 따라서 로그를 쓸 곳을 잃어버린 것이다.

리팩토링을 하는 과정에서 일부 라이브러리들이 Maven dependency에 추가 되었는데 이 넘들 중 slf4j-log4j12를 하위에서 사용하는 넘이 포함되어 있어서 이것이 클래스패쓰에 포함되어 버린 것이다.

SLF4J가 중복된 로거중에 하나를 선택을 하는 로직은 JVM에게 맡겨져 있으며 이는 보통 랜덤이란다;;;

(The way SLF4J picks a binding is determined by the JVM and for all practical purposes should be considered random.

from : https://www.slf4j.org/codes.html#multiple_bindings)

그래서 서버마다 다른 선택을 하게 되었고 이것이 일부서버에서만 문제가 발생한 이유다.

결국 slf4j-log4j12가 클래스패쓰에 포함되지 않게끔 dependency에 exclusion 설정을 해주어서 이 문제를 해결했다. 제거 되고 나니 SLF4J가 어떤걸 바인딩할지 고민하는 저 위의 로그 자체가 나오지 않는다.

만약 테스트서버에서 SLF4J가 잘못 선택해주었다면 일찌감치 찾아낼 수 있었을 것으로 보인다. 근데 하필 거기서는 제대로 잘 바인딩 되었다. 


結.
Maven류의 빌드 도구를 많이 사용하게 되면서, 일일히 라이브러리들을 클래스패쓰에 넣는 작업을 할 필요가 없어진 편의가 있지만, 그에 따라 버전이 다른 중복된 라이브러리를 나도 모르게 쓰게 되는 경우가 많다.(이를 깔끔히 정리하는 것은 많은 수고가 필요하다.)

우리 프로젝트의 경우는 이를 꽤나 결벽스럽게 관리해왔음에도 불구하고 버전 중복이 아닌 기능 중복으로 이런 문제가 발생했다.

여하튼, Maven dependency는 완벽히 관리되어야 한다. 라이브러리 버전 중복은 예측하지 못한 컴파일/런타임 에러를 발생 시킬수 있고, 라이브러리 기능중복은 본 예와 같은 문제를 야기 시킨다. 특히나 SLF4J는 묵시적으로 로거를 선택하므로 기능 중복이 치명적인 문제를 발생 시킬 수 있다.

저작자 표시 변경 금지
신고
Posted by A.J.Kuhn

BLOG main image
A.J.Kuhn, Endless supply of passion!
Generalist A.J.Kuhn의 general한 이야기 by A.J.Kuhn

카테고리

분류 전체보기 (163)
Human (4)
Employee (6)
Developer (14)
Musician (11)
Snowboarder (13)
Baseball Player (0)
Traveler (0)
Reviewer (115)

글 보관함

달력

«   2017/06   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
Total : 199,211
Today : 20 Yesterday : 17