[Info]Tags categorized posts and contents patterns..

[AJAX] Ajax Code E xamples.. [Book] About the book.. [CSS] CSS Code E xamples.. [DB] Sql Code E xamples.. [DEV] All development stor...

레이블이 Spring Security인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Spring Security인 게시물을 표시합니다. 모든 게시물 표시

2016년 3월 14일 월요일

[EP]제10회 KSUG 세미나 #1..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

한국 스프링 유저그룹(KSUG)에서 지난 4월 17일에  LG CNS본사(명동 프라임타워) 9층 대회의실에서 제10회 세미나가 12시부터 6시까지 총 5가지 세션으로 진행되었습니다. KSUG를 알고 관심있게 된지는 그렇게 오래되지는 않았지만 제 기억으로는 꽤 오랜만에 진행된 세미나인 것 같습니다. 작년에 새 운영진과 함께 새로운 모습의 KSUG로써는 처음 진행된 세미나였습니다.

세미나의 시작은 현 KSUG회장이신 fupfin님의 인사말로 시작되었습니다.

간단한 스프링에 대한 소개와 함께 인터넷에 돌아다니는 유머러스한 언어별로 시각의 차이를 비교해 놓은 사진과 함께 자바의 모습에 대해서 설명하셨습니다. Haskell Fans이 바라본 자바의 모습을 특별히 강조하셨는데 구조적으로 잘 쌓았지만 블럭을 너무 많이 쌓아서 쓰러져버린 트럭에 비유한 자바의 모습을 스프링이 등장하기 전의 자바의 모습이라고 하셨습니다.


SCALAbility - scala를 통해 scalability 곱씹어보기
- 이동욱(LG CNS)

Martin Ordersky가 만든 Scala라는 언어(스칼라가 맞는 발음이랍니다.)를 통한 Scalability(확장성)에 대한 세션으로 내용도 그렇지만 특히나 깔끔한 PPT(aka 장표)가 인상적인 세션이었습니다.(딱 제가 좋아하는 스타일의 PPT였습니다. ㅎ)

Scalability는 "애플리케이션이 사용자의 요구에 맞추기 위해 크기나 용량을 변경해도 그 기능이 계속하여 잘 동작할 수 있는 능력"으로 정의하였습니다. 시작은 스칼라와는 상관없게 느껴지는 여러가지 얘기로 시작되었는데 실제 언어의 단어의 수와 프로그래밍언어의 단어의 갭은 상당히 크기 때문에 프로그래밍 언어로써 현실세계의 문제를 해결하는데는 어려움이 있습니다. 언어가 문제에 접근하는 방법에는 2가지가 있는데 단어의 증가와 규칙의 증가입니다. 너무 간단하면 접근은 쉬우나 문제해결에 어려움이 있으며 너무 증가하면 문제에 접근은 쉽지만 진입장벽이 큰 어려움이 있습니다.

Scalability를 설명하기 위해 여러가지를 보여주셨는데 개미집을 지상으로 6미터나 짓는 흰개미나 자기유사성(Self-Similarity)를 갖는 Fracktal을 보여주었습니다. 얼핏보면 주제와 전혀 상관없는 부분 처럼 느껴지기도 했지만 모두 확장성이란 것에 대한 이해를 돕기위한 내용들이었습니다. 언어에서 확장성(Scalability)이란 것은 "문제영역의 크기나 복잡도가 증가하여도 유사한 방법으로 문제 해결이 가능한 것"이라고 설명하셨습니다.

스칼라라는 언어는 처음부터 확장성을 고려해서 만들어진 언어고 상당히 많은 언어의 영향을 받았지만 그 많은 것들을 상당히 이쁘게 스칼라라는 언어안에 담았다고 합니다. Scala는 컴파일하면 .class로 떨어지는 Groovy, Clojure처럼 native to JVM으로 JVM을 속이며 JRuby, Jython은 ports to JVM입니다.  객체지향과 함수형 언어의 통합하여 간결하면서도 강력한 언어입니다. 플러그인만 설치하면 Eclipse, IntelliJ, NetBeans에서 모두 개발이 가능하며 스칼라에서 모든 것은 객체입니다.(Uniform Object Model)

그 뒤로는 변수와 클래스를 정의하는 것부터해서 분수 클래스를 만들어서 만들어진 분수클래스를 +로 더할수 있게 간단하게 확장하는 시연을 보여주면서 Currying에 대한 설명까지도 보여주었습니다. 클래스를 아주 간단하게 확장할 수 있어 Seamless합니다. 그 뒤로는 Scala의 인터페이스와 같은 Trait를 설명해 주시면 Trait로 객체를 조합하는 것을 보여주셨습니다. Trait는 Rich Interface인데 Rich Interface라는 말은 메서드가 많다는 의미이고 자바는 보통 Thin인터페이스입니다. 인터페이스가 리치인터페이스이면 사용자가 구현해야 할 것이 많기 때문에 피곤한데 Trait는 리치하면서도 사용자가 구현할게 많지 않도록 설계되었으며 마틴 오더스키가 제시한 크기비교를 하는Trait를 보여주셨습니다. 크기비교를 하는 경우 거의 비슷한 코드인데도 >, <=, >=를 모두 구현해야 하지만 Trait에서는 compare만 구현하면 됩니다.

값으로 주고 받을 수 있으면 First Class객체인데 Scala에서는 함수도 퍼스트클래스객체이므로 주고 받을 수 있습니다. 함수형의 2번째 특징은 부작용이 없다는 것으로 Referentially Transparent(투명한 참조)를 실현하고 있습니다. 이말은 대체를 하더라도 다른 문제가 발생하지 않으면 투명한 참조라고 합니다. 자바의 for문은 아무리 익숙해 져도 값을 추적하고 해야하는데 이를 foreach함수로 대체하고 함수를 아규먼트로 넘기도록 변경하였으며 Loop대신 Recursive를 하도록 하였기 때문에 더 자연어에 가까워서 익숙해 지면 이해가 쉽습니다. imperative style는 기존 자바개발자들에게 익숙하며 imperative command위주이고 side-effect가 있지만 functional style은 이해가 쉽고 에러가능성을 낮춰주는데 Scala는 functional style에 가깝게 설계되었습니다.

Alan Kay가 한 말
I'm not against types, but I don't know of any type systems that arent't a complete pain, so I still like dynamic typing. -Alan Kay

Scala는 정적타입을 가진 언어인데 정적 타입은 컴파일시에 타입 검증이 가능하고 리팩토링이 더 안전하며 코드자체가 Documantation이 되는 장점이 있습니다. Scala는 타입추론(Type Inference)을 도입하였는데 이는 되도록 간결함을 유지하면서 정작타입 시스템의 장점을 누리려는 노력입니다. 리터타입이 따로 없는데도 사람이 Integer끼리 더하면 결과도 Integer라고 생각하듯이 타입추론을 해냅니다.

자바에서의 캐스팅인 타입변환을 Scala에서는 형변환을 컨트롤 할 수 있습니다. int를 앞에서 만든 분수객체인 Rational로 변환해 주도록 선언하면 자동으로 변환이 되며 import해야만 사용되기 때문에 한번 형변환하면 전체가 변환되는 Ruby와는 다르게 개발자가 제어가 가능하다는 장점이 있습니다.

발표하시는 이동욱님스칼라 멀리서 보기Scala is not silver bullet

발표자료는 여기 있습니다.

이번 세미나에서 제가 가장 크게 흥미를 가지고 보았던 세션이었습니다. 스칼라라는 언어는 들은 적은 있었으나 그 자세한 내용은 몰랐었는데 스칼라라는 언어에 대해서 많이 알 수 있었고 저뿐만 아니라 다들 스칼라는 생소한 주제였을텐데 거기에 어려운 주제인 Scalability를 아주 쉽게 설명해 주셨던것 같습니다. 특히 Ruby가 어느정도 한계를 보여주었던 것을 모두 해결하려는듯 자바가 쌓아놓은 안정적인 기반을 그대로 이용한채 Functional의 장점을 가지고 개발할 수 있다는 것은 상당히 관심이 갔습니다. 자바스크립트에 꽤 흥미를 가지고 있어서인지 Functional이라면 왠지 더 관심이 가게 되더군요. 당장 쓰지는 않아도 조만간 헬로 스칼라를 찍어보게 되지 않을까 싶습니다. ㅎㅎㅎ


스프링 시큐리티를 이용한 웹보안
- 고종봉 (제너시스템스)

스프링 시큐리티는 스프링 개발자들의 메일링에서 스프링 기반의 보안구현체가 있어야지 않겠냐는 이야기가 나오면서 2003년 "스프링을 위한 아씨지 시크리티"로 출발하여 2004년 3월에 정식출범하여 스프링의 공식 서브 프로젝트가 되었습니다. 2007년 후반에 공식적으로 스프링 포트폴리오 프로젝트가 되면서 "스프링 시큐리티"로 이름이 변경되엇습니다.

이 세션은 라이브코딩(시간 낭비를 위해서 Copy & Paste)로 진행되었으며 웹페이지에 시큐리티를 적용하며 보안관리를 하는 것을 아주 간단한 예제를 통해서 설명되었습니다. 스프링 시큐리티의 보안에는 인증과 인가가 있는데 인증은 신원을 확인하는 것이고 인가는 접근할 권한이 있는지를 검사하는 것입니다. 스프링 시큐리트를 적용하려면 관련 jar파일들을 추가하고 web.xml에 filter를 추가하고 applicationContext-security.xml에 내용을 추가하면 바로 적용가능합니다.

스프링 시큐리티를 이용한 웹보안 발표하시는 고종봉님스프링 시큐리티 아키텍쳐

라이브 코딩은 웹페이지에 스프링 시큐리티 적용하고 로그인 폼을 원하는 폼으로 변경한 뒤에 로그아웃기능을 추가하고 로그인/아웃의 상태를 표시해준지 권한없는 페이지에 접근한 403 access is denied페이지를 원하는 페이지로 변경하였습니다. 그뒤로는 추가적인 응용을 위해서 특정 URL은 보안을 통과하도록 설정하고 한계정으로 동시에 한명만 접속하도록 한뒤 사용자를 DB에서 가져오도록 수정하였습니다. 아주 간단한 예제였지만 스프링 시큐리티를 이해하기에는 부족함이 없었습니다. 추가적으로 심화실습인 MVC를 적용하여 @Secured 애노테이션으로 권한을 제어하는 시연까지 보여주셨습니다.

발표자료는 여기 올라와있습니다.

시스템을 개발하면 거의 필수적으로 포함되어야 하는 보안에 관한 이슈가 수년간의 오픈소스개발로 인하여 많은 노하우가 녹아있는 스프링 시큐리티에 대해서 스프링을 잘 모르는 저로써도 쉽게 이해할 수 있었던 세션이었습니다. 아주 간단한 예제를 통해서 시연을 보여주었기 때문에 이해하기가 쉬웠고 재미있었던데다가 스프링 시큐리티의 편리한 점을 이해하기 좋았습니다. 그 이상에 대해서 공부하는 것은 각자의 몫이겠죠 ㅎ


2016년 3월 10일 목요일

[EP]ANYFRAME JAVA SEMINAR 2010..

출처 : Outsider's Dev Story https://blog.outsider.ne.kr/

10일에 삼성SDS주최로 진행된 ANYFRAME JAVA SEMINAR에 갔다가 왔습니다. Anyframe은 삼성에서 만들어서 오픈소스로 공개한 자바 프레임워크로 이름 정도만 알고 있었는데 최근에 들으니 스프링 기반으로 되어 있는듯 합니다.(이걸 기반이라고 해야하는건지는 잘 모르겠지만요.)

Spring 3.0
첫번째 세션은 스프링에 대한 설명이었습니다. 스프링이 2.0에서 3.0으로 넘어오면서 3.0이 가진 Feature들을 중심으로 간략한 설명들과 간단한 데모를 통해서 어떻게 사용하는 부분인지에 대해 설명해 주었습니다.

  • Spring Expression Language가 추가되어 #{expr}을 통해서 특정 객체의 접근 및 조작이 가능하면 코드내에서는 @Value와 함게 사용하여야 합니다. <spring:eval>을 제공하여 JSP에서도 사용가능합니다.
  • 모델 밸리테이션 : 이전에는 Javascript로 하거나 스프링이 가이드한 밸리데이터를 만들어야 했으나 3.0부터는 JSR-303을 지원하여 밸리데이션 규약을 제공하고 있습니다. 밸리데이션 방법으로는 파라미터에 @Valid 애노테이션을 선언하는 선언적 방법으로 BindingResult에 밸리데이션의 결과가 자동으로 담기게 되고 @Autowired로 밸리데이터를 직접 인젝트하는 프로그램적 방법이 있습니다.
    타입 컨버전 : 이전 버전에서는 프로퍼티에디터를 주로 사용하였으나 프로퍼티에디터의 단점을 해결하고 범용적으로 사용할 수 있도록 타입컨버전을 3.0에서 추가하였습니다. 포맷이 필요한 컨버전에서는 Formatter를 사용합니다.
  • MVC 네임스페이스: mvc:annotation-driven을 통해서 컨버터, 밸리데이터, 포매터등을 자동으로 등록되도록 선언할수 있습니다.
  • REST지원 : REST는 모든 리소스에 대해 URI가 생기기 때문에 이에 대한 관리를 지원하게 되었으며  HiddenHttpMethodFilter는 웹브라우저가 GET, POST만 지원하는 한계를 해결하기 위해 DELETE, PUT을 지원하도록 하였습니다. ContentNegotingViewResolver를 통해서 URI의 확장자에 따라서 포매팅을 다르게 해줄 수 있습니다.

저는 스프링에 대해서 아직 많이 몰라서 그냥 들었습니다만 스프링을 좀 아는 사람들에게는 기초적인 내용으로 보였습니다. 3.0에 추가된 기능들 위주로 설명이 진행되었기 때문에 내용을 정리하기가 쉽지 않지만 그냥 기억나는 부분위주로만 로그성으로 적어두었습니다.(일부 잘못되거나 누락된 내용이 있을 수 있습니다.) 3.0특징에 대해 알려면 인터넷에 정리된 문서를 참고하는게 더 낫지 않을까 합니다.


웹 개발 단순화 방안
일반적으로 하는 요청에 대해서 디스패처서블릿이 컨트롤을 찾고 로직을 탄뒤 페이지에 전달하는 프리젠테이션 레이어를 개발하는 것은 항상 하는 반복적 작업이므로 이걸 공통화 한 부분에 대한 설명이었습니다. Controller에 대한 공통화로 모든 곳에서 확장포인트를 제공하고 있다고 하였으며, Controller를 공통화하여 페이지의 header, left, footer를 공통으로 하고 비동기로 body만 바꿀수 있도록 한 Anyframe의 기능에 대한 설명이었습니다.

Taglibrary를 이용하여 프로트엔트에서 많이 사용하는 부분을 공통화하여 더블서브빛 방지나 메뉴 클릭시 body부분을 어떤 페이지로 바꿀지, form태그에 달력기능을 추가하는 등의 기능들을 View페이지에서 태그라이브러리를 사용하여 개발할 수 있도록 한 구조였습니다. 이렇게 함으로써 프리젠테이션 레이어의 개발을 빠르게 하고 콘트롤러는 공통을 그대로 사용한채 비즈니스로직과 모델만을 개발할 수 있다고 하였습니다.

앞의 설명에 확장포인트를 제공하고 있다고 하였지만 아무래도 프레임워크가 UI기능을 제공하기 때문에 종속적이 신경쓰였습니다. 시연에서는 tiles와 jquery가 사용되었었는데 달력등의 기능은 어떤 라이브러리에 대한 종속성을 가지지 않고는 해결할 수 없는 기능이었기 때문에 굳이 프레임워크에서 제공해야하는 기능인지는 잘 모르겠다는 생각이었습니다. 특정 환경에서는 저런식으로 다 만들어 놓으면 개발은 어느정도 편리할것 같기는 했습니다. 세미나듣다가 예리한 arawn이 말한대로 저렇게 호출부가 뷰페이지에 퍼져있으면 변경사항 생겼을때 컨트롤러만 바꾸면 될일을 사용한 곳 모두를 찾아가면서 수정해야 된다는 단점을 지적해주더군요. 제가 잘 몰라서 그런건지 크게 인상적이지 않게 느껴졌는데 발표는 상당히 큰 기능처럼 하셔서 보는데 약간의 당황스러움이 느껴지더군요.



인증 및 권한 관리
기존의 권한관리가 가지고 있던 한계를 스프링 세큐리티가 대부분 해결가능해 졌습니다. 스프링 세큐리티의 장점은 웹영역뿐만 아니라 전체 애플리케이션 영역에 대한 검증된 권한 관리가 가능하고 다양한 인증 표준규격을 지원하며 컨테이녀별 이식성 및 호환성을 확보하였고 재사용의 기반을 제공하고 있다는 것입니다만 한국상황에서는 DB기반이 아닌 XML기반이라 고객이 직접 수정하기가 어렵다거나 환경설정에 대한 UI를 제공하지 않고 권한정보 변경시 서버의 재기동이 필요하다는 담점이 존재하고 있습니다.

그래서 이런 단점을 보완하여 만든 Anyframe IAM을 소개하였습니다. XML을 DB로 관리할 수 있도록 변경하고 IAM Admin Console을 통해서 GUI환경설정기능을 제공하고 있었습니다.

스프링 세큐리티와 어드민 부분은 최근에 관심을 가지고 있는(가져야 되는) 부분이라서 그래도 나름 흥미롭게 봤던것 같습니다. 이것저것 최근에 봄싹사람들하고 의논했던 부분들에 대해서 비슷한 내용들이 나와서 더욱 그랬던것 같습니다. 정확한 메카니즘까지는 모르겠지만 관리화면에서 권한변경이 서버의 재기동없이 바로 적용되는 시연까지 보여준 것이 꽤 인상적이었습니다.


첫세션을 제외하고는 애니프레임에 대한 소개가 주를 이룬 듯한 느낌이고 전체적으로는 간단에 그리 인상적이지 않은 세미나였습니다. 세미나 갔다올때마다 항상 많은 것을 얻어오는 느낌을 받고는 하는데 괜히갔다왔다정도는 아니었습니다만 그리 흥미롭지도 않았던 세미나였던것 같습니다. (왠지 안좋은 얘기만 하는것 같네요. 그렇게 시니컬하진 않은데요. ^^)