반응형
방법론에 대한 견해가 있어서 펌

  1. 출처 : http://erwins.springnote.com/pages/2880322
  2. 처음 책 보고 썼을땐 멋있어 보였는데 나중에 보니까 이게 웬 헛소리.. ㅠㅠ

  3. 개요

    1. 소프트웨어 공학에 무수한 개발 방법론이 있고 다양한 산출물이 있지만 이미 실제 개발자에게는 무시된 지 오래이다. 개발자에게 방법론을 거론해봐야 무시당하기 쉽다.
    2. 비단 한국에 국한된 일뿐만이 아니다.  소프트웨어로 가장 유명한 기업인 MS에서조차 예외는 아니다. 거대한 산출물을 쌓아서 창고에 처박아버리고 다시는 보지 않는 사태는 전 세계 에서 일어나고 있다.
    3. 혹시 당신의 회사가 "비주얼 어쩌구 아키텍트" 라고 불리는 거창한 소프트웨어 방법론 환경을 구상 한다 던지 UML과 XP사이에서 갈팡질팡 하고 있다면 이미 문제에 봉착해 있을 확률이 높다.
    4. 유명한 스타 개발자 조엘은 자신의 책에서 화성인 아키텍트를 이야기 한다. 화성인 아키텍트가 화성에서나 가능한 플랜을 지구로 가져오지 않는 것이 개발자를 돕는 것이다.
    5. 이 바닥에서 4년이면 자신이 알고 있는 지식의 50%를 갱신해야 한다고 한다. 이로 인해 소프트웨어 엔지니어링과 현실간의 갭은 점점 더 멀어져 다른 나라 이야기 인 듯 들린다.
    6. 왜 이런 현상이 일어나는 것일까?
  4. 기초를 알자 : 2가지 개발 방법론의 종류

    1. 개발 방법론

      1. 방법론 자체가 이미 너무나 오래된 생각이다. 개발자들 사이에서 방법론은 조롱거리가 된지 오래이며 심지어 방법론 무용론을 주장하는 사람들도 있다.

      2. 특히나 SI시장의 대부분을 차지하는 웹 개발은 그 특수성 때문에 설계 자체가 필요 없다는 주장도 많다.

      3. 대부분의 개발 방법론은 박사 학위, 또는 논문을 위해 경험 없는 대학원생이나 교수에 의해서 만들어 진다.

      4. 방법론 공학 연구 커뮤니티에서 조사한 결과 방밥론을 그대로 실무에 적용하는 실무자는 거의 없음이 밝혀졌다. (By 소프트웨어 공학의 사실과 오해:인사이트).  그리고 지금도 방법론은 만들어지고  있다.

    2. 개발 방법론을 분류하는 것은 개인의 판단마다 다르다. 공신력을 위해서 가장 권위 있는 ant(By apache재단) committer의 말을 인용한다.

      ant자체가 XP와 밀접한 관계가 있는지라 약간의 편향된 의견일수도 있다.  XP와 RUP는 가장 널리 알려진 방법론으로 그 외의 방법론들은 이것의 변형이라 할 수 있다.

      또한 이 둘은 구체적인 방법과 도구를 제시한다. 따라서 이들 두 가지 방법론을 알아본다.

      1. Rational Unified Process(RUP)

        1. Rational Software Corporation에서 만들었다. Rational Rose의 제작사이다. (현재는 IBM에 합병)
        2. UP가 방법론이며 RUP는 그것을 상품화한 Rational사의 상품이다. 이것으로 1998년도에 난립해있던 컨설팅 회사들를 평정할 수 있었다.
        3. 핵심 키워드는 “설계”이다. 반복적이며 관점적(Perspective)이고 아키텍쳐 중심적인 프로세스 모델로서,
          이 모델에서 소스코드란 프로젝트의 이터레이션(iteration)을 통해 생성되는 산툴물의 하나에 불과하다.
        4. 아이러니 하게도 원 설계자는 그래디 부치는 패턴 도입에도 공한을 한 객체지향 공학의 권위자 이다. 그는 GOF의 디자인 패턴의 서문을 썼으며 애자일 연합체의 설립 멤버이기도 하다.
          (이는 RUP와는 대조적인 성격의 것으로 RUP의 근본적인 문제점을 공격했다.)
        5. 설계 기간을 길게 잡은 후 개발에 들어간다. 모토는 뼈대를 잡은 후 살을 붙이자는 것이다. 개념화->구체화->구축->전이 등의 이터레이션 반복으로 설계가 완료되면 신속한 개발이 가능하나 추후 수정 사항 발생시 대처가 곤란하다. 개발 완료시까지 배치기 지연된다.
        6. 핵심은 UML 등의 문서이다. 쉽 고, 표준화되고 언어에 상관없이 모든 개발 프로세스를 정형화할 수 있는 UML은 각 개발자와 사용자, 고객과의 통신 수단이 되며 중요한 산출물 중의 하나이다. UML을 이용해 개발을 모르는 관리자도 검수가 가능하며 개발자들 간의 의견 소통을 돕고 오해를 미연에 방지한다.
        7. 테일러링을 통해 프로젝트에 적합한 방법론을 구현할 수 있다. XP방법론도 이 입장에서 보면 RUP를 소규모 프로젝트에 적합하게 리테일러링 한 것에 불과하다.
        8. 소스코드는 이러한 UML을 특정 형태(자바, C#등)에 맞추어 서술한 것에 불과하다. UML은 객체 지향을 표현하는 표준 언어이기 때문에 이을 이용해 어느 언어로든지 단기간에 전이가 가능하다. 이상적이지 않은가? 더 이상 말 안듣는 프로그래머는 필요 없다. 코더와 설계자만 있으면 된다!
        9. XP는 산출믈을 만들기 싫어하는 개발자들의 핑계에 불과하다. 작인 Iteration으로 나누어 개발하는 애자일 기법은 나무만 보고 숲을 보지 못하는 우를 범할 가능성이 크다.
      2. eXtream Programing(XP) (1999 XP explained)

        1. XP란 eXtream Programing의 약자로 “가장 단순한 것이 가장 좋은 것이다.“를 모토로 한다.
        2. 창시자인 켄트벡은 짝프로그래밍, TDD(테스트주도개발), 디자인패턴, 리랙토링 등을 대중화 시킨 가장 유명한 프로그래머들 중 하나이다. (이미 열렬한 신봉자들의 교주가 되어버렸다.)
        3. 핵심 키워드는 “코드진화”이다. XP는 최초의 요구사항이 후반에 반드시 바뀔 것을 당연시한다. 이를 위해 변화에 따른 비용 그래프의 증가 곡선을 평평하게 프로그램을 유지한다. 즉 개발 후반부에 기능을 추가하는 것이 초반에 추가하는 것과 크게 다르지 않다.
        4. 전통적인 폭포수 개발형태를 접한 사람이라면 이런 것이 가능할지 의문이 들것이다. XP는 자체문서화, 리팩토링, 자동화 도구(Ant등), 단위테스트(JUnit) 등으로 이것을 가능하게 한다. 이는 모두 IDE와 프로그래밍 기술의 발달로 가능해진 것이다.
        5. 자체 문서화(따로 문서를 만들지 않고 소스 자체를 문서화한다), 프로그래밍 패턴을 통해 빠른 설계가 가능하다. 설계는 필요이상 하지 않는다. 이후 지속적인 리팩토링을 거치기 때문에  개발후반 수정사항이 생기더라도 개발 초반과 동일한 수정 기간만이 필요하다.
        6. 소스코드 차제가 문서이자 산출물이며 개발자의 개발 의도를 표현해준다.
        7. 개발자와 설계자가 달라서 생기는 엄청난 비극을 미연에 방지해준다. 즉 책임의 소재가 명백하다.
        8. 초기에 10인 이하의 프로젝트용으로 평가받았으나 기술의 발달로 RUP를 빠르게 대체해가고 있다.
  5. 문서화 / UML의 문제점

    1. IDE 의 발달로 개발은 점차 자동화 되어가도 있지만 문서는 그렇지 않다. 즉 성과에 비해 시간이 너무 많이 걸린다. 이를 극복하기 위해 리버스 엔지니어링 이라는 편법이 동원된다. 물론 이 짓은 산출물을 위해 보여주기 위한 종이문서를 생산하기 위한 것으로 본래의 취지와는 안드로메다로 떨어지게 된다 무엇을 위한 산출물일까? 가능하다면 더 이상 책상위에 문서가 있어서는 안 된다. Trac, JIRA 등의 걸출한 이슈트래커가가 있음에도 엑셀을 사용하는 것은 왜일까? 답은 당신이 사용할 줄 몰라서 이다.
    2. 개발자가 보기에 문서보다는 IDE의 지원을 받는 소스가 이해하기 편하다.  개발자를 위한 문서란 대부분의 경우 있을 수 없다. 전달 매체가 책이라면 클래스 다이어그램의 압승이다. 하지만 PC를 사용 가능하다면 실제 코드를 이클립스로 보는 게 훨씬 쉽고 정확하다.

      MSDN을 생각하자. MS는 소스를 오픈하지 않았기 때문에 MSDN이라는 거대하고 복잡한 매뉴얼을 만들 수 밖에 없었다. 이렇게 거대한 매뉴얼을 만들었지만 아직도 개발자들의 불만은 끊이지 않고 있다. 소스 10장을 문서화하고 모든 예외상황을 기술하려면 100장도 모자란다.

    3. 실제 정상적인 작업에서는 refactoring작업이 빈번히 일어난다. 밥을 먹다가도 더 좋은 메소드 이름이 생각나면 하루에도 '몇 번씩 수정을 하는 일이 비일비재 하다. 사용자가 보기에 거창한 수정이라도 IDE 또는 프레임워크의 도움으로 간단히 끝나는 경우가 많다. 이들은 IDE가 자동으로 하지만 문서는 손으로 고쳐야 한다. 일이 일을 만든다. 소스 1시간 고치고 이를 위해 4개의 문서를 수정해야 한다면 당신은 하겠는가? 원시시대로 돌아갈 생각인가?
    4. 한번 에 좋은 설계를 하는 것은 불가능하다. UML 모델링으로 설계를 수정 하는 것 보다 refactoring으로 소스를 직접 수정 하는 것이 더 빠르고 쉽고 안전하다. IDE는 오타를 내지 않는다.
    5. 소스로 UML을 만들어 내는 것은 쉽지만 UML로 소스를 만드는 것은 매우 어렵다. (자동화 도구의 부재이다.) UML작성 후 소스코드 작성이라는 이중 작업을 수행해야 한다.
  6. RUP의 문제점

    1. 최근의 대세는 XP이며 특히나 문서에 취약한 반면 툴 사용에 능숙한 개발자는 대부분 XP를 선호한다. (개발자가 아닌 사람은 대부분 RUP를 선호하는듯..) 나역시 XP를 선호하니 RUP의 약점을 공격해 보겠다.
    2. RUP의 중요 원리중 “문서 작업을 최소화 하라”, “유연하라” 등이 있다. 하지만 공룡과도 같은 이 기법은 이를 무색하게 만든다.
    3. 앞의 RUP태생을 말했던가? 이는 다분히 상업적인 전략이며 이 방법론의 주 임무는 다음과 같았다. 첫째 관련된 CASE툴의 판매, 둘째 컨설팅 시장을 장악하는것.
    4. 완벽한 요구사항 도출로 후반 수정사항을 없애겠다는 RUP의 시도는 실패로 끝났다. 이는 한국만의 문제점이 아니다. 갑에게는 완벽했던 요구사항을 한방에 뒤집기란 손바닥 뒤집듯 쉬운 일이다. 무수한 수정으로 문서의 존재 이유가 떨어진다. 문서의 업데이트에 너무 많은 시간이 소요된다. 문서의 정확도 역시 떨어진다. 이로 인해 만들어놓은 문서를 보지 않게 된다.
    5. refactoring의 발달로 설계의 중요성이 예전만큼 중요하지는 않다. 시간이야 좀 걸리겠지만 테스트만 잘 작성되어 있다면 개발 후반에도 얼마든지 수정이 가능하다. 썩은 기둥을 안고 가는 것 보다는 현명한 판단이 될 것이다.
    6. 산출물을 작성해도 그것을 읽을 줄 아는 고객은 전무하다. UML은 생각보다는 쉽지 않다. 간단하게 표현하는 데는 여전히 효율적이지만 조금만 세부적으로 들어간다면 다이어그램이 복잡해지고 알아보기 힘들게 된다.
    7. RUP에 의하면 소스는 단순히 개발 과정의 산출물일 뿐이다.  RUP를 기반으로 한 산출물(보통 UML)만 있다면 어떠한 개발언어로든지 변경이 가능하다. 즉 설계자가 설계만 잘하면 단순 코더들이 이 설계(산출물)를 토대로 소스를 뽑아낸다는 말이다. 여기서 박사급 설계자는 고급 인력이고 실제 개발자들은 단순 코더화 된다. 개발자들이 이러한 프로세스를 좋아할리 없다. ORM을 모르는 DBA와 개발을 많이 접해보지 못한, 2~3년 전의 옛날 책으로 공부한 고급 설계자들은 시대에 뒤떨어진 엉뚱한 설계를 내어놓는다. 팀내의 불화가 생기고 프로젝트는 위기로 향한다. 이 UML을 가지고 소스를 코딩하라고요? 농담이시겠죠?
    8. 설계자와 코더가 동일한 사람이 아니라면 이는 문제 발생의 소지가 커진다. 무책임한 셜계가 나오고 설계가 아무런 쓸모 없어질 가능성이 매우 크다.
    9. ORM 등의 각종 프레임워크와 미들웨어, JUnit, SVN, ANT등의 자동화된 도구를 사용할 줄 모르는 사람도 설계를 한다. 이들은 설계에 지대한 영항을 미치는 것들로 설계자가 이를 모른다면 엄청난 비극을 불러올 것이다. 물론 이 비극은 전세계에서 매일 일어나고 있다.
    10. 웹 중심 개발로 인한 설계의 모순  ?? 잘 모르겠음.

      1. 현재 대부분의 SI는 엔터프라이즈(클라이언트-서버-DB를 all-in-one으로 개발하는것) 개발이다. 그리고 엔터프라이즈의 대부분은 웹개발이다. 웹개발은 서버프로그램 , 클라이언트 프로그램으로 나뉜다. 리치 클라이언트와 Ajax등의 기술이 유행하면서 클라이언트 프로그램의 중요성이 점점 더 커지고 있다.

      2. 하지만 위에서 말한 개발방법론은 모두 객체지향 프로그래밍에 해당하는 것으로 클라이언트 프로그래밍에 사용되는 스크립트 언어에는 해당되지 않는다.

      3. 산출물에서 클라이언트 스크립트 언어에 관한 자료를 찾아 불 수 있는가? 즉 당신이 보는 문서는 반쪽짜리이다.

      4. 텍스트 기반인 스크립트 언어는 특성상 구조적으로 배치가 가능하면서도 설계가 자유롭고 변형이 쉽기 때문에 문서를 남기는 것이 매우 힘들다. 이 다이나믹한 언어들은 심지어 런타임으로 평션(자바로 따지자면 class)의 수정마저 가능하다. 이는 RUP에서는 받아들이기 힘든 체제이다. 소스 그 자체를 문서로 보고 지서속적인 리팩토링을 하는 것만이 대안일 것이다.

  7. 한국에 특화된 문제점

    1. 완벽한 인원과 충분한 기간, 그리고 환상적인 고객과 개발 금액이 조화를 이룰 때 RUP방법론이 성공할 수 있다.

      1. 하지만 하도급이 보편화된 한국에서 그럴 일은 없다. 한국에서 실제 프로젝트 금액의 몇%가 실제 개발비로 사용될까? 한번 생각해 보라.

      2. 흔히 빅3로 불리는 대기업과 발주기업의 유착관계는 실제 투입비용을 절반 이하로 떨어트려서 SI산업의 하향평준화에 큰 공을 세웠다.

    2. RUP가 적용 가능한 대형 프로젝트의 경우 단일 업체에서 체계적인 프로젝트 진행이 가능한 경우는 없다. 대부분 끊임없는 하도로 이어져 을 업체마저 어디까지 하도가 되었는지 관리가 거의 불가능하다.

    3. 명확한 정의가 없다. 화려한 미사어구로 표현했지만 정작 읽어보면 애매모호하거나 다의성을 지닌다. 이는 공학에서 금기시해야 하는 원칙이지만 소프트웨어 공학에서 만큼은 당연하리만큼 통용된다. 공학이지만 코드도, 수학도, 과학도 없다. 단지 말뿐이다.  끔찍하다.

    4. 제안서 기술평가 항목에 방법론은 들어가지만 실제 소프트웨어의 질을 결정하는 사항들은 빠져있다. 방법론에 거창한 것이 들어가 있지 않으면 점수를 받기 힘들다. 한국에서 XP방법론은 요원한 것이다. 이것은 제도의 문제일 것이다.

  8. 결론

    1. 이미 컴포넌트의 재사용, RUP, CBD식의 방법론 같은 것들은 실패한 것으로 대부분 판명되었으다. 시대에 뒤떨어진 이러한 문제를 생각하느라 시간을 허비하지 말자.

    2. 재사용에 관한 훌륭한 대안으로 “디자인 패턴”을 공부하라. 이는 유일하게 실무에서 나온 이론으로 개발자들의 열렬한 환호를 받고 있다.

    3. 당장 아무것도 도움이 안되는, 개 풀뜯어 먹는 소리만 해대는 소프트웨어 공학을 잊어라. 그리고 수십년 간의 프로그래밍 노하우와 연구들, 이론들이 집대성된 ANT, SVN, OSGi, Maven, Trac같은 도구들을 공부하고 사용하라. 앞서 고생한 선배들의 가르침이 담겨 있을 것이다.

반응형
반응형

Our highest priority is to satisfy the customer

through early and continuous delivery

of valuable software.

우리가 가장 중요하게 여기는 것은

제 시간에, 지속적으로 가치 있는 소프트웨어를 인도함으로

고객을 만족시키는 것이다.

방법론의 변천

1970년대가 되어서야 폭포수 방법론이 등장했고, C 4세대 언어 도구들이 등장한 80년대에는 생명주기 관점에서 소프트웨어 개발 방법을 바라보게 되었다. 90년대가 되어서 반복과 통합된 프로세스를 토대로 하는 RUP가 등장했고, 이를 계승한 컴포넌트 기반 방법론인 CBD가 현재 위세를 떨치고 있다.

이와는 다른 관점에서 나온 방법들이 있다. 카네기 멜론 소프트웨어 공학 연구소에서 나온 업무능력 성숙도 평가 기준(Capability Maturity Model; CMM)은 개발 프로세스 향상을 통해 성공적인 프로젝트 수행이 가능하다고 얘기하고 있고, 중소규모의 개발팀에 적용해서 큰 효과를 보고 있는 XP방법론이 유행하고 있고, XP와 뜻을 같이하는 여러 방법론들의 연합체인 애자일 방법론도 개발자들 사이에서 큰 흐름을 형성하고 있다.


eXtreme Programming (XP)

Kent Beck이 만든 방법론으로 기존의 개발 방법론은 위에서 아래로 진행하는 반면 XP방법론은 아래부터 위로 향하는 습성을 갖고 있다. 농담 삼아 하는 얘기인지 모르지만 프로젝트에서 갈 데까지 간 개발자들이 극한의 상황에서 살아남기 위해서 만들어졌기 때문에 extreme이라는 단어를 붙였다고 한다.

XP에서 얘기하는 내용을 보면 방법론이라기 보다는 개발자 개인 및 팀원 간의 습관이라고 보는 것도 무리가 없다. 그림 8.에서 제일 안쪽에 있는 원은 개인의 실천사항을 얘기하고 있고, 중간의 원은 팀원간의 실천사항을 표현하고 있다. 제일 바깥의 원은 전체 프로젝트에서 일어나는 실천사항을 표현한다.


사용자 스토리가 나오면 스파이크라고 하는 핵심 기술을 빨리 구현해서 보일 수 있는 시범 프로그램을 만들어서 기한내에 완성이 가능한 스토리인지 가늠해 본다. 그 이후 구체적인 계획을 잡고 개발을 하고, 최종적으로 사용자 스토리에 있는 내용을 테스트케이스로 잡아서 고객의 인수테스트를 통과하면 작은 배포버전을 만든다. 보통 이 기간을 2주로 잡고 있으며 2주마다 기능을 추가해서 동작하는 소프트웨어를 만들어간다. 물론 처음에는 아주 기본적이고, 핵심적인 프로그램으로 시작하고, 2주 분량의 기능만 추가해서 진행하기 때문에, 고객은 진행되는 일의 산출물을 보면서 안도하고, 개발자는 동작하는 프로그램의 배포에서 꾸준한 성취감과 동기부여를 얻을 수 있다.

반응형
반응형
회사에 설치된 VPN Clien 와 개인인증서등의 파일

반응형

'취미 그리고 생각' 카테고리의 다른 글

읽어볼책 - Free  (0) 2010.01.25
하나노케이지  (0) 2010.01.11
쇼핑몰 하우투코디  (0) 2009.08.13
openvpn Windows Client config dir  (0) 2009.08.09
좋은책 고르기  (0) 2009.08.08
반응형
멀티랭귀지가지원되는 버전의 Java EE SDK를 사용하면 문제가 쉽게 해결되지만
설치된 SDK가 그렇지 못할때는

//1.번
MS Windows에서 C:\WINDOWS\Fonts 디렉토리에 있는 'gulim.ttc', 'batang.ttc', 'mingliu.ttc' 이렇게 3개의 한글 관련 파일을 LINUX에서 Java가 설치되어 있는 위치에서 fonts 관련 디렉토리 (${JAVA_HOME}/jre/lib/fonts)로 복사해 놓습니다.
새로 복사한 3개의 한글폰트 파일들을 ${JAVA_HOME}/jre/lib/fonts/fonts.dir 파일에 아래처럼 등록합니다.
<초기등록되어_있던_폰트_갯수> + 3
...
batang.ttc -ms-batang-medium-r-normal--0-0-0-0-c-0-ksc5601.1987-0
gulim.ttc -ms-gulim-medium-r-normal--0-0-0-0-c-0-ksc5601.1987-0
mingliu.ttc -ms-mingliu-medium-r-normal--0-0-0-0-c-0-ksc5601.1987-0
 
최초 등록되어 있던 폰트 파일 갯수가 72개였다면, 새로 3개의 폰트 파일을 더 등록하므로 총 75개가 되고 이 값을 맨 첫줄에 적어준 후, 새로 등록할 3개의 폰트 파일을 위처럼 추가로 적어줍니다.
 
2.번
${JAVA_HOME}/jre/lib 디렉토리에 'font.properties.ko' 파일을 만들어 한글폰트를 등록해서 사용하면 됩니다

첨부 :
반응형
반응형
java로 데몬 형태의 프로그램을 작성할 경우가 있다.
이때 기동이야 java 커맨드로 실행을 하지만,
중지시키기 위해서는 Ctrl+C 를 하거나 백그라운드 실행시 Kill 을 시켜야 하거나 한다.
좀 더 있어보이기 위해 여타 다른 데몬처럼 start, stop 커맨드를 사용하도록 만들어 본다.

핵심은 shutdown 을 처리를 ServerSocket 을 열고 해당 포트에 대한 Socket 통신으로 이루어진다는 점이다. 만들고자 하는 데몬이 통신서버라면 기존 통신 포트 외에 컨트롤 포트를 하나 더 사용하는 것이다.

Tomcat 의 경우 server.xml 의 맨 처음에 나오는 것은 다음과 같다.
<Server port="8005" shutdown="SHUTDOWN" debug="0">
여기서 port 가 바로 shutdown 처리를 위한 포트이고, 이 포트에 shutdown 으로 설정된 SHUTDOWN을 소켓으로 보내면 Tomcat 이 중지된다.

아래는 톰캣과 유사한 형태로 작성한 소스이다.
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.AccessControlException;
import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;


public class Server {
 private static final String COMMAND_SHUTDOWN = "shutdown";
 private static final int COMMAND_PORT = 8099;
 
 private boolean started;
 private Random random;
 private Timer timer;
 
 private Server() {
  this.started = false;
  this.random = null;
  this.timer = null;
 }
 
 private void start() {
  // 여기서 서버가 수행하는 쓰레드를 start시킨다(반드시 쓰레드이어야 한다).
 
  // 에로서 Timer를 사용하여 1초마다 메시지 출력...
  this.timer = new Timer();
 
  timer.scheduleAtFixedRate(
    new TimerTask() {
     public void run() {
      if ( started )
       System.out.println("1초마다 메시지");
     }
    }
    ,new Date(),1000 );
 
  await();
 }
 
 private void stop() {
  // 서버가 수행하던 쓰레드를 중지시킨다.
  // 예로써 Timer 중지...
  this.timer.cancel();
  this.timer = null;
 
  System.out.println("중지되었습니다.");
 }
 
 /**
  * 서버소켓을 열고 shutdown 요청이 있을때까지 대기...
  */
 protected void await() {
  try {
   ServerSocket serverSocket = null;
   try {
    serverSocket = new ServerSocket(COMMAND_PORT, 1, InetAddress.getByName("127.0.0.1"));
    started = true;
   } catch (IOException e) {
    e.printStackTrace();
   }
   while ( started ) {
    Socket socket = null;
    InputStream stream = null;
    try {
     socket = serverSocket.accept();
     socket.setSoTimeout(10*1000 );  // 타임아웃 10초...
     stream = socket.getInputStream();
    } catch (AccessControlException e) {
     continue;
    } catch (IOException e) {
     System.exit(1);
    }
   
    StringBuffer command = new StringBuffer();

    // Cut off to avoid DoS attack
    int expected = 1024;
    while ( expected < COMMAND_SHUTDOWN.length() ) {
     if ( random == null )
      random = new Random(System.currentTimeMillis());
    
     expected += (random.nextInt() % 1024);
    }
   
    while ( expected > 0 ) {
     int ch = -1;
     try {
      ch = stream.read();
     } catch (IOException e) {
      ch = -1;
     }
     // EOF
     if (ch < 32) break;
    
     command.append((char)ch);
     expected--;
    }

    // 소켓을 닫는다.
    try { socket.close(); } catch (IOException ignore) {}
   
    String cmd = command.toString();

    // shutdown 명령시 루프 중지
    if ( COMMAND_SHUTDOWN.equals(cmd) ) {
     break;
    }
   }
   // 서버 소켓을 닫는다.
   try { serverSocket.close(); } catch (IOException ignore) {}
  } catch(Throwable t) {
   t.printStackTrace();
  } finally {
   // 서버 종료 처리...
   try { stop(); } catch (Throwable ignore) {}
  }
 }
 
 /**
  * 소켓으로 shutdown 커맨드를 보낸다.
  */
 private static void shutdown() {
  Socket socket = null;
  OutputStream os = null;
  try {
   socket = new Socket("127.0.0.1", COMMAND_PORT);
   os = socket.getOutputStream();
   for (int i = 0; i < COMMAND_SHUTDOWN.length(); i++) {
    os.write(COMMAND_SHUTDOWN.charAt(i));
   }
   os.flush();
  } catch(Throwable t) {
   t.printStackTrace();
   System.exit(1);
  } finally {
   try { os.close(); } catch(Throwable t) {}
   try { socket.close(); } catch(Throwable t) {}
  }
 }
 
 
 public static void main(String[] args) {
  try {
   if ( COMMAND_SHUTDOWN.equals(args[0]) ) {
    shutdown();
   } else {
    Server server = new Server();
    server.start();
   }
  } catch (Throwable t) {
   t.printStackTrace();
  }
 }
 
}

실행/종료 : java Server start / java Server shutdown


반응형

'개발도 하냐?' 카테고리의 다른 글

XP 개발방법론  (0) 2009.12.06
JAVA Application 한글깨짐 해결  (0) 2009.12.03
웹접근성을 보장하는 웹개발을 위한 고려사항  (0) 2009.12.02
Cross Domain Script 해결법  (0) 2009.12.01
HTML vs XHTML?  (0) 2009.12.01
반응형
오랜만에 웹표준이란 태그로 북마크해둔것을 들어가서 정리했습니다.
웹사이트를 개발하기전에 한번씩 읽어본 후 해보시기 바랍니다.


0. DTD, Charset 공통 정의

1. 의미있는 구조적인 HTML 구성
 -html 작성을 위한 가이드라인 : http://html.nhndesign.com/html_guideline
 -자주발생되는 오류에 대한 가이드 : http://html.nhndesign.com/html_validation_guideline

2. Global, Layout CSS 제작
-CSS제작을 위한 가이드라인 : http://html.nhndesign.com/css_guideline

3. 접근성있는 Navigation 제작(키보드접근확인)

4. Section CSS 제작

5. 브라우저 호환성 테스트

6. 접근성 준수지침 검토

7.웹표준코딩의 장점 예
- TABLE VS DIV : http://www.thlife.net/34

8. table 에 th를 사용한 예제 : http://kukie.net/resources/design/using_th/using_th_table.html

9. css를 이용한 레이아웃의 사용 예 : http://naradesign.net/open_content/reference/layout/

10. 웹표준 준수를 통한 이익 : http://kukie.net/resources/benefits/index.htm

11. 드림위버에서 제목표기 단축키 : 제목표기하기 (단축키 ctrl+1 ~ ctrl+6)
 - 아래의 CSS를 만들어서 테스트해보자 (ctrl+3)
 - h3 {padding:8px 0 5px 35px; background:#EEE url(h3_ bullet.gif) no-repeat 5px center; border-bottom:1px solid #CCC }

 12. 드림위버를 이용한 접근성 높은 테이블 제작 : http://naradesign.net/wp/2006/09/14/63/

 13. 드림위버를 이용한 ‘Markup+CSS’ 브라우저 호환성 검사 : http://naradesign.net/wp/2006/09/28/75/

 14. 특수문자 및 HTML Spacial Entities. : http://naradesign.net/wp/2006/10/30/86/

 15. 웹접근성을 준수하는 사이트 제작 템플릿의 예 : http://db.garada.co.cc/html/form.htm
반응형
반응형

익스플로러 5.5(?) 이후 부터는 스크립트로 server1.abc.com 과 live.abc.com 간의 상호 도메인이 다른 프레임이나 윈도우의 document에 관련된 작업을 시도하면 보안에러가 발생한다.

Cross-Frame Scripting 에 대한 MS의 말..
http://msdn2.microsoft.com/en-us/library/ms533028.aspx

넷스케이프 같은 경우에는 스크립트(Signed scripts)에서 브라우져자체에 포함(?)된 클래스(netscape.security.PrivilegeManager)를 호출하여 이를 해결할 수 있다고 한다.

Signed Scripts 에 대한 Mozilla의 말..
http://www.mozilla.org/projects/security/components/signed-scripts.html

그럼에도 불구하고 다른 도메인에 대한 opener 나 parent 접근이 필요할 경우에는 JavaScript 를 통해 document.domain 을 설정해 주면된다.
<script language="javascript">
    document.domain = "공통도메인명";
</script>
상호 연결 시켜야 하는 웹 페이지에 자신들의 공통된 도메인을 지정해 주면 컨트롤이 가능해진다.

만약, server1.abc.com의 open.htm이 window.open 으로 live.abc.com을 호출하고 live.abe.com 의 child.htm이 opener 로 server1.abc.com 을 접근해야 한다면
다음 스크립트를 두 페이지에 정의해 주면 되고, 스크립트는 페이지 어디에 위치해 있든지 특별한 상관은 없다.

<script language="javascript">
    document.domain = "abc.com";
</script>

※ 주의, 도메인 명을 잘못 입력한 경우에는 "잘못된 인수입니다." 라는 JavaScript 오류가 발생한다.

=========================================================================================
cross frame scripting 을 해결하는 다른 방법으로는 HTA가 있다.
html페이지가 아닌 hta(html application)페이지를 만들어야 한다.

http://msdn.microsoft.com/workshop/author/hta/hta_node_entry.asp

※ 다음은 HTA에서 javascript로 iframe의 document를 참조한 예

확장자를 hta로 저장하시고 브라우저로 실행.

<html>
<head>
  <title>hta cross scripting</title>
  <script>
    function window.onload() {
       alert(myframe.document);
    }
  </script>
</head>
<body scroll="no">
  <iframe id=myframe src="http://kin.naver.com/"></iframe>
</body>
</html>

다음에, 예를 하나 들면..
kin.naver.com을 iframe에 넣고 검색어에 "스크립트"라는 단어를 넣은 후 검색버튼을 누르게 한 HTA소스이다.

<html>
<head>
  <title>hta cross scripting</title>
  <script>
    function window.onload() {
       myframe.document.search.query.value="스크립트";
       myframe.check_query();
    }
  </script>
</head>
<body scroll="no">
  <iframe id=myframe src="http://kin.naver.com/" width=100% height=100%></iframe>
</body>
</html>
반응형
반응형
출처 : http://naradesign.net/wp/2006/09/05/35/

XHTML 은 HTML 을 XML 문법에 맞게 변형하여 다시 한번 공식화 한 것 뿐입니다. 따라서 HTML과는 약간의 문법적 표기에 대한 차이만 갖는데 XHTML 문법은 좀더 엄격함을 요구하고 있습니다. XHTML 1.0 스펙을 보면 별도의 XHTML 요소(엘리먼트)에 대한 규격을 소개하고 있지 않은데 이는 XHTML에서 새롭게 추가된 요소가 존재하지 않고 HTML 을 XML 규격에 맞도록 단지 재 구성 하였기 때문 입니다.
드림위버를 사용하는 경우 DTD만 바르게 설정되어 있다면 설정된 DTD의 표준 문법에 맞게 바른 XHTML을 코딩해 주지만 HTML 과 XHTML의 문법적인 차이를 알고 있을 필요는 있습니다. 한마디로 정의하면 XHTML은 HTML의 W3C 최신 표준이며 보다 엄격하고(Well Formed) 확장가능한(extensible) 형태의 HTML 입니다. 아래는 HTML과 XHTML 의 문법적인 차이점 입니다.
#
문법적으로 엄격하게 구성되어 있어야 한다.

HTML 은 종료태그가 없는 것을 허용하였으나 XHTML은 반드시 종료태그를 갖는다. HTML 은 태그의 중첩이 잘못된 것을 허용하였으나 XHTML은 잘못된 중첩을 허용하지 않는다.
#
요소와 속성은 소문자로 표기되어야 한다.

HTML 은 대소문자를 함께 사용하는 것을 허용하였으나 XHTML의 마크업 ‘요소’와 ‘속성’들은 반드시 소문자로 표기한다. 단, 속성의 ‘값’에는 대소문자 혼합 표기가 가능하다. 하지만 대소문자를 명확하게 구분하기 때문에 대문자로 구성된 ‘값’과 소문자로 구성된 ‘값’은 동일하지 않고 확실히 구별된다.
#
모든 태그는 종료태그를 갖는다.

HTML 의 경우 <p>, <td> 등의 태그에서 종료태그를 생략하는 것을 허용하였지만 XHTML 의 경우 반드시 닫아야 한다.
#
속성 ‘값’들은 항상 따옴표로 감싸주어야 한다.

HTML 의 경우 속성 값들을 따옴표로 감싸지 않는 것을 허용하였지만 XHTML 에서는 반드시 속성 ‘값’은 따옴표 안에 있어야 한다.
#
속성과 값의 단축표기를 허용하지 않는다.

HTML 에서는 속성과 속성 값의 단축표기를 허용하였으나 XHTML 에서는 단축표기 하는 것을 허용하지 않는다. <input checked> 는 <input checked="checked"> 와 같이 표기되어야 한다.
#
비어있는 태그(종료태그가 없는 태그)도 종료 되어야 한다.

HTML 에서 <br>, <hr> 과 같이 표기되는(포함하는 내용이 없이 비어있는) 태그들은 <br />, <hr /> 과 같이 표기하여 시작태그에서 곧 종료됨을 표기해 주어야 한다.
#
a, applet, frame, iframe, img, map 에서 name 속성은 다음 버전부터 지원하지 않는다.

id 와 name 을 함께 사용하던 마크업의 name 속성은 id 속성으로 교체되어야 한다. name 속성은 공식적으로 폐기하였지만 여전히 XHTML 1.x 모드까지 지원하고 있다. 하지만 다음 버전에서는 분명히 폐기된다.

참조문서
  1. XHTML 1.0 규격(한국어) http://trio.co.kr/webrefer/xhtml/overview.html
  2. XHTML 1.0 규격(원문) http://www.w3.org/TR/xhtml1/
  3. HTML 및 XHTML 요소 http://www.w3schools.com/tags/default.asp

반응형
반응형
접근성을 고려한 가입폼의 예제

1. 폼안의 내용그룹을 표시하는 fieldset
2. dl, dt, dd 를 이용한 의미있는 구성
3. float, clear 를 이용한 디자인변경

# fieldset
* 하나의 전송양식(FORM)을 의미 단위로 그룹핑하는 요소로서, 회원가입 페이지의 전송양식을 예로 든다면 ‘필수입력, 선택입력’ 등과 같이 의미구조에 따라 전송할 내용을 그룹핑(또는 분할)

# legend
* FIELDSET 요소에 대한 캡션(또는 제목)을 제공하여 양식의 이해를 도움
* legend는 CSS로 변경하는 것이 쉽지 않은 경우가 있어 제목 요소(H1~H6)를 대신 사용할 수 있음

# DTD에따른 표현법 차이
* HTML 4.01: FIELDSET 사용시 LEGEND 요소는 반드시 첫 번째 자식(first-child)으로 마크업 되어야함
* XHTML 1.0: FIELDSET 사용시 LEGEND 요소는 생략 가능

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
  <style type="text/css" title="">
    body {
        margin: 0;
        padding: 0;
        font-size: 75%;
        line-height: 1.5em;
        font-family: "NanumGothic", "Malgun Gothic", "Lucida Grande", Tahoma, Verdana, AppleGothic, UnDotum, sans-serif;
    }
    form {
        margin: 0;
        padding: 0;
    }
    hr {
        display: none;
    }
    p, div, th, td, select, input {
        color: #333;
    }
    a:link, a:visited {
        color: #666;
        text-decoration: none;
    }
    a:active, a:hover {
        color: #000;
        text-decoration: none;
    }
    img {
        border: 0 none;
    }
    form dt {
        float:left;
        clear:both;
        width:100px;
    }
  </style>
 </HEAD>

 <BODY>
  <form action="....." method=".....">
<fieldset>
    <legend>필수항목</legend>
    <dl>
        <dt><label for="mbname">이름:</label></dt>
        <dd><input type="text" id="mbname" name="mbname" /></dd>

        <dt><label for="email">이메일:</label></dt>
        <dd><input type="text" id="email" name="email" /></dd>
    </dl>
</fieldset>
<fieldset>
    <legend>선택항목</legend>
    <dl>
        <dt><label for="address">주소:</label></dt>
        <dd><input type="text" id="address" name="address" /></dd>
    </dl>
</fieldset>
<p><input type="submit" value="확인" /></p>
</form>
 </BODY>
</HTML>

반응형

'개발도 하냐?' 카테고리의 다른 글

Cross Domain Script 해결법  (0) 2009.12.01
HTML vs XHTML?  (0) 2009.12.01
javascript AJAX 페이지로딩  (0) 2009.11.28
FLEX AIR - 케이웨더 날씨 모듈  (0) 2009.11.18
FLEX AIR 시스템트레이에 프로그램 넣기  (0) 2009.11.18
반응형
ajax 테스트를 위한 코드(IE6 확인필요)

테스트 URL : http://db.garada.co.cc/ajaxtest.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <SCRIPT LANGUAGE="JavaScript">
  <!--

function ajaxload(divid, url){
    var page_request = false
    if (window.ActiveXObject){ //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken)
        try {
        page_request = new ActiveXObject("Msxml2.XMLHTTP")
        }
        catch (e){
            try{
            page_request = new ActiveXObject("Microsoft.XMLHTTP")
            }
            catch (e){}
        }
    }
    else if (window.XMLHttpRequest) // if Mozilla, Safari etc
        page_request = new XMLHttpRequest()
    else
        return false

    var ajaxfriendlyurl=url.replace(/^http:\/\/[^\/]+\//i, "http://"+window.location.hostname+"/")
    page_request.onreadystatechange=function(){
       if(page_request.readyState==4 && page_request.status == 200 && page_request.statusText=='OK') {
       //로딩되면 할일을 여기에 적는다. 긴 내용이 필요하다면 callback 함수를 외부에 정의해서 사용
       //alert(page_request.responseText);
       document.getElementById(divid).innerHTML=page_request.responseText;
       }
    }

    //변경된 페이지를 받기위한 더미값
    var bustcache=(ajaxfriendlyurl.indexOf("?")!=-1)? "&"+new Date().getTime() : "?"+new Date().getTime()
    page_request.open('GET', ajaxfriendlyurl+bustcache, true)
    page_request.send(null)
}

setInterval("ajaxload(\"result\",\"http://db.garada.co.cc/rand.php\")", 1000); //1000(1초간격으로 실행: 주기적)

  //-->
  </SCRIPT>
 </HEAD>

 <BODY>
  <div id="result"></div>
  <input type='button' onclick='ajaxload("result", "http://db.garada.co.cc/rand.php")' value='Change Text'/>
 </BODY>
</HTML>


XMLHTTPRequest 객체에 대한 더많은 설명을 보려면

http://www.w3.org/TR/XMLHttpRequest/
https://developer.mozilla.org/ko/XMLHttpRequest

참고.

반응형

'개발도 하냐?' 카테고리의 다른 글

HTML vs XHTML?  (0) 2009.12.01
웹표준 가입폼  (0) 2009.11.30
FLEX AIR - 케이웨더 날씨 모듈  (0) 2009.11.18
FLEX AIR 시스템트레이에 프로그램 넣기  (0) 2009.11.18
The value for the useBean class attribute...  (0) 2009.11.16

+ Recent posts