2012-12-26

컴퓨터 신간

컴퓨터신간 2012-12-26 - [HBase 클러스터 구축과 관리 - NoSQL 데이터베이스 관리를 위한 하둡과 HBase 클러스터 설치에서 고급 튜닝까지] 포함 2종

WebGL 개발 입문 - 화려하고 사실적인 3D 이미지 구현
브라이언 댄칠라 지음, 유윤선 옮김, 마시모 나돈 감수 / 길벗 / 2012년 12월
HBase 클러스터 구축과 관리 - NoSQL 데이터베이스 관리를 위한 하둡과 HBase 클러스터 설치에서 고급 튜닝까지
이펑 지앙 지음, 김기성 옮김 / 에이콘출판 / 2012년 12월


http://blog.aladin.co.kr/755686115/6035323
at December 26, 2012 at 02:16PM

집중해서 학습해야 할 것들

공부하고 싶은 것들은 많지만 현재 집중해서 공부해야 할 것들. 향후 스스로 프로젝트를 수행할 때에 당장 필요한 것들이 그것이다.

  • 스프링
  • 테스팅
  • 요구사항 분석
누구나 그렇지만 이렇게 정해봤자 다른 것들을 기웃거리게 된다. 


2012-12-21

아마존 요금 청구서

만들어 놓고 쓰지도 않고 있었는데, free tier가 1년이 지났구나. 자동으로 과금 된 듯.


퓨전 드라이브 (Fusion Drive) 설치 완료

맥북프로에 퓨전 드라이브(Fusion Drive) 구성 완료! 구형 맥에 퓨전 드라이브를 활성화하는 자세한 방법 소개를 보고서 나도 따라 해봤다.

평소 이클립스가 너무 느려서 SSD가 필요하겠구나 싶었고, 또 가끔 한 번씩 찾아오는 지름신도 만족시켜 줘야 하고.

SSD추가하고 나서 바로 Fusion drive 설치를 해서 그런지 SSD 자체만으로 얼마나 빠른지 체감할 시간을 가지지 못하긴 했는데, 어쨌든 퓨전드라이브가 얼마나 빠른지는 좀 더 써봐야 알 것 같다.

내가 한 것은 기존 hd 자리에 ssd를 장착하고, 기존 hd는 optical drive 자리에 넣은 것이다.

참고한 곳은

아래는 몇가지 이미지.


2012-12-19

아름다운 3초

엘리베이터를 탔을 때
닫기를 누르기 전 3초만 기다리자.
정말 누군가
급하게 오고 있을지도 모른다.

출발신호가 떨어져 앞차가 서 있어도 클랙션을 누르지 말고 3초만 기다려 주자.
그 사람은 인생의 중요한 기로에서 갈등하고 있는지 모른다.

내차 앞으로 끼어 드는 차가 있으면 3초만 서서 기다리자.
그 사람 식구가 정말 아플지도 모른다.

친구와 헤어질 때 그의 뒷모습을 3초만 보고 있어주자.
혹시 그가 가다가 뒤돌아 봤을 때 웃어 줄수 있도록...

길을 가다가 아침 뉴스에서
불행을 맞은 사람들을 보면
잠시 눈을 감고 3초만 그들을 위해 기도하자
언젠가는 그들이
나를 위해 기꺼이 그리할 것이다.

정말 화가 나서 참을 수 없는 때라도
3초만 고개를 들어 하늘을 보자.
내가 화낼 일이 보잘 것 없지는 않은가

차창으로 고개를
내밀다가 한 아이와 눈이 마주 쳤을때
3초만 그 아이에게 손을 흔들어 주자
그 아이가 크면 분명 내 아이에게도 그리 할 것이다

죄짓고 감옥 가는 사람을 볼 때
욕하기 전 3초만 생각하자.
내가 그 사람의 환경이었다면
어떻게 되었을까.

아이가 잘못을 저질러
울상을 하고 있을 때
3초만 말없이 웃어주자
잘못을 뉘우치며
내 품으로 달려올지도 모른다

아내가 화가 나서
소나기처럼 퍼부어도
3초만 미소짓고 들어주자
그녀가 저녁에 넉넉한
웃음으로 한잔 술을 부어줄지 모른다.


오늘은 투표날입니다.
잊지말고 투표 해 주세요.

http://youtu.be/_rXZEKReABA

2012-12-18

maven-compiler-plugin을 2.3.2에서 3.0으로 올리니 aspectj-maven-plugin가 컴파일 해 놓은 것을 'changes detected'라며 다시 컴파일한다.

aspectj-maven-plugin을 1.2에서 1.4로 올리니 ajc가 먼저 수행되지 않고 compiler plugin이 먼저 수행된다.

하여간 이런 이유로 버전 올리는거 실패. (maven 공부가 필요하구나)

lombok과 공존하려면 aspectj-maven-plugin이 1.4가 되어 줘야 하는데 (weaveDirectory 옵션 때문에) 낭패. 좀 더 파려면 시간 좀 걸리니 일단 패스.

딴 문제 같아 보이는데 Spring Roo ROO-2919
Upgrade aspectj-maven-plugin to 1.4
에서도 머라 하네.

2012-12-15

Did you log into Facebook from somewhere new?

페이스북에서 이런 메시지가 날라오다니. 도대체 어떤 놈이 ... 

From: Facebook <notification+o24_j6=c@facebookmail.com>
Date: Sat, Dec 15, 2012 at 12:48 PM
Subject: Did you log into Facebook from somewhere new?
To: 원상호 <shawn.won@gmail.com>


Dear 상호,

Your Facebook account was recently logged into from a computer, mobile device or other location you've never used before. For your protection, we've temporarily locked your account until you can review this activity and make sure no one is using your account without your permission.

Did you log into Facebook from a new device or an unusual location?

- If this was not you, please log into Facebook from your computer and follow the instructions provided to help you control your account information.

- If this was you, there's no need to worry. Simply log into Facebook again to get back into your account.

For more information, visit our Help Center here:
http://www.facebook.com/help/account_recovery

Thanks,
Facebook Security Team




2012-12-07

spring view

Xtend 를 spring mvc 의 view로 사용하고 싶다고?

https://groups.google.com/forum/?fromgroups=#!topic/xtend-lang/7idPXuyc0cU

scalate를 쓰면 된다. scalate의 경우 maven빌드를 하면 jade파일이이 scala 코드로 바뀌면서 컴파일을 하게 되는데, 이 때, javabean의 속성을 정적으로 검사하게 되므로 오류를 미리 잡아낼 수 있다.

하지만 내 경험을 말하자면, 우선 컴파일 시간이 좀 걸린다. 오류 체크를 위해 매번 컴파일을 돌리기에는 좀 귀찮다. 이 경우 에는 개발시 매번 돌리지 말고 운영환경에 올리기 전에만 확인해도 되지 않을까 싶다. 여기서 발견되는 오류는 간단히 고칠 수 있는 경우가 많으니까.

또, 하나의 문제는(이게 제일 큰 문제더라) 개발시 jade가 수정되면 다시 컴파일이 일어나고(알아서 수정된 파일만 컴파일한다), 혹은 java 코드가 수정되면 web app이 reload가 되면서 tomcat 이 점유하는 메모리가 올라가게 되는데, scalate 의 경우 메모리 점유가 너무 많았다. 두세번 reload하면 벌써 1기가를 넘는다. 그럴 때마다 tomcat을 restart 해주는데, 이게 너무 불편하다.

나의 경우 scalate를 쓰다가 지금은 jade4j를 사용하고 있다. scalate, jade4j를 쓰게 된 원래 이유는 jade를 쓰고 싶어서이다. html코드가 깔끔해지니 기분도 좋으니까. (요즘은 다시 tiles로 돌아가고 싶은 마음도 가끔 든다 ^^). jade4j를 쓰고 나서는 메모리 때문에 tomcat을 restart할 일이 별로 없다.

원래 주제로 돌아가서...

그래도 view를 compile 하는 단계를 거친다는 것은 미리 오류를 잡아 줄 수 있다는 점에서 좋은 점이 있다고 생각한다. 그게 Xtend이든지, 아니면 다른 언어로 구현되든지 상관없이 좋은 솔루션이 빨리 나온다면 좋겠다.

ps) 글 쓰면서 생각해보니 scalate 를 좀 영리하게 썼었더라면 좋았을 걸... 하는 생각도 드네. ㅋ
창업을 해야 할지도 모르겠다. 당장 분명한 목표가 있어서라기보다, 스팟으로 일을 해주고 돈을 받아도 회사대 회사로 일하는 것이 더 좋을 수도 있지 않을까.

2012-12-06

@Async에서 Exception

@Async 로 실행되는 코드에서 exception은 조용히 실패하는구나. stackoverflow에도 언급되어 있는데, 제시된 해결책이 어떻게 해결책이 되는지 이해가 안가네.

http://stackoverflow.com/questions/8735870/spring-async-uncaught-exception-handler

2012-12-05

윈도우에서 permission이 없어서 폴더 삭제가 안된다

security에서 permission을 full control로 바꿔주면 되는데, 이게 안먹힐 때가 있더라. 혹시 command line에서 명령어로 permission을 바꿔주면 확실하게 바뀌지 않을까?

cacls Windows.old.000 /T /G shawn:f

옵션은 help화면을 보면 대충 알 수 있다.

결과는 성공.
예준이가 감기가 걸린지 벌써 며칠인데, 아직도 낫지가 않고 있다. 태어난지 3주된 아이가 계속 불편해 하니 안타깝기만 하다. 서준이가 기침할 때 조심했어야 했는데 미처 신경을 쓰지 못했다. 하정훈소아과 갔더니 폐렴으로 전이될지는 아무도 모른단다. 언제라도 증상이 조금이라도 달라지면 병원으로 달려와야 된다고. 밤에는 응급실로. 더불어 예방접종 얘기도.

그나저나 밖에는 12시부터 내린 눈이 아직까지 쉼없이 내리고 있다. 이런 날씨를 집 안에 앉아 아무 걱정없이 바라보기만 한다면 참 좋겠는데 맘 한 구석에 할 일이 있으니 좋은 마음도 반감되는구나. 이런 날씨에는 혼자 책보다 술도 한잔 하고 그러다 한 숨 자고 일어났는데 아직 눈이 오고 있으면 좋겠다.

2012-11-29

x-editable

적용하다가 date 타입의 달력 표시가 제대로 안되길래 한참이나 이리 해보고 저리 해봐도 안되었는데, jquery 버전 올리니 그냥 되네. 씁쓸하군.

어쨌든 잘 되어서 다행인데... 이걸 어떻게 써야 적절하게 잘 썼다는 소릴 들을까...

2012-11-28

DomainClassConverter

적용시 java.lang.Object 가 not a managed type 이라길래 음... 약간 고민하다가 내 spring data repository 들이 아래 인터페이스를 상속하게 했는데,

public interface BaseJpaRepository extends JpaRepository, JpaSpecificationExecutor {
}

텅비어 있는 이놈을 DomainClassConverter가 처리하려다 보니 발생하는 문제인 것 같더라.

그래서 이 녀석을 repositories base-package 밖으로 옮기니 잘 됨.

Air Display

Air Display 무료 버전

한 번 써봤는데, 별로네. 와이파이 연결이라 그런지 우리 사무실 와이파이가 느린건지 화면이 빠릿하게 움직이지 않는다.

또, 트위터 윈도우를 그 쪽으로 올려 두고 가끔 눈길 주려 했는데, 이게 가끔씩 터치 안하면 아이패드가 어두워지면서 꺼짐. ㅋㅋㅋ


도서 목록 - 강유원

도서 목록

내 평생 읽어도 힘들겠다.
네트워크 오디오

한 번 구성해 보고 싶은데 돈이 문제네.

#대선

#대선 으로 보니 박근혜 추종자가 엄청나구나. 알바일 수도 있고.

그나저나 박근혜를 지지하는 사람들이, 혹은 문재인 지지자들이 어떻게 그러한 결정에 이르게 되었는지를 밝혀주는 무언가(소프트웨어?)는 없나? 그렇다면 서로 이해하기 쉽고, 오해도 풀릴텐데 ㅎㅎㅎ.

근거의 제시일 수도 있고, 좋은 감정을 받은 것들일 수도 있고. 언론의 영향 때문일 수도 있고. 누군가의 거짓말 때문일 수도 있고.

엄마, 누나와 박근혜 단독토론에 대해 이야기 하다가, 박근혜는 좀 무식한거 같다고 했더니, 지도자는 좀 그래도 된단다. 공부는 학자들이 하면 된다고. 음... 이런 식의 접근은 안되겠구나 생각이 든다. 큰형과 큰누나는 안철수 사퇴하니 이번 대선에서는 기권한다고. 그렇다. 이 분들은 기본적으로 민주당이 싫은 것이다. 아무리 박근혜를 까봐야 문재인을 찍을 일이 없다.

그렇다면 어떻게 해야 하나. 결국 팩트를 모으고 은근히 찌르는 수밖에(역시 도움 안될거다).

서울대를 해체해야 하듯이 민주당을 해제해야 하나.

2012-11-23

xtend 언어로 jpa entity를 만들면 어떻게 될까... 생각하며 한 번 테스트해 보는데, 우선 xtend가 변수명 앞에다 '_'를 붙이기 때문에 쫌 거시기 해진다. spring data repository가 method signature로 query를 생성하는데 필드들이 '_'가 붙어 있어서 찾지를 못해.

ksug에 질문 올렸더니 이것 때문에 문제가 많다고.
https://groups.google.com/forum/?fromgroups=#!topic/ksug/kBd_IqyVG8k

2012-11-19

내가 로또를 샀다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
jade4j가 0.3.0으로 올라가면서 OGNL대신 JEXL로 바뀌었다. 덕분에 내 코드가 수정이... 악...

역시 남들 안쓰는거 쓰려면 힘들어.

2012-11-16

개발서버 밤에 재우기

전기 아까우니 야간에는 개발서버가 잠 좀 자게 해 두자.

다음 스크립트를 작성하자.

#!/usr/bin/python

from subprocess import call
import sys
import time

if (len(sys.argv) != 3):
    print 'Usage: ./sleep_for.py sleep-min hour'
    quit()

sleepTime = int(sys.argv[1]) * 60
wakeTime = str(int(sys.argv[2]) * 3600)

time.sleep(sleepTime)

call(["/usr/sbin/rtcwake", "-lv", "-m", "mem", "-s", wakeTime])

nightsleep.py 라는 파일로 저장해둔다. chmod 755 해야 실행되겠지?

$ sudo crontab -e 로 cron을 설정하자.

$ sudo crontab -l
50 23 * * * /home/userid/bin/nightsleep.py 5 8 > /tmp/nightsleep.out 2>&1

밤 11:50에 실행된다. 5분후에 잠들므로 11:55에 잠들게 된다. 8시간 동안.

Xtend 문서 읽고 있는 중.

@Data class Movie {
    String title
    int year
    double rating
    long numberOfVotes
    Set categories 
}
Xtend를 써보면 어떨까? 단순히 get/set 대채하는 것부터 시작하면서 점점 ... ㅋ
우분투 데스크탑 쓰고 싶네. 맥에 대한 기대가 저물고 있다. 왜 일케 느린거야. 메모리 8기가도 부족하구나.

2012-11-13

Eva Cassidy

에바 캐시디. 좋구나.

오늘은 힘드네. 어제 형 전화를 받고서 갑자기 스트레스 지수가 올라가는 느낌이다. 가만 생각해보면 스트레스 받을 일도 없는데, 스스로 불안감을 만들고 있다. 불안증. 무엇을 불안해 하는가.

불안을 응시하자. 명상법이라도 좀 배워두면 도움이 될런지.
아이사랑카드로 결제하는데 금액이 347,000원이었어. 공짜라 신경 안쓰고 있었는데 세구나.

장맛비가 내리던 저녁

창비세계문학 시리즈 중에 중국 편이다. 어쩌다 이 책을 읽게 되었지? 수유너머 웹사이트에서 중국 문학  관련 학습이 있었던 것 같은데, 난 그 커리를 보다가 목록에 올려놓고 언젠가 한 번 읽어야지 했었다. 덕분에 심종문(천충원)의 '변성'도 읽게 되었고. '허삼관 매혈기(위화)'도 읽게 되었다. 

단편 모음인데, 각 편마다 끝에 더 읽을 만한 것들을 추천하고 있다. 책은 도서관에 반납해야 하니 여기에 일단 옮겨 둔다. ㅋ

목차

루쉰_아Q정전 / 고향
위따푸_타락 
쳔충원_샤오샤오
빠진_노예의 마음 
마오뚠_린 씨네 가게
스져춘_장맛비가 내리던 저녁 
라오셔_초승달
띵링_밤 

루쉰

작품의 다른 번역본으로는 전형준 옮김 '아Q정전'(창비 2006)이 있고, 루쉰 특유의 산문세계를 접하기 위해서는 이욱연 옮김 '아침꽃을 저녁에 줍다'(예문 2003)가 적절하다. 루쉰 전기나 평전으로는 왕샤오밍 지음, 이윤희 옮김 '인간 노신'(동과서 1997), 환산승 지음, 한무희 옮김 '노신평전'(일월서각 1982) 등이 있다.

위따푸

위따푸의 문학세계를 폭넓게 안내한 강경구의 저서 '욱달부 심종문 소설의 연구'(중문출판사 1999)가 있다.

천충원

천충원의 문학세계를 이해하기 위해서는 그의 대표작인 '변성'(정재서 옮김, 황소자리 2009)이 적절하다.

빠진

빠진의 대표작 '가'(박난영 옮김, 황소자리 2006)가 번역되어 있다. 빠진의 문학세계를 전반적으로 이해하기 위해서는 박난영의 '혁명과 문학의 경계에 선 아나키스트 바진'(한울아카데미 2006)이 도움이 된다. 문혁의 비극을 고발한 그의 수상록의 일부를 번역한 '매의 노래'(홍석표 외 옮김, 황소자리 2006)도 나와 있다.

마오뚠

마오뚠의 대표작 '자야'(김하림 옮김, 한울 1986)는 그의 작품세계를 압축하여 보여 준다. 그의 문학세계를 이해하기 위해서는 박운석의 저서 '모순의 문학사상'(영남대출판부 1991)이 도움이 된다.

스져춘

스져춘과 더불어 샹하이 모던 시대의 풍경을 그린 쟝아이링의 소설을 같이 보는 것도 도움이 될 것이다. 김순진이 옮긴 '경성지련'(문학과지성사 2005) '첫번째 향로'(문확과지성사 2005)가 있다.

라오셔

라오셔의 대표작 '낙타 샹즈'(심규호 유소영 옮김, 황소자리 2008)가 번역되어 있다. 이 소설은 '루어투어 시앙쯔'(최영애 옮김, 통나무 2000)라는 제목으로도 나와 있다. 

띵링

불꽃처럼 살았던 띵링의 삶을 다룬 전기인 '딩링'(쭝청 지음, 김미란 옮김, 다섯수레 1998)가 띵링의 삶을 총체적으로 이해하는 데 도움이 되고, '소피의 일기'(김미란 옮김, 지만지 2009)는 초기 작품세계를 보여주는 대표작이다.

2012-11-09

JPA auditing 기능을 쓰려고
<jpa:auditing auditor-aware-ref="auditorAware" /> 를 쓰려니까 jpa:repositories 가 안먹는다. 기존 선언되어 있던 XxxRepository bean을 못찾겠다네. 뭘 잘못 한걸까...

2012-11-08


org.hibernate.MappingException: property mapping has wrong number of columns: org....MainForumPost.createdBy type: org.....user.User

이게 뭐냐.
Authentication success handler on form login in Spring Security


아우... STS 느려 터졌네. 나도 대단하구나. 이런걸 참아내다니.
인증 부분만을 구글, 페이스북, 트위터 같은 시스템에 맡겨 버리면 어떻게 되나? 부작용이 있을까?

위대한 개츠비

http://news.hankooki.com/lpage/life/200404/h2004041117433623340.htm

번역이 문제란다. 믿을 만한 것은 민음사의 김욱동 번역 뿐이라네. 어쩐지 좀 읽기가 자연스럽지 않더라니. 김욱동 번역이 도서관에는 이미 대출되어 있고. 내가 지금 읽고 있는 것은 문학동네와 열린책들 두가지. 열린책들 것이 좀 더 낫네.

영화로도 좀 봐야겠다.

2012-11-07

구글 채용 설명회

를 보니 구글에 입사하는 것도 재밌겠다는 생각이 든다. 할 수만 있다면(?) 입사하고 싶네. ㅋㅋ


regex

input.input-small.date(type="text", placeholder="YYYY-MM-DD", name="paperReceivedDate", value="{{progress.paperReceivedDate}}")

-->

mixin dateInput('paperReceivedDate', '{{progress.paperReceivedDate}}')

와 같이 바꾸려고...


input\.input-small\.date\(type="text", placeholder="YYYY-MM-DD", name="((\w)+)\", value=\"\{\{((\w)+)\.((\w)+)\}\}"\)

-->

mixin dateInput('\1', '{{\3.\5}}')

2012-11-02

개인 프로젝트로 이름을 짓다가 NodePlay라는 이름을 지었는데, 실제로 PlayNode라는 컨퍼런스가 만들어졌다. ㅋㅋㅋ 유행은 유행이다. 하지만 나의 Node는 node.js가 아닌 drupal의 node라는 점이 함정.
갈수록 Roo를 쓰는 이점이 사라지네... 자체 제작하는 addon이 없다면 굳이 roo를 쓰는 의미가 없을 것 같다. 현재 사용하고 있는 것은 @RooJpaRepository, @RooService, @RooJpaEntity 정도 인데, Spring data 를 쓰면 별로 차이가 없으니...

@RooJavaBean, @RooToString, @RooEquals 때문에 roo 쓰는 것도 아니고 참 내.

roo addon 개발도 한 번 해봐야 하는데...
이젠 진짜 5분 대기인데 왜 아직 소식이 없쥐. 첫째 때는 일주일전에 나왔고, 둘째는 더 일찍 나온다고 하던데. 9일이 예정일이니 오늘이 딱 일주일전이다. 두둥...
부질없는 얘기를 했어. 계급이니 뭐니 얘기해봤자 무슨 소용이람.
세상은 온통 문,안 얘기 뿐. 그래도 우리 친구들은 좀 다른 얘기를 할 줄 알았더니...
하지만 나라고 딱히 달리 얘기할 것도 없는데, 괜히 말했나 싶다. 그냥 푸념한 것으로 생각해 주렴.
이제 애니팡도 지겹다.

2012-10-30

어지럽구나.
오늘 애니팡 왜 일케 느리냐...
일찍 자고 일찍 일어나서 두어시간 책보고 출근하면 기분이 참 좋다. 매일 이럴수 있다면 좋겠지. 그런데 적응이 안되서 매우 피곤하다. 오늘 저녁에는 약속도 있는데 그렇담 내일은 일찍 일어나기는 글렀군. 문제는 진정으로 원하지 않기 때문이지.

2012-10-29

오늘 아침에는 서준이와 치과에 다녀왔다. 늘 그렇듯, 아이와 병원에 가는 것은 힘든 일이다. 예전에도 눈병이 났을 때에, 의사 선생님이 무지막지하게 눈알을 뒤집는데, 피가 주륵주륵 나는 것이 차마 볼 수가 없었다. 그냥 짠하고 눈물이 날 것만 같았다. 오늘은 앞니 두 개가 신경이 죽은 것 같다는 진단을 받았고, 그대로 두면 다음 치아에도 영향을 줄 수 있어 할 수 없이 치료를 하게 되었다. 결정을 하면서도 이게 잘 하는 일인지 쉽게 판단할 수 없었다. 신경치료라니. 신경이 죽으면 이빨이 검게 변한다고. 어쩌면 그냥 두어도 다음 치아가 날 때까지 버틸 수도 있지 않을까. 물어보니 다음 치아는 초등학교 들어갈 때 쯤 난다고 한다. 그렇다면 그 때까지 완벽하게 관리를 해야 하는데, 또 물어보니 양치질만으로 문제가 안 생긴다는 보장이 없다고.. 염증이라는 것이 몸의 전반적인 상태와 관련이 있으니.

일단 엑스레이를 찍었고, 치료할 때에는 마취를 한다. (아이에게 엑스레이와 마취가 어떤 영향이 있을지도 모르는 답답한 부모들이다 ㅠㅠ). 좀 진정을 한 후, 문제의 이빨의 앞면에 구멍을 낸다. 그런 다음 그 구멍을 통해 치아 속의 위부분까지 긁어 올라간다. 나중에 보면 치아가 겉 표면만 남고 안에는 텅 빈 모습이 된다. 그런 다음 내부를 채운다. 채우는 물질이 무엇인지는 잘 모르겠다. 서준이가 아파하면서 움직이니까, 그물 같은 담요로 몸을 덮고 잠궈버린다. 이런...

암튼 힘든 아침이었다. 그래도 수술 시간이 그리 길지 않아 다행이라고 해야 하나. 사실 예전에 왔을 때에도 치료를 해야 한다고 의사선생님이 말씀하셨는데, 좀 과잉진료인 것 같아 하지 않았었다. 오늘은 집사람이 왜 그냥 한다 했을까. 암튼 조금은 애매한 판단이었다고 생각은 드는데, 그래도 하고 나니 말끔한 앞니가 되어서 보기에는 좋긴 하다.

2012-10-26

http://www.youtube.com/watch?v=F9f0692r_dg&feature=em-uploademail-new

세바시에서 영어공부에 대해 얘기하는데, 아이에게 영어를 직접 가르치라고. 꽤 괜찮은 방법 같다.

2012-10-25

angular form validation 좋은 방법 없나?

제대로 하려면 일관된 방법이 있을 것 같기는 한데, 아직 어떻게 해야 할지 아이디어가 안잡히다보니 일단 이정도로만 처리하자. 더 좋은 방법이 있으면 누가 좀 알려주세요.

브라우저는 required, pattern 과 같은 것으로 기본적인 폼 validation 처리를 할 수 있다.
input이 이 조건이 충족되지 않으면 submit을 하지 않는다.

angular는 여기에 더해서 ng-minlength, ng-maxlength, ng-pattern 과 같은 것들을 제공한다. 그러나 문제는 form submit을 막아주지는 않는다. form submit을 못하게 하려면 어떻게 하나?

action속성을 제거하고 ng-submit을 사용하는 방법이 있다.

$scope.mainFormSubmit = function() {
    if (!$scope.mainForm.$valid) {
        $log.log("form is invalid");
    } else {
        $log.log("form is ok");
        // set action and submit using jQuery ?
    }
};

하지만 action 속성을 줄 수 없으니 갑갑하다.

또 하나의 방법은 submit 타입의 버튼을 없애고 button이나 anchor로 바꾸는 것을 생각해 볼 수 있다. ng-click handler에서 submit하면 된다. 이러면 action 속성을 줄 수 있다.

보너스로 아래와 같이 메시지로 피드백을 줄 수도 있겠다.

.alert.alert-error(ng-show="!mainForm.$valid") 입력값이 올바르지 않습니다.

2012-10-24

gpt partition

외장하드 하나를 집 컴퓨터에서 포맷을 한 다음 집사람 회사 컴퓨터에 꽂았더니 디스크가 보이지 않더란다. 디스크 관리자에서 gpt partition으로 뜨면서 포맷도 할 수가 없네.

다음 순서로 작업한다.

  • 커맨드라인에서 diskpart 실행
  • list disk
  • select disk x (x is number)
  • clean
이제 디스크관리자에서 포맷을 할 수 있다.

2012-10-22

조산소 다녀 왔다. 이제 일주일 정도만 지나면 둘째가 언제든지 나올 수 있다고... 아직 많이 남았다고 생각했는데, 어느새 시간이 이렇게 흘러 코앞으로 닥쳐왔구나. 별로 준비한 것도 없는데 말이야. 머 사실 특별한 준비를 해야 한다는 생각은 없지만 그래도 아내는 이것저것 생각이 많다. 미리미리 준비할 것도 많을테지. 나만 생각없는 남편으로 지내고 있다.  나로서야 이름을 어떻게 짓나 하는 것 뿐. 그나저나 앞으로 먹고 살 일이 걱정이긴 하네. 이젠 벌이도 시원찮고. ㅎㅎ

2012-10-19

스터디 책도 읽어야 하고, 내 기술서적도 읽어야 하고, 철학 서적도 읽어야 하고, 가끔 소설책도 읽어야 하고... 하악...

2012-10-12

owncloud를 설치해봤다.

쉽게 설치된다. 패키지를 받아서 (php로 작성되어 있다) /var/www 밑에 풀면 된다.

  • 몇가지 디렉토리의 소유를 www-data:www-data 로 바꾸고.
  • .htaccess를 사용하므로 000-default에서 AllowOverride 를 All로 바꾸고
  • a2enmod rewrite, a2enmod headers
  • service apache2 restart 하면 끝.
전용 클라이언트도 제공하고 좋아 보이더라. finder에서 접속하라고 WEBDAV 연결도 제공한다. 킹왕짱이다. 웹으로 연결하려면 http://server/owncloud 로 연결하면 되고. UI도 깔끔하더라.

그런데 이 새끼 이거. 
파일을 올릴 수가 없네. 안되네. webdav로 복사해도 느려 터져서 되는지 안되는지도 모르겠고, 전용 클라이언트가 지정한 폴더에 파일을 넣어도 싱크하겠다는 반응이 없어. 웹브라우저로 올리라고? 그렇게는 못하지. 

머... 찾아보면 우회하는 방법도 있겠지만... 내가 그리 한가하지 않은 관계로 오늘은 여기까지.

2012-10-10

spring roo를 쓰면서 결국 aspectj를 쓰게 된 셈인데, 이게 은근 불편한 점이 하나 있네. 에러가 하나라도 있으면 aspectj로 주입된 필드와 연관된 모든 라인을 에러가 있다고 표시를 하는구나. 내가 만든 에러가 어딘지 찾기가 무척 힘듦.
entity 클래스들이 연관 클래스와 상호작용하는 메소드들을 가지는 것이 좋은가? 아니면 이런 작업들은 Service에서 하는 것이 좋은가?

2012-09-26

OOM killer 라는게 있다는건 처음 알았네.
http://sylphong.egloos.com/523835

며칠동안 이유없이 tomcat이 죽더니... dmesg로 확인해 볼 것. 혹은 OOM killer 로 더 알아볼 것.

2012-09-25

Spring MVC Controller 의 REST scaffold

spring roo 가 제공하는 것을 약간 수정하여 나만의 scaffold로...
* roo는 update 경로가 좀 다르고
* list에서 spring data의 Pageable을 사용함.

http://java.dzone.com/articles/restful-standard-resolved 도 참고하자.


@RequestMapping
public String list(@PageableDefaults(pageNumber = 0, value = Config.PAGE_SIZE) Pageable pageable, Model model) {
}

@RequestMapping(method = RequestMethod.POST)
public String create(@Valid MyObj obj, BindingResult bindingResult, Model model, HttpServletRequest httpServletRequest) {
}

@RequestMapping(params = "form")
public String createForm(Model model) {
}

@RequestMapping(value = "/{obj}", method = RequestMethod.PUT)
public String update(@Valid @ModelAttribute("obj") MyObj obj, BindingResult bindingResult, Model model, HttpServletRequest httpServletRequest) {
}

@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public View remove(@PathVariable Long id) {
}

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ModelAndView show(@PathVariable Long id, Model model) throws Exception {
}

2012-09-22


roo의 service는 aggregate repository 같다. domainTypes에 entity만 지정해주면 그에 해당하는 repository들을 모두 엮어 준다.  그렇다면 하나의 entity가 여러 service에 지정될 수도 있다. 하지만 이건 좋지 않은 것 같다. 서로 역할이 달라야 할 service들이 하나의 entity에 대한 operation들을 중복해서 가지게 되니까. 각 service가 처리하는 entity들은 관련 영역별로 구분하여 모아주는 것이 좋지 않을까. 물론 service라는 것이 지정된 entity만 처리할 수는 없을 것이다. 그럴 때는 domainTypes에 해당 entity를 지정하는 것보다는 그 entity의 repository를 DI 받도록 하자.

AspectJ가 주입된 메소드, 필드를 못찾는다 싶을 때에는 Markers -> Java Problems 를 보자. 여기에는 진짜 문제만 나타난다. 한번은 이클립스에 아주 많은 에러가 있는 듯 표시하지만 Java Problems에는 단 2개의 문제만 있었다. 그 2개의 문제만 해결했더니 모든 에러가 사라졌음.

2012-09-15

모든 entity에 생각없이 @RooEquals를 붙이고 있는데, 이게 구현이 HashCodeBuilder를 사용하면서 모든 field 에 대해 hashCode를 구하다 보니 서로 hashCode를 구하려고 하는 바람에 StackOverflow가 남.

mac에서 iso를 usb로 옮기기. 부팅 가능하게.

우선 아래 명령으로 usb 의 device명을 알아낸다.

$ sudo diskutil list

나의 경우는 /dev/disk4 였다.

usb를 꽂고 diskutil 로 erase 를 해준다. ms-dos (FAT)로.

그런 다음 partition을 unmount하자. 이 때 usb는 diskutil에 여전히 표시되고 있다.

이제 터미널에서 다음을 입력한다.

sudo dd if=myfile.iso of=/dev/disk4 bs=8192

음... 부팅안되는구나. 미안. ㅋ

2012-09-12

roo 를 적용하면서 오늘 하루 종일 기존 repository (가내 수공업 repository)를 active record 로 모두 바꾸고 있는데, 웹 서핑 하다 보니 다시 spring jpa 기반 repository로 바꾸고 싶다. active record 는 작은 프로젝트, repository 는 큰 프로젝트에 알맞다고...(?)

2012-09-11

2012-09-07

어제 내가 관리하는 서버가 ssh 접속이 안된다고 카페24에서 전화가 왔다. 덜컥... 후덜덜... 아직 정식으로 사용하는 시스템이 아니긴 해도, 백업 설정도 안되어 있는데...

또, 내 주제에 시스템 보안을 완벽히 할 자신도 없다는 생각도 든다. 

이럴 바에야 클라우드로 가는게 좋겠다는 생각이 드는데... 클라우드로 가도 시스템 보안은 마찬가지인가? 그렇다면 paas로 가야 하나?

jade4j

java에서 jade를 쓰고 싶어서 scalate를 쓰게 되었는데, jade4j로 갈아 타야겠다. 복잡한 페이지는 컴파일하는 시간도 오래 걸리고. 메모리는 왜 일케 많이 잡아 먹는거야. app reload하면 2~400메가씩 점유량이 올라가니 tomcat메모리를 max 2G 줘도 몇번 코드 수정하고 나면 빌빌댄다.

반면 jade4j는 그냥 text를 parse하여 변환하는 것 같다. pegdown, ognl 같은거 쓰더라. 에러 났을 때 보여주는 ui는 play와 닮았던데 그대로 가져온 모양이다. 멋지다. 페이지 inheritance도 훨씬 잘되어 있고. mixin은 써본 적 없지만 잘만 하면 좋은 용처가 있을 것 같고.

슬슬 옮겨 가자.

--

ognl을 사용하므로 scala 문법의 if, for 등을 ognl 구문으로 바꾸어야 한다.

.getXXX 메소드 호출을 .xxx 와 같이 property 접근으로 바꾸어야 한다. sublime text에서 작업해야만 했다.
Find: \.get(.)
Replace: .\L\1

jade4j 에서는 BigDecimal 을 표시할 때, scale 대로 표시해준다. db에 설정된 scale대로 값을 가지므로 사실상 정수임에도 불구하고 .0000 과 같이 소수점이하 자리가 표시된다. ognl 은 객체의 메소드 호출을 지원하므로, 이런 류의 포맷팅을 위한 객체 및 메소드를 만든 다음, 이 객체를 페이지의 모델에 포함시켜, 페이지에서는 이 객체의 메소드를 호출함으로서 원하는 조작을 할 수 있다. 이 외에도 그 객체에 유틸리티 메소드를 정의해두면 좋을 것이다.

uri method를 f.uri로 바꾸기.

Find: =\{uri(.+)\}
Replace: =f.uri\1

ConversionService와 @ModelAttribute 를 이용한 Entity Update (수정) 처리

스프링 사용자 그룹에 질문을 던졌다.

ConversionService 를 이용한 id -> ModelAttribute 변환

결론은 허탈하게 해결되긴 했지만 그래도 나름 내부 구조를 이해하는데 도움이 되기도 했으니 다행이다.

하지만 나로서는 더 중요한 문제가 해결되었다. 수정폼의 submit을 매우 간단하게 처리할 수 있게 되었다.

예전에는 이렇게 했다. http://blog.jabberstory.net/2012/08/blog-post.html

하지만 이제 매우 간단해졌다. 그냥 uri 와 @ModelAttribute로 받고 저장하면 끝. controller를 분리할 필요도 없다.

@RequestMapping(value="/user/{user}", method=RequestMethod.PUT)
public String update(@ModelAttribute("user") User user) {
   UserRepository.save(user);
}

여기서 uri에 있는 "user"와 @ModelAttribute에 붙어 있는 "user"가 같아야 한다. 그리고 String -> User 변환을 위한 Converter를 등록해 두어야 한다. 이 converter는 db에서 주어진 user 문자열로 User를 찾는 작업을 한다.

예전에 했던 방식은 UserDto로 @ModelAttribute으로 받은 다음, 별도로 find한 User에 필드 복사를 일일이 해주었다. (bean의 속성을 복사하는 유틸리티 클래스를 이용하기도 했다)

이렇게 하다가 귀찮아서 merge()를 사용했는데, merge()도 위험하다. 수정 폼에 모든 필드가 없다면 @ModelAttribute으로 받은 dto에는 null 필드가 있을 것이고, 이게 db필드로 들어갈 위험성이 있기 때문이다.

이에 대한 해결책으로 토비 책에는 @SessionAttributes을 사용하라는 얘기가 나온다. 하지만 이것도 해결책은 될 수 없는데, 동시에 열려 있는 여러 User에 대한 수정폼을 처리할 수 없다. session에 저장된 user는 하나이기 때문이다. (3.1 이전에 출간되었기 때문에 어쩔 수 없지 않았나 생각한다)

하지만 ConversionService와 @ModelAttribute을 동시에 이용하면 위의 문제를 모두 해결할 수 있다.

success !

2012-08-29

Junit에서 Hamcrest 최신버전 사용하기

maven pom.xml을 다음과 같이 바꾸면 됩니다.

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-all</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit-dep</artifactId>
    <version>4.10</version>
    <scope>test</scope>
</dependency>

요약하면 junit을 junit-dep 이것을 사용하면 됩니다. hamcrest를 뺀 것이죠.

2012-08-28

Spring ROO 적용

spring mvc 로 잘 만들고 있던 프로젝트였는데, 갑자기 Roo 가 눈에 들어왔다. Roo의 ActiveRecord가 좋아 보였던 것. 그리고 Controller들의 기본 구현 등...

머.. 사실 ActiveRecord 를 쓸지, Repository를 쓸지 아직 고민이긴 하지만..

딴거 할일은 많았지만... 이미 내 손은 Roo를 적용하고 있다. ㅠㅠ.

기존 프로젝트를 Roo기반으로 바꾸면서 일어 났던 일을 (뒤늦게)기록해 본다. (처음부터 기록하면서 작업했으면 좋았을걸)

아무래도 Roo가 생각하는 기본 프로젝트 구조가 있기 때문에, 테스트로 Roo 프로젝트를 하나 만들고 jpa, web mvc 까지 다 세팅한 다음, 이 놈을 참고 하면서 작업하는 것이 좋을 것이다.

우선 web.xml.

web.xml에 스프링의 xml 설정 파일을 지정하는데, roo는 기본적으로 소스의 resources 쪽에다가 applicationContext.xml 을 만들고, WEB-INF 쪽에 webmvc-config.xml 를 만들고 있다. 나도 그에 따라서 spring의 xml 파일 대거 리팩토링!

그리고 나는 hibernate를 쓰고 있었는데, roo는 jpa를 선호하는 것 같으니 jpa설정까지 해 줌. (설정을 복사하는 수준).

덕분에 pom.xml 파일도 수정이 필요했는데, roo프로젝트의 pom.xml을 참고해서 빠진 것들 복사함.

그런 다음 roo shell에서 jpa setup 명령했더니 ... 별로 하는 일 없음. 내가 이미 다 했음.

이제 도메인 클래스들을 손볼 차례인데, 이 부분이 작업이 크다. Controller, Repository 모두 손봐야 한다.

이제 entity jpa --class <기존 클래스> --testAutomatically
했더니.. 뜨아... 내 클래스 덮어 씀. 그냥 기존 클래스 위에
@RooJavaBean
@RooToString
@RooJpaActiveRecord
@RooEquals
네개의 annotation 추가. 글고 테이블에 version 칼럼 추가.

이 때, 다른 화면을 실행 해보니 동작은 함. 하지만 jpa가 사용되고 있는 것은 아니고 여전히 hibernate 기반으로 동작하는 것이겠지. 방금 수정한 entity에 대한 controller는 에러 남.

IllegalStateException  Post-processor tried to replace bean instance of type XXX with (proxy) object of type [YYY] not supported for aspect-configured classes


하지만 

java.lang.IllegalStateException: Post-processor tried to replace bean instance of type [kr.co.gaon.irs.basic.Bank] with (proxy) object of type [$Proxy112] - not supported for aspect-configured classes!


왠지 늪에 빠진 느낌. 글고 sts 3.0으로 하고 있는데 이게 아직 안정화가 덜 되서 그런지 너무 느리다. 도대체 뭘 하고 있는지 모르지만 cpu는 100~200% 기본이고...

sts 재시작 한 번 해주고... (씁쓸하구만...) 그래도 문제 해결은 안되고...

검색해보니 @Configurable 과 @Transactional 을 같이 쓸 수 없다는 얘기가 나온다. 아니다. 어라... 되네? 아까 Build Automatically를 잠시 꺼두었던거 때문인가? 

계속하자. 이젠 Table 이름을 잘못 찾아가고 있다. @RooJpaActiveRecord(table="BankAccount") 라고 했는데, bank_account 라는 테이블로 sql이 날아간다. 
이 문제는 persistence.xml 에서 ImprovedNamingStrategy 때문에 발행하는 것. comment out하자.

이제 동작한다. 휴~~

하지만... 왜 일케 메모리 사용량이 많은겨... reload 한 번 하면 2G를 채워버리네...

<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
이 녀석 때문인가? 


javaagent 방식으로 바꾸니 좀 낫구나. 아니다. 마찬가지구나.

<context:load-time-weaver aspectj-weaving="autodetect" />
삭제해도 잘 동작한다. 지우니 메모리 사용량이 떨어졌다.

오늘은 일단 여기까지.

2012-08-20

맥에서 vmware로 맵피 설치

맥에서 맵피 업데이트 하려고 vmware fusion 에서 삽질하고 있는데, xp가 sd카드를 자꾸 write protected로 인식해서 할 수 없이 깨끗한 xp vm에서 하니 제대로 sd 에 쓸 수 있게 되었음.

그런데 맵피 Smart Connector 가 한글이 다 깨지고... (내 xp가 영문버전이라 그럴 수 있음. 하지만 예전에는 잘 나왔다구!)

대충 설치에는 문제 없겠지 하며 전체설치를 진행하는데 이젠 머 다운로드가 안돼. 몇번을 해도 안돼. 또 다운로드 안돼서 설치 중단된 것 같은데 왜 오류보고 보낼라 그러나? 그러지 말라고 체크박스를 uncheck하려해도 클릭할 수 없다. ㅋㅋㅋ 할 수 없이 그냥 확인.


결국 오늘은 설치 포기. 내일 다시.

update. 08.22) 프로그램의 한글이 깨지는 이유는 XP 언어 설정 중에 유니코드가 아닐 경우 사용할 인코딩 설정이 영어로 되어 있었음. Korean 으로 바꿀려 했더니 xp 씨디 넣어라 하네. 귀찮음. 어쨌거나 이 설정 때문에 음성파일이 다운로드가 안되고 있었음.

eclipse의 tomcat launch configuraton

이클립스 workspace를 dropbox 폴더 안에 두고 사용하는데, 드랍박스가 너무 고생하는 것 같아 톰캣 webapp 경로를 temp 디렉토리로 변경했음.

-Dspring.profiles.active=DEV -Dcatalina.base="/Users/shawn/temp/wtp" -Dcatalina.home="/Users/shawn/apps/tomcat" -Dwtp.deploy="/Users/shawn/temp/wtp/wtpwebapps" -Djava.endorsed.dirs="/Users/shawn/apps/tomcat/endorsed" -Xmx1024m -XX:MaxPermSize=512m

2012-08-13

@PathVariable 이름만 바꾸었을 뿐인데

두개의 컨트롤러에서 같은 시그너처의 핸들러가 메소드만 다르고 모두 같을 때(클래스 레벨 매핑까지), 스프링 시작하면 에러 난다. 같은게 있다고. 이럴 수가... 했는데

PathVariable 이름을 바꾸니 된다. 헉. 그렇다면 PathVariable 이 없을 때는 어떻게 되나? 에이 테스트하기 귀찮아.

예방접종 안하는 이유

어린이 집에서 왜 예방접종을 안하는지에 대해 부모님의 의견서가 필요한 모양이다. 자꾸만 제출해 달라고 독촉이 온다.

현재 우리 아이는 29개월이다. 아직까지 한번도 예방접종을 하지 않았다. 현재 매우 건강하다. 밥도 매우 잘 먹고. 몇 번의 열과 감기 증상이 있었지만 병원과 한의원을 오가며 진찰을 받고 적절히 판단하여 필요하다면 약을 먹이거나, 혹은 굳이 먹일 필요가 없다고 판단될 때에는 각탕과 같은 요법을 처방했더니 스스로 이겨 내었다. 밥도 뚝딱 잘먹고 병치레도 거의 없으니 참으로 고마운 일이다. 아는 후배의 경우 아이가 자주 아파 걸핏하면 병원에 간다는데 우리는 그럴 일이 없으니...

사실 이렇게 건강한데에는 집사람의 노력이 컸다고 생각한다. 임신전, 임신중에도 스스로 먹거리를 매우 조심했고 운동도 열심히 했는데, 사실 이게 쉬운게 아니다. 우리가 일상에서 먹는 군것질 대부분이 아이에게 좋지 않다. 엄마의 건강이 아이의 건강이라고 했을 때, 우리 아이가 건강한 이유의 99%가 이러한 엄마의 노력 때문일 것이라고 생각한다. 지금도 군것질은 하지 않으려고 노력하고 있다. (그런데 요즘 점점 이 녀석이 군것질에 맛들이고 있다. 큰일이다. ㅋㅋ. 외사촌 누나 영향이 크다.)

제목에는 예방접종 안하는 이유라고 적었지만 사실 끝까지 안할 생각은 없다. 다만 지금 굳이 해야 하나 의심할 뿐이지. 오히려 백신을 통해 예방을 하는 것보다는 우선 몸 자체의 면역력을 올리는 것이 더 중요하지 않겠는가. 백신 접종은 열심히 하면서 먹거리와 자연 치유력에 신경쓰지 않는다면 너무 쉽게 몸을 생각하는 것이 아닌가.

그리고 백신의 위험성에 대한 두려움도 있다. 백신의 위험성에 대해서는 안전한 예방접종을 위한 모임 에서 좀 더 다양한 주장을 읽어 볼 수 있다. 이 사이트에 있는 주장을 믿느냐고 묻는다면 별로 할 말은 없다. 이런 주제는 워낙 양쪽 주장이 첨예하게 부딪치는 문제라 쉽게 어느쪽 주장에 손을 들어 주기는 어렵다. 단지 주장이 문제가 아니라 그 근거를 알려면 의학 및 관련 통계에 대해서도 지식이 풍부해야 한다. 나같은 일개 프로그래머가 머라 주장하기는 좀 힘들다. (하지만 살아보면 느낌이란게 있긴 하지).

그리고 나는 자본(제약회사. 병원. 그에 종사하는 이해관계자들)이 하는 일을 크게 믿지 않는다. 자본은 기본적으로 돈버는 일에만 관심이 있지 선량한 의지는 없다. 문제가 생기면 문제없다고 뻐팅기기만 하고, 결국 문제가 드러나면 슬그머니 후퇴한다. 백신의 역사도 그렇다. 백신의 부작용이 이렇게 알려진 것도 그 누군가의 피눈물과 항의가 있었기 때문이지 그들은 스스로 문제점을 인정하지는 않는다. (혹시 아직도 백신에 수은이 있나 모르겠네). 국가가 하는 일도 마찬가지다. 국가는 기본적으로 자본의 대리인이 아니던가. 국가는 백신 예방접종에만 신경쓰지 말고, 전 국민의 먹거리 안전과 자연 치유력 향상을 위해 더 노력해야 할 것이다. 하지만 그들이 과연 그렇게 해 줄까?

(웬지 제목이 검색에 너무 쉽게 노출될 것 같다. 댓글로 엄청 까일 것 같은 불길한 기분이...)

2012-08-10

스프링 @MVC 수정 폼 처리하기

Spring MVC 3.0: How do I bind to a persistent object

@ModelAttribute의 쓰임새는 무엇인고?

How does @ModelAttribute work?

@RequestMapping(value="/user/{id}", method=RequestMethod.PUT)
public String submit(@ModelAttribute User user) {
   ...
}

@ModelAttribute("user")
User loadUser(@RequestParam(defaultValue="-1") long id) {
    if (id == -1)
        return new User();
    log.info("Loading user info from db: " + id);
    return userService.findById(id);
}

이 코드가 의도하는 것은 @ModelAttribute 가 바인딩 되기 전에 db로 부터 User 객체를 로드하는 것이다. 이렇게 db에서 user를 로드한 다음 바인딩하면, User 필드에는 있지만 폼에는 필드가 없어서 기존 db 필드를 null로 지워버리는 불상사를 막을 수 있다.

문제는 위 코드의 경우 loadUser()가 이 컨트롤러의 다른 메소드에도 실행된다는 것이다. 이건 좀 깔끔하지 못하다. 좋은 방법을 모르겠다. 위 코드만 따로 뽑아서 새로운 컨트롤러를 만들 수도 있겠다. 이렇게 하면 엔티티마다 XxxModifyController 를 만들어야 한다. 이것도 그리 썩 좋지는 않지만 다른 방법이 없네.

ConversionService로도 안될 것 같고. @SessionAttributes를 사용하면 한 세션에 여러 엔티티에 대한 폼을 열 경우 문제가 된다.


update(2012.9.6): 위 해결책도 나름 방법이긴 하지만 ConversionService를 이용하면 된다. 그러나 스프링 3.1이후에서만 된다.

2012-07-27

인간에 대한 오해

두번째 오류는 서열화(ranking)다. 사람에게는 보잡한 자료들에 번호를 매겨 점차 상승하는 단계로 늘어세우려는 버릇이 있다. 진화상의 변화가 진보를 향해 나아가며, 점진적으로 발전한다는 통념이 대표적인 것이다(그러나 실제 진화는 반드시 진보적이지 않고 오히려 퇴화하는 것처럼 보이기도 하며, 대개 방향성보다는 다양성의 증가 형태로 나타난다). 이런 서열화를 위해서는 모든 사람을 한 줄로 늘어 세워야 하고 제각기 어울리는 지위를 부여하기 위한 기준이 필요하다.  
그리하여 나타나는 세번째 오류가 정량화이다. 이것은 숫자로 모든 것을 바꾸어 표현하는 것이다 (IQ검사와 같은 간단한 테스트...)...

- 하리하라의 '과학고전카페 1' 인간에 대한 오해 중

2012-04-16

밥따로 물따로


요즘 음식 조절 중이다. 밥따로 물따로.


아침 저녁 두끼만 먹고 있다. 물은 식사 전후 2시간에는 먹지 않는다. 국과 찌게는 먹지 않는다. 몸무게는 5kg 정도 빠졌다. 몸무게는 아직도 계속 빠지는 느낌이다. 더불어 간식도 먹지 않는다. 어쩌다 먹어도 단거, 짠거, 고기는 먹지 않는다.


몸무게가 빠지는 이유는 물을 안먹어서인 것 같다. 그 외에는 딱히 내 생활이 바뀐 것이 없으므로. 음… 술도 안먹고 있구나.


물을 안먹으면 갈증날 것 같아 어떻게 하지? 하고 생각하는 사람이 있을 것 같은데 의외로 갈증날 일이 없더라. 식사후 2시간 후에 물을 먹으면 되는데 2시간 동안 무언가에 집중하고 있으면 시간 금방 가고, 또 막상 물 먹어도 될 시간이 되어 먹을려고 하면 또 그다지 물먹고 싶은 맘도 없고.


밥따로 물따로에 대해서는 큰형이 아주 오래전(10년도 넘은 것 같아)에 소개해 주어서 알고는 있었는데 이번에 관련 책도 좀 더 조사해 보면서 더 자세히 알게 되었다. 관련 서적으로는 다음 정도 읽어보면 된다. 주요 서적은 ‘밥따로 물따로 음양식사법’이다.



그냥 소개만 받은 것이 아니고 우리 가족 중에 두 분이 이 방법의 혜택을 입었다. 아버지께서는 뇌경색으로 몸이 움직이지 못할 뻔 했는데 이 방법으로 단 몇개월만에 멀쩡해지셨다. 형수께서도 심장에 종양이 있었는데 몇개월 후에 종양이 사라졌다는 진단이 나왔다.


물론 책에는 이보다 더 많은 사례가 있다. 가장 생생한 사례는 ‘4개월의 기적’ 책을 읽어보면 된다. 사이트는 여기이고 이상문 선생님의 강의 동영상도 있다.


밥물의 핵심은 밥따로 물따로인데 부언하면 몸이 뜨거워져야 할 때에 물로 불을 끄는 짓을 하지 말라라고 요약할 수 있다. 몸이 장작불처럼 타오를 때에 아무 때나 시도 때도 없이 물을 마셔대니 몸이 축축해지고 활발함을 잃는다는 것이다. 그러니 병이 날 수 밖에.


내가 해 본 결과 일단 호흡이 안정됨을 느낄 수는 있었다. 이런 안정감 이전에는 무언가 항상 떨림이 있었다고 (지금 미루어) 생각하고 있다. 내 몸이 쓸데 없이 바쁜 것이다. 이로 인해 몸이 항상 긴장하고 있고, 들떠 있는 것이다. 밥물을 하면서는 호흡이 안정되니 복식 호흡도 더 잘된다. 그 외 더 좋은 점은 좀 더 해봐야 알겠고. 최소한 보름 이상은 해야 한다고 한다.


사실 내가 정확하게 밥물식사를 하고 있는지 잘 모르겠다. 언젠가 신대방에 있는 사무실을 찾아가서 코칭을 좀 받아야 될지도 모르겠다.


그런데 내가 왜 이런걸 하게 되었느냐.


요즘 소화가 너무 안된다. 그래서 저번 주에 병원가서 암 정밀진단, 심장정밀진단 받았다. 위내시경 결과로는 ‘만성위축성위염’, ‘장상피화생’이 나왔다. 이번주 금요일에 정확한 진단 결과가 나온다. 어디서 들어보니 ‘장상피화생’은 거의 위암 직전 단계더라. ㅠㅠ