Whiteship's Note


[결혼] 반년차 부부의 걱정 - 적자

모하니?/Thinking : 2009.12.22 14:45


요즘 내가 버는 돈으로는 멀리보면 2세를 키우기가 힘들어 보이고, 당장은 적금을 줄여야 하는 상황이 닥쳐왔다. 당연히 대책 마련에 들어갔지만 별다른 대책은 없다. 내가 지금 버는 돈에서 갑자기 두 배 이상은 커녕 50만원도 더 벌어 올수가 없는 노릇이다. 현재도 그렇지만 장기적인 내 장래도 그리 밝지 않다. 물론 난 순수하게 노력을 하고 있지만 시간이 지날수록 이상하게 내 앞은 더 깜깜해지는 것만 같다. 대딩때도 이렇게 불안하진 않았는데 요새는 공부를 해도 불안하기만 하다.

아무튼, 이 상황에서 아내가 내 놓은 해결책은 아내가 더 빡쎄게 돈을 벌어오겠다는 것이었다. 아내는 요즘 내가 한달에 버는 돈의 세 배 이상을 벌어봤기 때문에 지금 내가 벌어다 주는 돈이 굉장히 답답하게 느낄 수도 있을 것 같다. 나야 그만큼 벌어본적이 없어서 잘 상상은 안되지만, 그 반대로 내가 지금 버는 돈의 절반도 못벌던 대딩때를 떠올려보니 가슴이 답답해진다.

처음 나는 아내의 이야기를 들었을 때 반대도 찬성도 하지 않았다. 잘 생각해보고 알아서 결정하라고 했다. 원래는 영어 학원 강사로 일을 하다가 지금 다니는 피아노 학원으로 옮긴 이유는 아내가 받는 스트레스를 줄이기 위해서였다. 버는 돈은 조금 차이가 나더라도 시험기간 마다 주말에 학원에 나가서 봐주는 것 때문에 우리 부부가 주말에 무언가를 할 수 있는 기회가 사라지고 요즘 애들과 부모들이 개념을 상실했기 때문에 받는 스트레스도 이만 저만이 아니었다. 그래서 좀 덜 부데끼는 피아노 학원 강사로 옮겼다. 월급은 20% 가량이 줄었지만 이전보다 직장 스트레스를 덜 받았으며 주말에는 즐겁게 보드도 타고 다니고 양가 부모님 댁도 간간히 왕래할 수 있게 되었다. 하지만 아내의 줄어든 월급과 나의 고정된 수입으로 인해 재정적인 적자가 발생하기 시작했다. 이런 상황에서 다시 직장 스트레스보다 재정적인 스트레스가 과중해졌다면 아내의 판단을 따르지 않을 이유가 없었다.

사실 나는 아내의 의견보다는 장모님의 의견을 더 신뢰한다. 아내는 약간 성급한 경향이 있다. 하지만 그만큼 타이밍을 빨리 잡아내기 떄문에 어떤 문제 상황을 조기 발견하고 그 해결책을 굉장히 빨리 찾을 수도 있다는 점에서는 정말 뛰어나다. 장모님은 다양한 경험을 가지고 있으며 아내를 잘 알고 있기 때문에 가장 현명한 해결책을 주신다.

(아내가 이 글을 보면 서운할 수도 있겠지만 원래가 그런거니까 서운해 할 필요가 없다고 말하고 싶다. 우린 절대로 장모님을 비롯한 어른들의 경험보다 더 많은 것을 경험해볼 수 없거니와 빠르게 문제 상황을 인지한다는 것 자체로도 나는 굉장히 고마워하고 있다는 걸 알아줬으면 한다. 나는 문제 상황을 인지도 못했을 뿐 아니라 어떠한 해결책도 못 내놨으니 정말 한심한 건 나뿐이다.)

어쨋거나 상의한 결과는 가장인 즉 내가 버는 수준에 맞춰 살라는 것이었다. 적금은 줄이면 되고 먹고 싶은 것과 하고 싶은 걸 안하면 된다. 애기는 나오면 그때에 가서 생각하면 되고 나오면 나오는대로 또 어떻게든 방법이 생긴다고 한다. 맞는 말씀이다.

내가 돈을 조금 밖에 못 벌어다 주는게 굉장히 미안하긴 하지만, 부끄럽지는 않다. 나는 돈이 목적인 인생을 살지 않으려고 노력한다. 되도록이면 재밌고 행복하게 살려고 노력한다. 돈을 벌려고 내가 하고 싶지도 않은 일을 하거나, 남을 속여서 돈을 벌거나, 남들의 앞길을 막거나, 집에서도 짜증을 낼 정도로 스트레스를 받아가며 일한다거나, 억지스러운 술자리에 참석하며, 가식적으로 누군가의 비위를 맞춘다던지, 주말도 없이 일을 한다던지, 실제 하는 일은 없으면서 그럴싸하게 포장된 명함으로 돈을 번다던가, 한마디로 드럽게 돈을 벌지 않으려고 노력한다는 것에 조금의 자부심 마저도 느끼고 있다.

원하는대로 못 살아서 조금 불편하겠지만 계속해서 이런 이런 신념을 지키며 살 수 있도록 노력할 것이고 언젠가는 이런 신념을 지키면서 살더라도 람보르기니를 선물할 수 있는 그날이 오면 난 정말 기쁠 것 같다.

당장은 많이 미안하지만 조금만 불편하게 살자꾸나.

ps: 이 얼마나 무능력하고 무대뽀인 가장이란 말인가.. 캬...
top


스프링 3.0의 MVC 간편화

Spring/3.0 : 2009.12.22 11:42


원문: http://blog.springsource.com/2009/12/21/mvc-simplifications-in-spring-3-0/
봄싹위키: http://springsprout.org/wiki/1556.do

유겐아렌이 언급했듯이, 모든 자바 개발자는 부담없이 스프링 3.0으로 버전을 올릴 수 있다. 이제 스프링 3이 나왔고 나는 여러분이 아직 모르고 있을 법한 MVC 기능을 소개하고자 한다. 이 기능들이 여러분에게 유용하고 웹 애플리케이션 개발을 빠르게 시작하는데 도움이 되기를 바란다.

또한 이 글은 "스프링 3 간편화" 시리즈의 시작으로 앞으로 몇일 또는 몇주 동안 이와 비슷한 글들이 올라올 것으로 예상한다.

설정 간편화

스프링 3은 mvc 네임스페이스를 도입하여 스프링 MVC 설정을 대폭 간편화했다. 지금까지 다른 개선사항들은 스프링 MVC 애플리케이션을 구성하고 실행하는것을 간편화 시켜주지는 않았다. mvc-basic 예제를 통해 살펴보도록 하자.

mvc-basic 예제는 스프링 MVC 기능의 기본 구성을 보여주도록 만들었다. 프로젝트는 spring-samples SVN 저장소에서 얻을 수 있으며 메이븐으로 빌드하고 이클립스로 import할 수 있다. web.xml 부터 시작하여 거기에 있는 설정부터 살펴보자. 주목할 것은 DispatcherServlet이 단일 마스터 스프링 설정 파일로 설정되어 있고 그 안에서 모든 애플리케이션 구성요소를 초기화한다. URL Rewrite를 설정하여 모든 요청을 깔끔하고 REST-스러운 URL로 DispatcherServlet에 보낸다.

마스터 설정 app-config.xml에서 일반적인 구성을 살펴볼 수 있다. 컴포넌트 스캔으로 클래스패스에서 애플리케이션 구성요소를 찾는다. MessageSource를 설정하여 지역화된 리소스 번들을 설정한다. 마지막으로 애플리케이션의 스프링 MVC 설정을 import한다.

mvc-config.xml 안에서 스프링 3의 첫번째 새 기능을 볼 수 있다.

<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />

이 태그는 요청을 @Controller로 디스패치할 때 필요한 HadlerMapping과 HandlerAdapter를 등록한다. 또한 클래스패스에 무엇이 있는지에 따른 감각적인 기본값(sensible defaults)을 제공한다. 그러한 기본값은 다음과 같다.

- 자바빈 PropertyEditor 보다 더 견고한 대체제인 스프링 3 타입 ConversionService 사용하기
- @NumberFormat으로 숫자 필드 포매팅 지원
- @DateTimeFormat을 사용하여 Date, Calendar 포매팅 지원. Joda Time이 클래스패스에 있다면 Joda Time도 포매팅 지원.
- JSR-303 공급자가 클래스패스에 있다면 @Controller 입력값을 @Valid를 사용하여 검증
- JAXB가 클래스패스에 있다면 XML 읽기/쓰기 지원
- Jackson이 클래스패스에 있다면 JSON 읽기/쓰기 지원

꽤 멋지지 않은가? 훗

계속해서 mvc-config.xml 다음 줄에서 또다른 새로운 기능을 살펴보자.

<!-- Forwards requests to the "/" resource to the "welcome" view -->
<mvc:view-controller path="/" view-name="welcome" />

mvc:view-controller는 랜더링할 뷰를 선택하는 ParameterizableViewController를 등록한다. "/"를 요청하면 welcome 뷰를 랜더링하도록 설정했다. 실제 뷰 템플릿은 /WEB-INF/views 디렉토리의 .jsp가 랜더링 된다.

계속해서 mvc-config에서 살펴보지 않은 새로운 기능을 보도록 하자.

<!-- Configures Handler Interceptors -->
<mvc:interceptors>
    <!-- Changes the locale when a 'locale' request parameter is sent; e.g. /?locale=de -->
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>

mvc:interceptors 태그는 모든 컨트롤러에 적용할 HandlerInterceptor를 등록하게 해준다. 이전에는 반복적으로 모든 HandlerMapping 빈에 interceptor들을 등록했었다. 또한 이 태그를 사용하여 인터셉터를 적용할 URL 경로를 제한할 수 있다.

자 지금까지 살펴본 것을 종합하여, 예제를 배포하면 다음과 같은 welcome 뷰가 랜더링 될 것이다.


다른 지역 링크를 클릭하여 LocaleChangeInterceptor가 사용자 지역을 교체하도록 해보자.

데이터 바인딩 간편화

다음으로 설명할 새 기능은 @Controller 바인딩과 검증이다. 몇주 전에 글을 올렸다시피 이 부분에 새로운 기능이 많이 있다.

예제에서, @Controller Example 링크를 클릭하면 다음과 같은 폼이 랜더링 된다.


이 폼은 지역 정보 변경에 따라 국체화 필드 포매팅이 적용된다. 예를 들어, en에서 de로 바꾸면 날짜 형식을 12/21/10에서 12.12.10으로 바꾼다. 이런 동작과 폼 검증 규칙은 모델 애노테이션을 기반으로 한다.

public class Account {

    @NotNull
    @Size(min=1, max=25)
    private String name;

    @NotNull
    @NumberFormat(style=Style.CURRENCY)
    private BigDecimal balance = new BigDecimal("1000");

    @NotNull
    @NumberFormat(style=Style.PERCENT)
    private BigDecimal equityAllocation = new BigDecimal(".60");

    @DateTimeFormat(style="S-")
    @Future
    private Date renewalDate = new Date(new Date().getTime() + 31536000000L);

}

폼 서브밋은 다음의 AccountController 메서드가 처리한다.

@RequestMapping(method=RequestMethod.POST)
public String create(@Valid Account account, BindingResult result) {
    if (result.hasErrors()) {
        return "account/createForm";
    }
    this.accounts.put(account.assignId(), account);
    return "redirect:/account/" + account.getId();
}

이 메소드는 바인딩과 검증 작업 이후에 호출되며, Account 검증은 @Valid 애노테이션에 의해 수행된다. 만약 어떠한 검증 에러라도 존재한다면 createForm을 다시 랜더링 한다. 그렇지 않을 경우 Account는 저장되고 사용자는 http://localhost:8080/mvc-basic/account/1로 리다이렉트 된다.

또 다른 멋진 기능을 사용해보려면 /account/99 같이 존재하지 않는 계정을 요청해보기 바란다.

요약

스프링 3은 다양한 새 기능과 여러 기존 분야에 대한 간편화를 제공한다. 이 글을 통해 여러분에게 유용한 새로운 스프링 MVC 개선 사항들을 파악했기를 바란다. 맨 처음에 언급했듯이 더 많은 "스프링 3 간편화" 시리즈를 통해 계속해서 스프링 최신 버전의 새롭고 흥미로운 기능들을 소개할테니 기대하기 바란다.

즐거운 연휴되시길!

top