달력

6

« 2025/6 »

  • 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
2009. 10. 1. 06:18

Introduction HTML 5 좋아하는 것/Google2009. 10. 1. 06:18

어제 우연히 Google Code 사이트에 들어가 보니, 새로운 세미나 동영상이 몇개가 어제 날짜로 추가되었다. 이 동영상은 그 중에 하나로 "Introduction HTML 5"라는 제목으로 올라와 있었다. 최근에 여러 경로를 통해서 HTML 5애 대해서 소개되고 있고, 관심이있는 주제라 나름 열심이 보았다.

새로운 것에 관심을 갖는 것은 내 개인적인 성향이지만, 새로운 것이기 때문에 반드시 써야 한다고 고집하지는 않는다. HTML 5는 HTML 4가 발표되고 사용된지 10년이 지난 후에 나온 것이지만, 완전히 새로운 기술은 아니고, 이미 사용되고 있는 기술들이다. 단지 이는 기존 기술들을 좀도 표준화하고 정규화 함에 지나지 않을 수도 있지만, 이를 통해서 우리가 표현하고자 하는 것들일 서로 다른 브라우져에서 동일하게 표현될 수 있다는 점에서 큰 의미가 있을 것이다. 하지만 이를 위해서는 좀더 시간이 필요할 것 같다. 새로운 기술 또는 표준이 온전히 쓰이기 위해서는 양보와 타협이 선행되어야 하는데, 브라우져 개발사 마다 자신들에게 유리한 기술과 스펙을 표준으로 삼기위해 보이지 않는 싸움이 계속되기 있기 때문이다.

이 비디오는 한국어 자막도 없이 진행되기 때문에 이해하기 어려운 점이 많을 수 있지만, Presentation화면과 데모 동영상을 보면 대부분을 쉽게 이해할 수 있을 것이다.



동영상은 약 42분 정도로 진행되고, 최근에 제작된 동영상이라 화질과 음색이 좋다.

열심히 공부하고 열심히 배워서, 좋은 개발자가 되자. ^^

:
Posted by 행복상자
2009. 9. 30. 00:07

어떤 리더십을 원하는가? 행복/나의 생각2009. 9. 30. 00:07

사람은 후천적으로 배우는 자인가? 타고난 재능으로 살아가는 자인가? 라는 질문들은 어려서부터 많이 들어왔던 질문이고, 스스로에게 또는 주변에 많은 사람들과 여러가지 상황에서 반문하는 질문일거다.

회사에서, 학교에서 그리고 가정에서 또는 남자라면 당연히(?) 다녀오는 군대조직에서 어떤 목적을 향해서 탁월한 리더십을 보여주는 사람들이 있고, 이들을 자신의 역할 모델(role model)로 삼아서 닮으려고 노력할 것이다.

사람은 사회적 존재라 사람들과 여러가지 형태로 관계를 맺으면서, 살아가고 있고 이러한 관계속에서 조직의 형태가 나타나기도 하지만, 외부에서 바라볼때는 결과론 적으로만 리더십을 바라볼 것이다.
어떤면에서 이러한 것이 객관성을 부여할지도 모르지만, 이 자체로는 개개인이 생각하는 역할모델을 모두 만족시키기 어려울 뿐더러, 여러가지 상이한 이견들이 존재할 것이다.
하지만 궁국적으로 자신이 생각하는 모습이 있을 것이고, 이를 통해서 자신이 생각하고 있는 가치관이 자연스럽게 발현될 것이다.

내가 어렸을때부터 배웠던 리더십은 섬김의 리더십이었다. 다른이들을 자신과 같이 동등하게 또는 보다 우월하게 여기면서 배풀고 배려하는 리더십이었다. 일반적으로 약하자가 강한자를 돕기보다는 강한자가 약하자를 돕는 것이 흔히볼 수 있는 풍경이다. 우리가 살고 있는 상식적인 세상에서는 말이다.
섬김의 리더십 역시 강한자가 약한자를 돕기 위한 리더십이고, 이러한 리더십으로 인해 세상의 시계는 정상적으로 돌고 있는 것이다.

내가 철이들고 일을 시작하면서 보고 배웠던 리더십은 역할모델을 통한 리더십이었다.
이는 내가 닮고 싶어하는 열망과 배우고 싶어하는 강한 욕구가 만들어 내었던 것이었는데, 여러 종류의 다양한 사람들이 이 안에 포함된다.
부족한 내면의 모습과 역량들을 다른 사람을 통해서 알고, 이를 배워서 나의 부족한 부분들을 채우려 했던 것이다. 어떤 때는 좋은 모습을 배울수 있었고, 어떤 때는 좋다라고 생각했던 모습이 내가 수용할 수 없었던 적도 있었다. 하지만, 부족한 부분들은 메꿈에 있어서는 정도에 차이는 있었지만 나에게 유익했다고 생각하고 있고, 지금도 내게 영향을 주고 있다.

누군가는 이글을 보고 이렇게 이야기 할지 모른다. 가치관이 형성되고 있고, 이를 통해서 인격이 형성되고 있는 것이라고 말이다. 나도 그 이야기에 100% 동의한다.
리더십이란, 리더가 리더십을 이야기함으로써 세워지는 것이 아니라, 리더를 바라보는 사람들이 그를 쫒기를 결정함으로써 만들어지기 때문이다. 스스로 만들어 세우는 것은 제대로 된 리더십을 세울수 없기 때문에 사람들 또는 팀원들에게 강요가 되고, 강제가 될 수 있고, 때로는 공포가 될 수 있다.

내가 만났던 다양한 리더십들의 소유자들은 강력한 카리스마를 가졌던 사람들도 있었지만, 그 영향력은 그렇게 오래 지속되지 않았었다. 스스로 그를 배우려고 노력하는 사람들이 없어지면, 아무리 강한 카리스마 조차도 조만간 사라지고 말 뿐이다.
좋은 리더를 만나면, 단지 혜택만 누려서만 안된다. 결국 배우고 받은 것들을 나누어 주어야, 영속성이 생기고 계속 누릴 수 있는 것이기 때문이다. 그리고 이용해서도 안된다. 그 리더십이 더 큰 힘을 받을 수 있도록 옆에서 도와 주어야 한다. 결국은 희생이 없이는, 노력이 없이는 가치가 유지되기 힘들다.

자, 그러면 나는 어떠한 리더십을 가졌을까? 사람들이 나를 배우려고 노력을 하나? 과연 나는 내 자신의 얼굴을 바로 세울만큼 잘 살고 있는 것일까? 이러한 것이 단이 남을 의식하는 것인지? 아니면 스스로를 반문하면서 자신의 모난 부분을 깨뜨리는 과정일지 스스로에게 물어보게 된다.

이러한 것이 너무 길다면, 간단한 질문이 내게 있다.
결과적으로 내가 사랑하는 아이에게 나는 어떤 사람으로 생각되어 질까?

내가 살아가면서, 좋은 사람들을 많이 만나게 해다라고 기도하곤 한다. 그리고 그들을 만나서 같이 일하고 이야기 할 수 있는 것들이 너무나도 감사하다. 다들 하는 일과 목표하는 것들이 잘 풀려서 잘 살았으면 좋겠다.

오늘 갑자기 여러 생각들이 들어서, 펜을 들어 글을 썼는데, 이유는 팀을 옮기면서 좋은 사람들을 많이 만날수 있어서이고, 이전에 같이 일하다가 대학교 교수로 자리를 옮겨간 누군가와 오늘 기분좋게 만나게 되어, 기뻐서 이기 때문이다. 이런 와중에 호주에서 잠시 한국에 들어와 지난 토요일과 일요일, 연 이틀동안 나를 바람 받게한 일민(Toby)가 생각났기 때문이다.

이런 와중에도 갑자기 "무슨 부귀영화를 누리려고..."라고 말했던 류모씨가 생각이 나는 까닭은 무슨 연고인가? ^^
:
Posted by 행복상자
기다렸던 사람들이 많았을 것 같다. 이제야, 오늘에야 Spring 3.0.0 RC1이 나왔으니까 말이다. 물론 Toby(일민)이를 비롯한 몇몇 선행적인 개발자들이 이미 열심히 공부하고 있고, 이의 전달도 열심인 것에 비하면, 최근에 나는 크게 관심을 두려고 노력하지 않았다. 개인적으로는 다른 사업부로 옮겨와서, 새로운 일을 맡아서 관심이 적어진(?) 것도 있지만, 사실은 그것 보다도, 기존에 내가 만든 Framework는 스프링 2.5.5 또는 2.5.6을 기반으로 설계되어 있다. 그리고 이것을 이용하여 여러 솔루션들이 개발되고 있는 중이어서, 자체 개발한 Framework의 Minor 체인지가 아닌 Big 체인지를 결정하기 쉽지 않기 때문이다. 만약 그것을 결정해야 한다고 해도 2년 후가 될 것이다. (상품으로 그리고 서비스를 하고 있는 시스템을 변경하기란 많은 결정해야할 문제에 직면해야 하는 용기가 필요한다. 그러나 이것은 모험이 아니다.)

현재 Springframework에서 제공하고 있는 메이져 Branch는 2가지이지만 앞으로는 3가지가 될 것이다.
Springframework 1.2 와 2.5 그리고 향후 주축이될 3.0이다.
그리고 이제는 3.0 Release Candidate 1이 나왔다. 이제는 또 열심히 공부할 시점이 된 것이다.
여러가지 변경된 API라이브러리들도 있고, 추가된 라이브러리들이 있는데, 이중에서 가장 먼저 눈에 들어왔던 것은 Jackson JSON라이브러리이다. 이른 아침에 Jackson 투터리얼을 보면서 시간 가는줄 몰랐다.
앞으로 정식 버전이 나올날이 멀지 않았지만, 언제가 될지는 잘 모르겠다. 올해 안에는 나오지 않을지...

Springframework 3.0 RC1의 변경 사항은 다음의 링크를 보면된다.

그리고, 아래는 이번에 RC1에 추가된 내용이다.

Changes in version 3.0.0.RC1 (2009-09-25)
-----------------------------------------

* upgraded to CGLIB 2.2, AspectJ 1.6.5, Groovy 1.6.3, EHCache 1.6.2, JUnit 4.7, TestNG 5.10
* introduced early support for JSR-330 "javax.inject" annotations (for autowiring)
* introduced early support for JSR-303 Bean Validation (setup and MVC integration)
* added default editors for "java.util.Currency" and "java.util.TimeZone"
* refined PathMatchingResourcePatternResolver's treatment of non-readable directories
* PathMatchingResourcePatternResolver understands VFS resources (i.e. works on JBoss 5.x)
* revised AccessControlContext access from BeanFactory
* AbstractBeanDefinitionParser can deal with null return value as well
* PropertyOverrideConfigurer's "ignoreInvalidKeys" ignores invalid property names as well
* PropertyPlaceholderConfigurer supports "${myKey:myDefaultValue}" defaulting syntax
* BeanFactory's default type conversion falls back to String constructor on target type
* BeanFactory tries to create unknown collection implementation types via default constructor
* BeanFactory supports ObjectFactory as a dependency type for @Autowired and @Value
* BeanFactory supports JSR-330 Provider interface as a dependency type for @Inject
* BeanFactory prefers local primary bean to primary bean in parent factory
* protected @Autowired method can be overridden with non-annotated method to suppress injection
* private @Autowired methods with same signature will be called individually across a hierarchy
* @PostConstruct processed top-down (base class first); @PreDestroy bottom-up (subclass first)
* ConfigurationClassPostProcessor detect @Bean methods on registered plain bean classes as well
* support for default "conversionService" bean in an ApplicationContext
* MBeanServerFactoryBean returns JDK 1.5 platform MBeanServer for agent id "" (empty String)
* changed NamedParameter/SimpleJdbcOperations parameter signatures to accept any Map value type
* refined logging in JMS SingleConnectionFactory and DefaultMessageListenerContainer
* introduced "ui.format" package as an alternative to PropertyEditors for data binding
* @RequestMapping annotation now supported for annotated interfaces (and JDK proxies) as well
* @RequestParam and co support placeholders and expressions in their defaultValue attributes
* @Value expressions supported as MVC handler method arguments as well (against request scope)
* JSR-303 support for validation of @MVC handler method arguments driven by @Valid annotations
* refined response handling for @ExceptionHandler methods
* @ResponseStatus usage in handler methods detected by RedirectView
* all @SessionAttributes get exposed to the model before handler method execution
* @Event/ResourceMapping uniquely mapped to through event/resource id, even across controllers
* MultipartRequest is available as a mixin interface on (Native)WebRequest as well
* removed outdated "cacheJspExpressions" feature from ExpressionEvaluationUtils
* introduced common ErrorHandler strategy, supported by message listener container
* Jpa/JdoTransactionManager passes resolved timeout into Jpa/JdoDialect's beginTransaction
* HibernateJpaDialect applies timeout onto native Hibernate Transaction before begin call
* Spring's Hibernate support is now compatible with Hibernate 3.5 beta 1 as well
* Spring's JPA support is now fully compatible with JPA 2.0 as in EclipseLink 2.0.0.M7
* SpringJUnit4ClassRunner is now compatible with JUnit 4.5, 4.6, and 4.7
* SpringJUnit4ClassRunner once again supports collective timeouts for repeated tests
* deprecated @NotTransactional annotation for test classes in favor of @BeforeTransaction








:
Posted by 행복상자
지난번에 글을 쓸때는, 예상했던 것보다 시간이 많이 필요했는데, 어느덧 이른 6시, 출근할 시간이 되어서 이야기를 다 마무리 못하고 펜을 집어 넣어야만 했다.

지난번 글에서는 자바에서 Exception Handling이 어떻게 생성되고, 호출하는 코드로 어떻게 알려주게 되는지를 간략하게 이야기 하였다. (뭐 간략하다고 했지만, 이미 알고 있는 내용들이 었을 것이다.)
그리고 RuntimeException의 유형의 예외들은 컴파일러에서 신경을 쓰지 않기 때문에, 반드시 Try-Catch로 블록을 만들어 줄 필요가 없다는 것을 이야기 했다. (이 경우는 개발자가 코드상에서 해결해 주어야 한다는 것도 같이 이야기 했다.)

마지막으로, Eclipse와 같은 IDE에서 자동으로 생성되는 예외 처리 코드에 관해서도 이야기 했는데, 자동으로 생성되는 메커니즘도 이야기 했었는데, 더불어서 사용할 때 주의해야 할 것은 자동으로 생성된 코드로 인해서 예외처리가 끝났다고 착각하지 말아야 한다는 것이다. 실제 예외에 대해서 프로그램 또는 클래스에서 예외처리에 대한 코드가 들어가야하고, 이를 로그로 저장하거나 화면에 뿌려줄때는 좀더 사용자 친화적인 내용으로 저장하고, 보여주어야 추후에 유지보수하기 쉽다.

오늘은 이전에 시간이 모자라서 하지 못했던 이야기를 하려고 한다.
일반적으로 try-catch블럭의 사용을 잘 알고 있을 것이고, 더불어서 finally의 사용 또한 잘 알고 있을 거라 생각한다. 호출해야 할 코드는 try블록에다 정의하고 만약 예외가 호풀되면, 이를 제어하기 위해서 catch 블록에서 정의한 코드가 호출되고, 그리고 다시 코드가 실행된다. (try 블록에서 예외가 발생했던 코드 라인 이후는 호출이 되지 않는다.)

만약, 여기에 finally구문을 사용할 경우가 있는데, 아시다 시피 이는 try 또는 catch블록에 정의된 내용이 실행과 상관없이 정의되어 있다면 만드시 실횅되도록 정의되어 있다.
이 경우에 try 또는 catch구문에 return 문이 있다면 어떻게 될까?
try 또는 catch 블록에 return 문이 있다면, 일단 finally구문에 정의된 소소 코드들을 실행하고 나서 다시 return문으로 돌아 온다는 점에 유의 해야 한다.

예외도 객체이기 때문에 이를 상속받아서 새로운 예외들을 만들수 있다. 때문에 예외처리시에 아래와 같이 모든 예외를 한번에 다 잡을 수도 있지만, 이는 바람직하지 않다. 이전글에서 설명한 것처럼 어떤 메소드를 호출할때 어떤 메소드가 호출될 것인지가 클래스와 메소드 정의서가 정의된 문서를 보면 확인할 수 있다.

try {
      runAnyCode();
} catch (Exception ex) {
     recoveryCode();
}

위의 코드의 경우는 예외느 다 잡을수 있을지 모르지만, 어떤식으로 예외를 관리할지는 전혀 알수 없다. (물론 때에 따라서는 상위의 예외로 부터 하위의 것을 모두 잡는 것이 유용할 수도 있다. 따라서 유의해서 사용해야 한다.) 꼭 필요한 경우가 아니라면, 예외별로 잘 정의해서 사용해야 한다. 아래는 예이다.

try {
      runAnyCode();
} catch (anyCodeException aex) {
     recoveryCode();
}

마지막으로 정말 중요한 것은, 예외 처리에서 순서가 있다는 것이다.
그렇기 때문에 다중으로 예외를 선언한 경우에 주의가 필요하다. 만약 어떤 예외를 상속 받아서 새로운 Exception 들을 만들었다면, 상속 받았던 에외들을 먼저 선언해 주어야 한다. 그렇지 않다면, 원하지 안는 결과를 얻을 수도 있다.
왜냐하면, JVM 에서는 첫번째 Catch블록에서 부터 호출된 예외를 처리한 Catch블럭을 찾아 내려오기 때문이다. 만약 가능한 예외 블록이 있다면, 비교를 멈추고 catch블록에 정의된 예외처리 코드들을 실행하게 된다.
따라서 만약에 첫번째 catch블록이 catch(Exception ex)라고 정의되어 있다면, 컴파일러는 다른 catch블록이 전혀 필요 없다고 생각할 것이다. (왜냐하면 이외의 catch 블록의 코드는 전혀 실행되지 않을 것이기 때문이다.) 
아래 코드에서 어떤 코드는 실행되지 않을 까요? 
try {
      runAnyCode();
} catch (Exception ex) {
     recoveryCode();
} catch (anyCodeException aex) {
     recoveryCodeNotRun();
}

내가 하고 싶은 이야기는 사실 마지막에 이야기 하고 싶은 내용이었다. Exception에도 순서가 있고 진행되는 방향이 있다. 하지만 이를 모르고서 코드를 작성한다면 의미없는 코드를 생성하게 되고 결국은 나중에 코드의 문제를 찾는데 많은 시간을 들여야 한다는 것이다. 가장 기본 적인 이야기지만 간과하는 부분이기도 해서 이야기 하고 싶었다.

이전에 인도 개발자들이 만들어 낸 코드들 분석하면서, 내가 경험했던 것들인데, 예외 처리를 했기 때문에 문제가 없을 거라는 막연한 믿음보다는 예외처리시에 필요한 코드상에서 처리해 부분(RuntimeException)들과 catch문을 사용할 때도 우선 순위를 생각하면서 정의할 것등을 반드시 숙지해야한다.
무엇보다도 가장 판단하기 어려눈 것은 try-catch문을 아무 생각 없이 중첩해서 사용하는 경우인데, 이 경우는 가독성도 떨어지지만, 예외 처리 코드를 분석하기 매우 어렵기 때무에 되도록이면 피해야 한다.




'공부하는 것 > Java' 카테고리의 다른 글

Java에서의 Exception 처리시 유의할 사항(1)  (0) 2009.09.17
:
Posted by 행복상자