레이블이 자바인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자바인 게시물을 표시합니다. 모든 게시물 표시

2013/06/28

자바의 기능 확장이 아닌 자바 개발자의 역량을 높여줄 도구 - Programming in Groovy

21세기에 접어들면서 사람들은 컴퓨터를 이용해 다양한 정보를 저장하고 처리하게 되었는데, 이처럼 다양한 정보를 저장하고 처리하는 시스템은 컴퓨터 발전의 역사에 있어 함께 한 수 많은 언어로 작성되어 왔다.

사람들은 컴퓨터가 발전하는 것과 함께 시간이 흐르면서 다양한 정보를 함께 처리하길 원했고 이런 요구사항은 다양한 프로그래밍 언어와 데이터베이스를 출현시키기에 매우 충분한 토양이 되었다.

오늘날 가장 인기있는 언어 중 하나인 자바 언어는 Sun Micro Systems에서 재직하던 제임스 고슬링이 가전기기에 들어갈 프로그램을 만들려고 개발했던 OAK 언어로부터 시작했다. 

자바 언어는 1995년 발표 당시만 해도 웹 브라우저에서 동작하는 애플릿을 만드는데 주로 사용되었는데 2000년을 지나오면서 많은 오픈소스 프로젝트와 거기에서 떨어져 나온 수 많은 라이브러리가 자바로 작성되면서 필요한 프로그램을 자바로 만드는 것은 그리 어려운 일이 아니게 되었다.

그런데 최근에 자바 언어가 가진 불편함과 시시각각 변하는 사용자의 요구사항에 따른 확장성과 기민함에 대응하기 위해 자바 언어를 기초로 하는 새로운 언어가 설계, 개발되어 보급되고 있다.  이같은 자바 언어를 기초로 하는 프로그래밍 언어로 그루비(groovy)와 스칼라(scala)가 있다. 이 두 언어는 자바 언어를 기초로 하며 JVM(Java Virtual Machine)에서 동작한다.

그루비는 스크립트 언어와 객체지향 언어의 장점을 충분히 가지고 있지만 스칼라 언어는 객체지향 언어와 함수형 프로그래밍 언어의 요소의 장점을 두루 가지고 있다.

인사이트가 펴낸 프로그래밍 그루비(저자 박제권)는 기존의 자바 개발자가 큰 어려움 없이 적응할 수 있도록 자바 프로그래밍 방식으로 그루비를 먼저 설명하고 어느정도 익숙해지면 그루비의 세계로 독자를 인도한다.


그루비로 가는 길

새로운 프로그래밍 언어를 배우는데 있어 어려움으로 지적되는 것은 새로운 프로그래밍 언어의 학습 곡선이다. 독자가 첫 프로그래밍 언어로 그루비를 배운다면 그루비의 학습 곡선이  완만한 상승선을 그린다는 것을 알 수 있을 것이다.

그런데 이미 프로그래밍 언어로 자바 또는 C# 등을 알고 있다면 그루비 언어를 배우는데 있어서 기존에 학습했던 지식을 머리속에서 화이트로 속속 지우고 새로운 지식을 채워넣어야 쉽고 빨리 배울 수 있지만 많은 사람들은 자신이 이해하고 있는 지식을 기반으로 새로운 지식을 이해하려고 하기 때문에 오히려 학습 곡선이 고속 상승하게 되기도 한다.

1장에서는 저자는 그루비에 대해서 간략하게 설명하고 그루비가 어떤 유형의 프로그래머에게 어울리는지 그루비를 컴파일하고 보다 편리하게 작성할 수 있는 방법 등을 알아본다.



그루비가 가진 무한한 힘을 쓰기 위한 첫번째 여행의 코스로 1장을 따라가보자


그루비의 문법

그루비는 자바에서 사용되는 문법을 거의 그대로 가져왔지만 몇 가지 확장적인 기능과 함께 자료형에 있어 매우 놀라운 변화를 수용했는데 모든 자료형이 객체형 이라는 것이다.

모든 자료형을 객체형태로 다룬다는 것은 프로그램이 다루는 데이터의 조작방법이 일관됨을 보장한다.

그루비는 JVM 언어에서 동작하고 실제 만들어지는 컴파일 파일도 .class 이므로 자바에서 동작하는 대부분의 API는 그루비로 변환과정을 거치지 않아도 쓸 수 있다. 이것은 그루비가 가진 가장 큰 혜택이자 힘이다.

그루비는 자료형에 있어 GString, List, Map 객체를 내장 자료형으로 정의해서 프로그래밍 작업의 효율성을 증대시켜준다.

한편 클로저(Closure)라는 개념의 코드 조각은 그루비를 사용하면서 가장 많이 만나게 될 그루비의 주요 구성 요소이다. 이 개념을 완전히 이해하지 못하더라도 사용하다보면 이해하게 될것이다.

그루비는 프로그래밍의 효율성을 높이기 위해 ?. 과 같은 문법을 통해 NULL 값을 가진 객체에 대해 매우 유연하게 동작하는 프로그램을 만들 수 있다.

그리고 자바빈과 동일한 역할을 자동으로 지원하는 그루비빈, 메타 프로그래밍 등 제2장부터 제7장까지 그루비로 프로그래밍하기 위한 기초를 독자에게 친절히 안내할 것이다.


그루비 라이브러리

우리가 프로그램을 만들때엔 우리가 가진 많은 생각을 프로그래밍 언어가 가진 표현 방법과 어떤 일을 수행하기 위한 다양한 보조 라이브러리를 사용한다.

그루비에서도 이는 크게 다르지 않다. 그루비에서는 빌더, GDK(Groovy Developement Kit) 를 통해 트리 형태의 코드에는 빌더를 적용하고 GDK를 통해선 입출력, 스레드와 템플릿 등을 쉽게 이용할 수 있다.

그루비의 동작 환경이 JVM 이기 때문에 JDK를 그대로 가져다 사용할수도 있지만 그루비나 파이썬 등의 스크립트형 언어에는 ~즘 이라고 하는 유형이 있다. 이를 그루비에서는 그루비답게라고 말하기도 하는데 JDK를 그대로 가져다 사용하면 그루비 프로그램이 그루비 답지 않게 된다.

제 10장에서는 그루비로 데이터베이스 프로그래밍을 하는 방법과 GroovyScriptEngine, GroovyClassLoader, GroovyShell를 이용해 프로그램 사용자가 입력한 그루비 코드를 안전하게 실행하고 불러들이는 등의 통합 방법을 소개한다.

그루비는 스프링과 자바에서 스크립트 언어를 다루기 위한 표준적인 방법으로 JSR-223 표준의 소개를 11장 6절에서 다룬다.

우리는 웹의 세계에서 데이터 교환 포맷이나 저장 포맷으로 비교적 널리 사용되고 있는 XML 을 그루비에서 조금 더 쉽게 다룰 수 있다. 12장 XML 다루기를 통해 그루비에서 XML을 쉽고 편리하게 조작할 수 있다.


매일매일 그루비

그루비와 함께할 준비가 되었다면 13장에서는 그루비에서 혼동하지 말아야 할 8가지를 꼭 기억하고 그루비를 어떤 자동화 작업에 사용할 수 있을지 알게 될 것이다.

많은 프로그래머들은 작성한 프로그램에 대해 단위테스트를 너무나 쉽게 간과하곤 한다. 최근엔 이러한 흐름의 추세로 TDD가 제안되고 있기도 하지만 아직 우리의 개발문화는 개발을 보조하는 형식의 테스트가 이뤄지고 있다.

그루비는 자체 테스트 도구보다 JUnit과 JMeter 등을 이용해 프로그램을 테스트할 수 있어서 테스트 그 자체에는 큰 무리가 없다.

우리가 만든 프로그램의 테스트를 위해선 이러한 작업을 자동화할 필요가 있다. 저자는 앤트와 메이븐을 통한 자동화 방법을 소개함으로서 그루비가 기존의 자바 도구와도 매우 유연하게 잘 동작한다는 것을 설명한다.

MS 윈도우에는 윈도우 응용 애플리케이션 개발자가 더 빠르게 응용 프로그램을 만들기 위해 여러 프로그램 제조사들이 ActiveX라고 하는 MS 표준 기술을 이용한 컴포넌트가 다양하게 존재한다.

지금까지 PHP, C, C++, 파이썬 등은 윈도우 기반에서 프로그램을 만들고 동작시킬 수는 있었지만 윈도우에 설치되어 있는 ActiveX 컴포넌트 등을 이용하기엔 쉽지 않았다. 그루비에서는 스크립톰이라고 하는 라이브러리를 이용해 ActiveX 컴포넌트를 쉽게 사용할 수 있는데 저자는 15장을 통해 스크립톰을 가지고 할 수 있는 다양한 일을 소개한다.

그루비는 그루블릿(자바의 서블릿)과 그레일스를 통해서 웹 응용 프로그램을 쉽게 만들 수 있다. 그레일즈는 루비 언어의 루비온레일즈에서 영향을 받은 그루비 전용의 웹 프레임워크이며 현재는 스프링소스사를 통해 관리되고 있다.

웹에 관심이 많은 필자는 그레일즈가 프로그래머가 그루비로 할 수 있는 일의 폭을 넓혀주고 생각의 사고를 활짝 열어주었다고 생각한다.


그루비로 당신은 무엇을 할 것인가?

자바 프로그램의 통합 빌드 도구인 Ant(앤트)의 개발자는 Ant 개발 당시 파이썬과 같은 스크립트 언어의 존재를 알았다면 Ant 내에서 같은 일을 하기 위해 복잡한 방법을 채택하지 않았을 것이라고 말했다.

물론 그 이후 그루비의 출현으로 그루비 내부에서는 물론이고 Ant 설정 파일 내에서도 그루비 프로그램 코드를 적어놓고 실행할 수 있도록 변경되기는 했다.

하지만 여전히 그루비는 자신이 할 수 있는 일이 많다고 입을 뾰로통 내밀면서 말한다. 독자는 그루비로 무엇을 하고 싶은가?

그루비를 보고 가슴이 콩닥콩닥 한다면 당신은 그루비의 존재로 인해 마음의 위안을 얻을 수 있을 것이다!

2012/09/24

버그있는 소프트웨어를 만드는 행동이 가져오는 용감함의 끝을 보고싶다면...?

소프트웨어를 만드는데 중요한 것은 무엇일까요? 이 질문에 대한 답은 답변을 요구받은 사람마다 제 각각 다를것입니다. "버그 없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍"은 보안적인 측면에서 바라본 소프트웨어의 중요한 점을 실제적인 관점에서 예시와 코드를 함께 제시한 책입니다.

책의 부제인 "당신의 코딩 습관은 안전하지 않다"는 본 도서가 어떤 부분에 초점을 두고 있는지 알게 합니다. 바로 우리가 배운 프로그래밍 습관에서 보안 문제가 가장 쉽게 검출된다고 보는 것이지요.

자바 언어의 창시자인 "제임스 고슬링"은 추천사에서 보안은 지난 수십 년 동안 심각한 주제로 다루어졌고 자바 역시 보안을 염두에 둔 언어라고 소개합니다.

PHP와 같은 스크립트 언어에서도 보안(동 출판사의 PHP 보안: 몇 줄의 코드로 안전하게 참고)이 다루어지는 것을 보면 보안이 컴퓨팅 세계에서 중요한 키워드로 자리 잡은건 사실로 받아들여야 할 것 같습니다.

책의 내용 자체는 자바로 멀티 플랫폼, 멀티 스레드 프로그램을 만드는 개발자에게도 도움이 될만한 Lock, Sanitization, 가시성과 원자성, Thread API, Thread Pool, Thread 안전 등이 다수 기술되어 있습니다.

자바로 안전한 프로그램을 짜는 법과 규칙이 아닌 안전한 프로그램을 만드는데 자바 언어에선 어떻게 할 수 있을까? 이 질문에 대해서 답을 찾아가 보겠습니다.

신뢰할 수 없는 곳에서 데이터가 넘어오면 신뢰해선 안된다.


프로그램에서 가장 믿을 수 없는 건 어떤 부분일까요? 바로 데이터입니다. 외부에서 입력받는 데이터는 모두 오염된 데이터이고 심지어 프로그램 내부에서 조차도 데이터를 주고 받는 코드가 신뢰할 수 있는 코드인지 아닌지에 따라서도 검증하고 규제해야 한다고 말합니다.

한동안 웹 세계를 떠들석하게 했던 SQL Injection 공격도 바로 입력에 대해 검증하지 않아서 발생했던 문제였습니다.

자바 역시 다른 언어와 마찬가지로 SQL, 인자 공격 등을 받을 수 있습니다. 바로 이런면에서 데이터는 적절히 규범화와 Sanitization이 되어야 하는데 이는 특히 시스템에 치명상을 입힐 수 있으므로 각별히 주의해야 합니다.

선언과 표현식. 그 미묘한 틈으로 해오는 공격 막아내기


자바 언어는 객체지향 언어 중에서도 선언이 꼭 필요하며 표현식에 있어서도 다른 언어와 차별되는 특징을 가지고 있습니다. 다른 언어에도 있는 특징이라고 본다면 대수롭지 않게 넘길수도 있는 부분이겠지만 안전을 고집하는 프로그램에서는 간과할 수 없는 내용입니다.

예를 들어 문자열의 비교와 같은 부분도 다른 언어가 == 와 같은 연산자를 사용하더라도 자바에선 == 연산자는 문자열 내용의 비교가 아니라는 점에 주의해야 합니다.

해커와 크래커가 타격을 줄 수 있는 지점은 사전에 제거해야 합니다. 문법적으로는 맞더라도 보안 코딩이 필요한 지점이 바로 선언과 표현식에 관한 부분입니다.

이 보다 더 위험할 수 없다. 수치 다루기


일본 애니메이션 중 공각 기동대엔 어떤 악당이 정부의 재정 창고에서 사이버 상으로 돈 일부를 계속해서 훔쳐내는 장면이 나옵니다. 그런데 정부는 이걸 모르지요.

어떻게 이런 일이 가능할까요? 이유는 컴퓨터가 가지고 있는 수치 연산 특징 때문인데 이 문제는 수치를 다루는 프로그램에서 수치 연산이 특히 중요한 문제로 다뤄집니다.

그런데 수치를 다루는 프로그램이 부정확하다기만 하면 정확성을 높이면 되겠지만 이 문제는 보안 버그를 발생시키는 지점이기도 합니다. 따라서 수치를 다루는 프로그램일수록 정밀도와 보안 버그가 발생하지 않도록 각별히 신경써야 합니다.

객체. 그 영원한 손님과 메서드를 잘못 놀리기


객체는 데이터와 데이터를 처리할 수 있는 메서드가 함께 들어가 있습니다. 하지만 자바 언어에서 객체는 크게 2종류로 나뉘어집니다. 불변과 가변 객체로 말이죠. 불변 객체는 말 그대로 변경할 수 없지만 가변 객체는 변할 수 있는 객체입니다. 저는 그래서 가변 객체를 손님 객체라고 부르기도 합니다.

보안적인 측면에 있어서도 객체를 수정할 수 있거나 상속해서 기능을 고칠 수 있다면 해당 객체를 사용하는 코드는 보안 위험에 노출될 수 밖에 없습니다. 혹은 해커의 코드로부터 전달받은 데이터에 위험이 있을거란 건 자명한 사실입니다.

한편, 메서드 사용에 있어서도 해커는 폐지 예정이거나 상속 등을 통해서 프로그램을 공격할 수 있습니다.

프로그래머가 의도하든 의도하지 않았던 메서드를 사용하거나 정의하는 일은 신중해야 합니다.

잠자면서 침흘리지 말고 항상 보이는데 있을 것


에러는 어떤 프로그램이던지 항상 발생할 수 있습니다. 하지만 사용자에게 에러 내용을 내보이는 일은 해커에게 공격해달라는 것과 다를바 없습니다. 프로그램 사용성에 있어서도 에러를 내보이는 일은 좋지 않다고 합니다.

무엇보다 에러가 해커에게 공격정보를 제공할 수 있으니 제품 개발 중을 제외하고 에러 처리는 적재 적소에 적절하게 사용되어야 함을 설명합니다.

뿐만 아니라 스레드 프로그램이 안정적으로 동작하기 위해서 전재되어야 하는 가시성과 원자성에 대한 이야기가 담겨 있습니다. 하지만 가시성과 원자성은 이후 나오는 Lock과 스레드 관련 기술과 밀접한 관련이 있으니 9장부터 13장까진 함께 보시는게 좋습니다.

하드 디스크 동작 램프가 꿈벅이고 있을때 왜 그럴까?


많은 프로그램에서 프로그램이 더 이상 사용자의 요청에 응답하지 않을 때 우리는 블럭되었다라고 말합니다. 블럭되었다는 말은 프로그램이 뭔가를 하고 있지만 사용자의 요청에 불응하고 있는 상태를 말하지요.

이런 현상은 디스크에 대한 입출력과 네트워크에 대한 입출력 그리고 시간이 오래 걸리는 일을 수행했을때 생깁니다.

입출력에 대한 블럭 문제는 단지 사용자의 요청에 반응하는 것 뿐 아니라 프로그램의 동작과 해커의 공격을 유도할 수 있기도 합니다. 따라서 이러한 입출력에 대한 내용을 주도 면밀하게 따져봐야 합니다.

데이터 다시 갖다 쓰기의 위험성


어떤 프로그램에서든 이진화된 포맷으로 데이터를 저장한다면 그 데이터를 읽는 프로그램은  후속작업이 쉬워집니다.

물론 사용자가 알아볼 수 있는 데이터로 출력되는 것도 있기도 합니다. 이렇게 프로그램에서 데이터를 바로 파일로 저장하거나 다른 네트워크로 보내거나 하는 것들을 우리는 직렬화된 데이터라고 부릅니다.

15장에선 바로 이런 데이터의 올바른 직렬화 방법과 직렬화로 발생할 수 있는 보안 버그를 설명합니다.

상태를 가지고 있는 직렬화 데이터나 높은 권한을 가지고 있는 직렬화 데이터는 보안 공격의 우려를 지니고 있으니 한번쯤은 데이터 직렬화/역직렬화시 주의할 필요가 있습니다.

샌드박스안에서 동작시키기


16장과 17장은 자바 프로그램이 샌드박스 안에서 안전하게 동작할 수 있는 방법을 제시합니다. 자바 언어가 이미 샌드박스 모델인데 무슨 또 샌드박스냐 하겠지만 자바 언어에선 클래스를 로드하는 로더를 통해서도 보안 문제가 발생할 수 있기도 합니다.

본 도서에서는 톰캣과 아파치 제로니모의 예를 들어서 클래스 로더에서도 문제를 발생시킬 수 있음을 지적합니다.

한편 자바 실행에 있어서도 어떤 권한을 어디에 줄것인지 명시하거나 런타임에서 보안 문제를 일으킬 수 있는 문제도 피해야죠.

뻔하거나 뻔하지 않은 것들 다루기


마지막으로 다루는 내용은 어느 부류에 속하기도 애매한 것들만 모아놓았습니다. 데이터 통신을 SSLSocket을 사용하거나 난수 생성, 기밀정보의 하드 코딩 금지, 메모리 누수 등에 대한 내용을 다룹니다.

이런 내용들은 프로그래머라면 당연히 알고 있거나 그렇게 해야 하는 내용이 다수입니다. 하지만 그렇게 알고 있어도 실천은 어렵지요.

어쩌면...


어쩌면 우리가 프로그램을 작성하고 있는 동안에도 해커는 끊임없이 우리의 프로그램을 공격할 준비를 하고 있을 겁니다. 설령 운이 좋아 공격당하지 않는다고 해도 마찬가지입니다.

"버그없는 안전한 소프트웨어를 위한 CERT 자바 프로그래밍"도 우리 프로그래머의 코딩 취약성에 대해 설명하고 있는 것으로 본다면 우리가 품질 좋은 소프트웨어를 만들어내는데 한걸음 더 나아가있을 겁니다.

책을 덮으면서 아쉬웠던건 책의 코드에 대한 상세 설명이 부족했다는 점인데, 이는 본 도서의 독자층을 고려한다면 쉽게 넘어갈 수 있는 부분일겁니다.

끝으로 번역하시느라 고생하셨던 역자 "강권학"님에게도 특별한 감사 말씀 드려요. 보안에 관련된 내용은 어떻게 해서든 어려운 축에 속하는 내용이라 애로가 많으셨을텐데 매끄럽게 번역하시려고 고생하신게 눈에 보입니다.

자바 언어로 먹고 사시는 분들에게도 이 책을 통해 보안 코딩이 한 걸음 더 나아가기를 진심으로 바라봅니다.