데이터 분석가가 바라본 빅데이터 현상과 대응을 위한 준비 방법



[출처] http://www.dbguide.net/knowledge.db?cmd=view&boardUid=166186&boardConfigUid=19&boardStep=&categoryUid=574

[저자]> 고태영 이노지에스 고문 tykoh70@innogs.com

빅데이터 활용이 현실로 다가오면서 구축 플랫폼에서 분석 환경까지 다양한 이슈가 쏟아져 나오고 있다. 오랫동안 데이터 분석 업무를 해온 현업 전문가의 시선으로 빅데이터 현상을 알아보고, 기업에서 현실적으로 적용할 만한 분석 환경과 단계별 준비 방법을 소개한다.



빅데이터와 데이터 분석을 소개하는 기술 설명서에 준하는 글은 이미 사방에 넘쳐나고, 매일 빅데이터 관련 기사가 미디어의 IT 섹션을 장식하고 있다. 기술을 주도하는 빅플레이어들은 시장 주도권을 거머쥐기 위해 엄청난 광고?홍보 비용을 쏟아 부으며 경합하고 있다. 빈번하게 빅데이터 혹은 이와 관련한 컨퍼런스가 열리고, 기존의 데이터베이스를 주 업종으로 하던 회사들?분석 서비스를 주로 해오던 컨설팅 회사들?혹은 장비 회사들?이제는 유관성이 없어 보이는 업체들까지 빅데이터를 표방하고 나선 모습이다. 대학입시에서도 이러한 열풍은 여실히 드러난다. 통계학과 등 응용수학 분야와 인접 학과들의 입시 경쟁률이 치솟았다는 기사가 더 이상 놀랍지도 않은 일이 돼버렸다.



빅 데이터 분석(Big Data Analysis)


숲에서 나무들의 무작위 표본을 채집해 그 평균값을 근거로 침엽수림인지 활엽수림인지 구분하고 숲의 생성연대를 가늠하기도 한다. 무작위 표본 채집이 생태학자의 연구조사를 위한 통계학적 접근 방법으로서는 그리 나쁘지 않을지 모른다. 그러나 그것만으로는 숲을 이루는 모든 정보를 파악할 수는 없다. 탐사자에게는 무용한 분포도상의 이상치가 식물학자에게는 아주 중요한 식물 군집정보가 될 수도 있다. 만일 독자가 군대생활 중에 얻은 경험 등 서바이벌 지식을 갖춘 상태에서 깊은 숲에서 조난을 당했다고 가정해보자. 가장 먼저 무엇을 할 것인가? 우선 방위 파악과 숲의 전체적인 형태를 파악하려 할 것이다. 나무 가지가 뻗어나간 방향과 그루터기에 낀 이끼, 태양의 이동 방향, 밤이라면 별의 위치로 방위를 가늠할 것이다. 그러나 숲을 벗어나려면 일단 능선의 형태와 협곡의 위치, 해의 길이, 그림자의 범위, 식수?식량 확보 등 여러 상황 정보를 수집?파악해 대책을 세울 것이다. 목적은 하나다. 조난당한 그 숲으로부터 벗어나는 것이다. 생존에 필요한 각종 정보를 근거로 최대한 명확히 판단할 수밖에 없다. 만약 혼자서 조난당했다면 여러 명이 함께 있을 때보다 불리해질 것이다. 혼자서 얻을 수 있는 정보는 양에서 제한적일 뿐 아니라, 분석?판단 과정에서 자칫 냉철함을 벗어날 수 있기 때문이다.

그러나 여럿이 함께 있다면, 경험 많은 사람이 리더가 돼 팀을 통솔하면서 같은 시간에 여러 일을 처리하려 할 것이다. 팀워크가 발휘되는 순간이다. 서로 흩어져 정보를 찾고 준비 작업을 하는 동안 위기 상황에서 상호 소통하는 방법도 결정할 것이다. 리더는 수집된 정보를 바탕으로 그때그때 결정을 내려야 한다. 이때 팀원들은 리더가 내린 결정이 그 상황을 벗어나기 위한 올바른 판단이었는지를 생각할 것이다. 따라서 혼자일 경우보다 잘못된 판단을 내릴 가능성은 그만큼 줄어들게 된다.


표본 조사에서 전체 조사로


기업에서 데이터 분석도 이처럼 펼쳐진다. 특히 빅데이터 분석은 기술이나 방법의 문제라고 보기에는 기존의 데이터 분석과는 다른 점이 많다. 예전의 분석에서는 표본 데이터를 이용해 분산 분석을 해 필요한 최적화한 결과만 취해왔다. 그러나 이러한 방법은 필요한 정보의 분석 결과만을 취할 뿐 어쩌면 유용할지도 모를 버려지는 이상치 값들을 방치하는 결과를 불러왔다. 또한 표본으로 분석한다는 것은 모델을 아무리 정교하게 만든다 할지라도 전체 데이터를 대상으로 분석한 결과치와 같을 수 없다. 전체 데이터를 대상으로 분석한다는 것은 고려해야 할 이슈가 많음을 의미한다.

기업에서 빅데이터 분석을 위해 고려해야 할 이슈 중에서도 절대적으로 분명히 할 것이 있다. 바로 ‘정책’이다. 정책에는 여러 요소가 필요하지만 필자는 다른 측면에서 정책을 거론한다. 빅데이터를 위한 플랫폼이나 솔루션의 문제는 그리 중요하지 않다. 정책이 결정되지 않는 상태에서 빅데이터 분석은 무의미한 도전이 될 가능성이 높다. 정책은 빅데이터를 분석하려는 조직에서 과연 무엇을 빅데이터라 할지를 정하는 데서부터 시작된다.

‘기존 데이터 웨어하우스(Data Warehouse)에 무수히 많은 정형 데이터와 비정형 데이터가 쌓여 있으니 그것들을 헤집어 뭔가의 패턴을 찾아내고 그 안에서 인사이트를 찾겠다’고 한다면 ‘그건 아니다’ 라고도 할 수 있다. 실례로 제조기업이라면 제조라인에서 발생하는 무수히 많은 데이터를 통해 생산 비용관리, 장애요인 분석관리, 생산량 조정관리 등의 분석 정보를 도출하려 할 것이다. 그러나 정작 사용돼야 할 데이터는 거의 쓸 수 없는 포맷으로 단지 스토리지에 적재된 경우가 대부분이기 때문이다. 이러한 데이터에 대한 분석 요구를 받아 분석하려 했을 때 가장 먼저 부딪치는 문제는 기존 시스템에 대한 접근 경로를 거의 확보할 수 없다는 것이다. VPN(Virtual Private Network)을 열어주는 것부터 시작해 원본 데이터로의 접근을 위한 여러 가지 사내 보안정책 등 말로 할 수 없을 만큼의 장애물이 놓여 있다. 직접 상주해 작업하기 위해 별도의 액티브 디렉터리(Active Directory)를 구성하고 이거저거 하다 보면, 이제는 도저히 가져와 사용할 수 없는 형식으로 쌓여 있는 로그 데이터가 발목을 잡는다. 이러저러한 이유로 포기할 것들은 포기하고 완료한 프로젝트를 고객에게 전달하는 과정에서도 문제에 직면한다. 새로운 방식에 대해 배우기를 귀찮아하고 사용하기를 꺼려하는 사용자들 습성 때문이다. 어렵게 구축된 시스템은 6개월을 넘기지 못하고 방치된다. 제조뿐만 아니라 물류 등 연관 비즈니스 그룹들이 이와 같은 방식으로 저마다의 방식으로 데이터를 쌓고 분석?활용하기 위한 각자의 시스템을 구축?보유하고 있다.



세밀도에 대하여


각 비즈니스 그룹 단위로 다르게 접근하는 각각의 데이터 웨어하우스로부터 데이터를 취합?분석?최적화해서 기업이 원하는 총체적인 전략을 수립하고 시행하게 만들 수 있을까 하는 의문이 든다.

일단 이러한 데이터 취합 문제와 분석에 대한 문제가 해결됐다고 보고 다음 문제를 짚어 보자. 데이터 분석에 대한 ‘방법론’을 결정해야 한다. 현재로선 관심이 주로 빅데이터 분석 플랫폼과 솔루션에 집중된 나머지 잘 드러나지 않고 있을 뿐이지, 이러한 분석 방법론이 정착되면 반드시 발생할 중요한 이슈이다. 분석 방법론에서 거론될 이슈는 빅데이터를 얼마나 세밀하게 분석할 것인가이다. 일반적으로 아주 깊고 정밀하게 분석하려고 한다. 그러나 빅데이터의 분석은 조금 다르게 접근해야 할 수밖에 없다. 빅데이터 분석은 직관과 통찰의 문제이기 때문이다. 앞서 숲을 예로 들었듯이 너무 가까운 현상에만 집중하다 보면 정작 전체를 보지 못하는 패착(敗着)을 두게 마련이다.



인식의 한계치를 넘어선 데이터


빅데이터 분석의 요체는 거대함 속에서 드러나는 하나의 흐름을 파악하는, 즉 직관으로 패턴을 먼저 읽어내는 것이다. 그 패턴이 어떠한 모습을 하고 있으며 무엇을 의미하는지, 우리에게 무엇을 말하려는지를 법의학자가 프로파일링하는 것처럼 대상을 통해 인식하고 받아들이고 말 할 수 있어야 한다. 예전의 데이터 분석의 대상이 미시적 대상이거나 가시적 대상의 범주였다면, 빅데이터는 가시적일 수는 있으나 인식의 한계치를 넘어선 데이터의 범주를 말하는 것이다. 데이터가 크기를 떠나 너무 다양한 형태로 존재하기 때문이기도 하거니와 그 데이터가 쌓여가는 속도가 인간의 보편적 인지??를 분석하기 위해서는 이러한 데이터를 접하는 방법 및 관점에 대한 자세부터 바꿔야 할 필요가 있다. 다양한 빅데이터 플랫폼과 분석방법, 기반 기술들은 무로부터 시작한 것이 아니다. 이론적으로는 수십 년 전부터 존재했으나 최근에 와서야 정보통신 기술의 발달로 구현된 것들이나 기존에 구현됐던 것들이 새로운 개념으로 재정립된 경우가 대부분이다. 클라우드, 가상화, 분산 병렬처리, 맵리듀스 등 현재 이슈화되는 빅데이터를 위한 기술이 그렇다. 이러한 기술을 바탕으로 빅데이터를 분석하기 위한 새로운 인식에 대해 알아보자. 과연 어느 정도까지 ‘느슨하게’ 데이터를 분석해야 할까?



느슨한 분석


‘느슨하게’는 기존의 분석 방법과는 반대의 개념에 가깝다. 인지적 관점으로 해석하자면 전체를 조망하고 개체 단위로만 집중하지 않을 때 하나의 거대한 상으로부터 하나의 패턴을 인식할 수 있다고 한다. 이는 우주항공 분야에서도 위성으로부터 송신되는 지표 데이터 사진을 통해 특이점을 파악할 때 적용되는 방식과 유사하다고 볼 수 있다. 또한 유적지 전체를 조망하고 그 문명의 일관성을 파악하거나 퍼즐같은 복잡하고 유사성이 없는 조각 맞추기 놀이에서도 찾을 수 있는 방법이다. 너무 세밀하게 팩트에 집중하면 중요한 현상을 놓칠 수 있다. 때에 따라 세밀한 집중화가 필요하지만 기본적으로는 ‘느슨한’ 분석이 필요하다.

기업에서 빅데이터 분석을 위해 우선 해야 할 일이 ‘정책 결정’이라면, 이 정책을 토대로 할 일이 ‘느슨한’ 정도를 결정하는 것이다. 두 번째는 어쩌면 가장 중요할 수 있는 이슈이다. 바로 기존의 데이터를 사용할 것인지 아니면 새로 수집할 것인지의 문제다. 기존 데이터 웨어하우스로부터 분석할 데이터를 마이닝?가공?적재하는 방법을 택할 것인지, 이 방법과 병행해 새로운 빅데이터를 위한 새로운 데이터 웨어하우스 운용 시스템을 구축할 것인지를 결정해야 한다. 기존 시스템으로부터 새로운 시스템으로 마이그레이션하는 것은 쉬운 일이 아니다. 특히 기업 규모가 클수록 이것은 중요한 정책적 결정이 요구된다. 최근 빅데이터 분석과 관련해 이 문제에 대한 이슈가 활발히 논의되고 있다. 그 대표적인 것이 하둡(Hadoop) 플랫폼이다. 국내에서도 이 플랫폼을 이용해 기업에 적용한 사례가 있다. SK플래닛이 대표적이라고 할 수 있다. 이 프로젝트는 대략 3여 년의 시스템 마이그레이션 과정이 있었다고 알려졌다. 이 글의 주제를 벗어나기 때문에 하둡 플랫폼의 효용성은 논외로 하자. 대신 이 글의 후반에 하둡이 아닌 다른 솔루션으로 이와 같은 데이터 분석 환경을 구성하는 방법을 개략적으로 소개할 것이다.



빅데이터 분석은 인지 한계를 넘어선 거대하고 다양성을 가진

실시간에 적재되는 데이터를 멀리서 넓게 바라보고

미시적 팩트가 아닌 거시적 패턴을 보고

느슨하게 분석해 원하는 가치를 찾는 것이다.



앞서 소개한 빅데이터 분석을 정리하면 다음과 같다. 인지 한계를 넘어선 거대하고 다양성을 가진 실시간에 적재되는 데이터들을 멀리서 넓게 바라보고 미시적 팩트가 아닌 거시적 패턴을 보고 느슨하게 분석해 원하는 가치를 찾는 것이다.

‘빅데이터가 무엇이냐?’고 질문하면, 상대가 ‘바로 그거구나!’ 하고 이해할 수 있을 만큼의 분명한 답을 주기는 곤란하다. 10여 년이 넘게 분석 업무를 해온 필자도 빅데이터가 무엇인지 잘 모른다. 잘 모르는 사람이 이런 글을 쓰고 있는 아이러니가 현재의 IT 현실과 닮았다고 생각된다. 아래에 기술하는 내용은 빅데이터 관점이라기 보다는 큰 데이터를 분석하는 입장에 관한 개인적인 연구수행의 관점을 기술한 것이다.



분석가가 바라본 빅데이터


빅데이터는 과연 엄청나게 크거나 혹은 엄청나게 많이 쌓여 있는 데이터 더미를 말하는 것일까? 답을 찾다가 결국 필자도 혼란스러워서 그냥 현업 데이터 분석 담당자 입장에서 현재 상황을 정리하는 것으로 대신한다. 우선 무수히 많은 데이터가 쌓일 조건은 다음과 같다. 무수히 많은 업무 트랜잭션과 이를 수용하는 대용량 데이터베이스 처리가 가능한 데이터 웨어하우스(Data Warehouse)가 필요하다. 하지만 기존 방식을 벗어난 유연한 확장(Scalable)성을 보장해야 한다. 하둡 플랫폼이 이에 가장 부합한다고 볼 수 있을 것이다.

일단 이 조건에 부합하려면 무수히 많은 업무 트랜잭션이 발생하는 중견기업 이상의 대기업 정도는 돼야 가능할 것이다. 물류 관련 비즈니스 그룹을 하나의 유닛으로 보고 가늠하자면, 최소한 이와 관련한 인접 비즈니스 유닛들이 다 모여서 유기적으로 데이터를 주고받으면서 최소한 수년 간 적재해야 한다.

물론 여기에는 소비자라는 엄청난 크기의 가변변수도 고려해야 한다. 제조 분야에서는 이보다 더 많은 데이터가 발생한다. 빅데이터라는 트렌드에 가장 부합한 영역은 SNS 같은 소셜 플랫폼도 아니고 바로 제조업 분야다. 현재 필자가 소속된 회사는 파트너들과 협력해 데이터 분석 모델을 만들어 우선 적용할 영역이 제조업이다. 그 이유는 다음과 같다. 데이터 분석이 가장 필요하고 대용량 데이터 분석을 위한 기반 환경이 구축된 분야가 제조업과 방송, 통신, 금융관련 분야다. 공공정보나 IT 플랫폼 기반 분야도 이에 해당한다.



분석을 위한 플랫폼


빅데이터 분석 요건을 살펴봤으므로 빅데이터가 되기 위한 기술적 충족 요건이 무엇인지 살펴보자. 일단 대용량 분석을 가능케 하는 멀티코어 지원 애플리케이션이 있어야 한다. BI(Business Intelligence)같은 OLAP 솔루션들은 프론트엔드에서 작동하기 때문에 웬만한 환경에서는 엔진 성능만 좋다면 싱글 코어만을 지원해도 크게 무리는 없다. 필자는 기업용 분석 최적화 BI 솔루션으로 HiQube(www.hiqube.co.kr)를 주로 쓰고 있다. 이 솔루션은 싱글코어 기준으로도 2억 7000만 개의 레코드, 16개의 칼럼, 30억 개의 데이터 값, 8.5GB 용량의 대용량 데이터셋을 1초 미만으로 내비게이션할 수 있다. HiQube는 글로벌 근사기법을 사용하는 ARSM(Adaptive Response Surface Method), 글로벌 근사기법을 사용한 그래디언트 기반의 다중목적 최적화(GMMO), 검증기법을 사용한 GA(Genetic Algorithms), 다중목적 유전 알고리즘 (MOGA, Muti-Objective Genetic Altorithm), 실현 가능한 방향설정 방법(MFD)와 순차적 프로그래밍(SQP)과 같은 지역 근사화 기법, 순차적 최적화(Sequential Optimization)과 신뢰성 평가(SORA)와 몬테카를로 시뮬레이션과 같은 신뢰성과 활성화를 최적화를 가능케 해주는 활성화 신뢰성 알고리즘 등 공학기반의 수학적 최적화(Optimization) 알고리즘들을 BI레벨에서 지원하는 유일한 솔루션이다. 이는 다른 BI솔루션들이 가지지 못하는 빅데이터를 지향하는 프론트엔드 전문분석 솔루션을 지향하기 때문이다. 오랜 시간 최적화에 관련한 알테어의 공학적 DNA가 녹아있는 제품인 것이다.




[그림 1] HiQube 화면 (출처: 알테어 코리아)

범용으로는 칼럼 기반의 인메모리 데이터 엔진을 채용함으로써 그 미래가 밝아 보이는 마이크로소프트의 오피스2012와 세어포인트 서비스, SQL서버 2012의 분석 환경이 있다. 아직은 HiQube같은 제품에 비해 부족함이 많으나 기반 환경을 오피스 제품군으로 사용하는 기업고객의 환경을 고려할 때 아무래도 친화성에 있어서는 가장 큰 장점을 가지고 있다고 하겠다. 기회가 된다면 이들을 이용한 실무 레벨의 분석에 대한 소개를 하고 싶다.

R나 MatLab, SAS같은 수학적 분석 솔루션도 필요하다. 혹은 여기에 더해 최적화 지원을 하?어를 지원하는 것은 기본이다. 우선 클러스터 분석을 지원하는 것을 기본으로 판단하자면, SAS는 아직 준비 중이 것으로 보인다. R는 기본적으로 분산분석을 멀티코어 레벨에서 지원한다. MatLab 또한 지원한다. 이 외에 좀더 산업공학적인 측면에서 최적화(Optimization)를 지원하는 역학 해석 및 분석용 솔루션인 Hyper Works 제품군 중에 Hyper Math (www.hyperworks.co.kr/Product,50,HyperMath.aspx)가 있다.

기계학습 또한 매우 중요한 요소다. 필자가 생각하는 빅데이터 분석의 기본 요소에서 가장 정점은 바로 이 기계학습을 어떻게 분석로직에 적용하고 활용하게 하는가이다. 필자의 경우는 주로 함수형 언어들을 이용하거나 MatLab을 이용하지만, 아마도 향후에 하둡이 보편화되고 R가 주로 사용되는 시점에서는 Octave(http://www.gnu.org/software/octave)가 주목할 만한 솔루션으로 떠오를 것이라고 본다.




[그림 2] GNU Octave 화면 (출처: www.gnu.org/software/octave/)

앞서 소개한 애플리케이션 혹은 툴처럼 빅데이터 분석에 적합하거나 혹은 적용이 가능한 체질을 갖춰야 활용이 쉬울 것이라고 생각한다. 더불어 운용 플랫폼이 빅데이터를 발생시킬 수 있는 환경을 제공해야 한다. 필자 관점에서라면 HPC(High Performance Computing) 혹은 HAC(High Availability Computing)가 우선 필요하다. 현 시점의 키워드인 클라우드 컴퓨팅(Cloud Computing), 분산병렬처리 시스템(Parallel distributied system), 가상화 시스템(Virtualization System) 들은 모두 클러스터라는 저장 프로세스를 처리하는 논리적인 유닛의 집합체를 개념으로 한 HPC나 HAC를 바탕으로 한다.

아마도 이 대목에서 ‘왜 하둡을 거론하지 않는가?’ 하고 궁금해할지도 모르겠다. 우선 필자는 하둡을 잘 모른다. 그저 하둡이라는 게 있고, 그게 어떻게 운영되는가를 가상 운영환경에서 설치해보고 간단한 스크립트 레벨에서 테스트해 본 것이 전부다. 이런 이유 때문에 하둡을 거론하지 않는 것과 더불어 필자 주변에는 기업의 운영환경 전체를 하둡으로 마이그레이션했던 아주 용감한 이도 있기에 여기서는 필자 나름의 정보 분석에 대해서만 소개한다.



상용 분석 플랫폼


필자는 하둡 시스템이 아닌 다른 방식으로 정보분석이라는 업무의 일을 하고 있다. 필자가 다루는 솔루션은 알테어 코리아(www.altair.co.kr)에서 공급하는 PBS Works(www.pbsworks.co.kr) 이다. HPC를 위한 ‘Enabling on demand computing’를 표방하는 솔루션이다. 이 솔루션은 현재 미국에서는 펜타곤(Pentagon)에서 운영하는 슈퍼컴퓨터와 워크스테이션들의 연구 및 고용량 연산을 수행하기 위한 HPC와 그리드 컴퓨팅(Grid computing) 환경을 지원하기 위해 사용되고 있다. 약 300만 코어(Core)를 컨트롤 하고 있다. 국내에서는 기상청 슈퍼컴퓨터에서 약 10만 코어를 사용하고 있는 것으로 알려졌다. 또한 하이퍼 웍스(Hyper Works)를 지원하기 위한 고연산 분석 솔루션을 위한 스피어 서버 펌(Sphere Server Firm)으로 사용되고 있다. 국내 자동차회사와 중공업사 등 산업현장과 연구기관에서도 다양한 목적으로 사용되고 있다. 필자는 이 솔루션을 기반으로 빅데이터를 분석한다. 물론 이것만으로는 불가능하다. 하둡에도 Hive, Pig, Scribe, Chukwa, Flume 같은 툴들이 있듯이 PBS Works도 분산 컴퓨팅을 위한 툴이 필요하다.

우선 PBS Works에서는 ‘PBS 프로페셔널’이라는 전용 관리 환경과 관리자용 분석환경인 PBS 애널리틱스, 프로트엔드를 위한 PBS 컴퓨트, PBS 데스크톱 등을 지원하고, 내부 운용 스크립트로 파이선과 펄을 지원한다. 이로써 대용량 데이터 분석용 솔루션의 구성도가 그려졌다.

PBS Works는 Parallel Python(www.parallelpython.com) 등 파이선 프레임워크를 기본적으로 지원한다. 이에 따라 필자는 필요할 때마다 IPython(ipython.org)이나 RPy2를 사용한다. Parallel R나 RPy2는 분산분석을 위한 분석 도구이다. R가 갖는 분석 가용치 한계를 벗어나기 위한 방법이지만 나름 사용할 만하다. 기본적으로 SAS같은 솔루션도 처리가용 한계치가 20Gb를 넘지 못한다. R는 이보다 더 취약하다. 그러나 Parallel R를 이용하면 이러한 한계를 극복할 수 있다. 이러한 구성은 빅데이터 분석을 위한 연구 차원의 대안으로서 사용될 뿐이고 전적으로 빅데이터 분석을 위한 대안이 될 수 없음은 미리 밝혀둔다. 아직 오라클이나 마이크로소프트 같은 곳에서 차세대 하둡 통합 환경의 프로토타입으로 검토중인 상태이기 때문에 완전히 빅데이터 플랫폼 실무에 적용할 수 있는 단계는 아니다.

앞의 방법은 PBS Works 같은 상용 솔루션을 사용하지 않고도 빅데이터 분석을 할 수 있는 방법이지만, HPC 운용에 있어서 가장 중요한 퍼포먼스 문제가 남아 있다. 네트워크 스위칭 인터페이스의 처리용량 문제와 디스크 쓰기 문제들로 인해 소규모 연구소에서나 가능한 방법이다. 만일 대용량 고연산 작업을 수행해야 한다면, 내부 스위칭 인터페이스가 40Gb 인피니밴드급을 지원해야 한다. 결국 이러한 HPC 환경을 효율적으로 구성하기 위해서는 각 노드 클라이언트에 해당하는 물리적 워크스테이션들은 PC 사양이어도 상관 없지만, 컴퓨팅 서버와 스위칭 인터페이스는 고가의 장비가 필요하다. 따라서 필자도 개인적인 분석 모델 수립을 연구할 때에는 IPython 라이브러리를 이용한 소규모 분석 플랫폼을 이용하지만, 기업용 대용량 데이터 분석을 할 때에는 PBS Works로 구성된 HPC 기반의 분석 환경을 이용한다. RPy2는 파이선에서 R의 분석 처리용 함수들을 불러다가 사용할 수 있게 구성해 준다. 즉, R에서 사용하는 분산 분석모듈(Cluster analysis module)을 이용해 분석을 처리할 때 발생하는 데이터를, PBS 스피어 서버로 보내 분산 처리하거나 계산 작업에 할당한다.

만일 하둡을 이용한 시스템을 고려한다면 분석운용 환경으로 RHive 사용을 권한다. 필자가 알기로는 하둡에서 이보다 더 효율적인 분석 방법은 없다. 오라클의 빅데이터 제품군이나 마이크로소프트가 진행중인 윈두우 애저(Windows Azure)와 하둡을 결합한 아이소토프(Isotope) 플랫폼이 공식 출시되면 알 수 있지 않을까. 이에 대해서는 기회가 닿는다면 자세히 다뤄보고 싶다.




[그림 3] Splunk 분석 솔루션 (자료 협조: 동양시스템하우스)

더불어 앞서 소개한 처리방식으로 실시간 프로세스 분석을 위한 환경에서 보다 안정성 있는 솔루션을 원한다면 이와 같은 방식을 지향하는 상용 솔루션이 하나 더 있다. Splunk사의 ‘Splunk’라는 솔루션이다. 일반적인 CEP(Complexed Event Processing) 기반과는 다소 다르지만 그 효용 면에서는 나름 제값을 분명히 하는 솔루션이다. 국내 IT 기업들이 이미 도입해 사용 중인 솔루션이기도 하다. 이 솔루션 또한 내부적으로 파이선을 기본 운영 스크립트로 지원한다. 그리고 자체 검색엔진도 지원하는데 구글 엔진과 비슷하다. 가격이 만만치 않은 제품이라는 점을 제외한다면 기업에서 가장 잘 활용할 만한 솔루션으로 보인다. 분석 도구와 함께 하나 더 고려할 사항이 데이터베이스로, 필자는 CouchDB, MongoDB 등을 사용 중이다. 이에 대해서는 김우승 줌닷컴 연구소장의 연재 등 전문가들의 글을 참고 하기 바란다.



현실적인 빅데이터 분석을 위한 제언


빅데이터 분석은 중요하다. 그리고 하둡 시스템은 상당히 매력적이다. 그러나 이러한 매력적인 목적지에 도달하기 위해서는 수많은 어려움을 뛰어 넘어야 한다. 이제 이러한 어려움을 극복하고 초기 시행착오를 줄일 방안을 현실적으로 알아보자. 하둡 같은 시스템 환경이라고 해서 딱히 다를 건 없다고 본다. IT 분야에서 오랫동안 종사한 독자라면 잘 이해하겠지만 문제점은 늘 비슷하다. 다만, 그 규모가 얼마나 더 방대해지고 얼마나 복잡해졌느냐의 차이일 뿐, 기본 구현 원리나 개념은 늘 같기 때문이다.

우선 빅데이터 분석을 위한 기반 환경에 대해 알아보자.



1. 시스템 통합


하둡 시스템이나 유사한 형태로 이전하기 위해서는 사전에 기존 시스템들을 통폐합해야 한다. 하둡으로 마이그레이션은 엄청난 비용과 시간, 인내심을 요구할 것이다. 대략 대기업 기준으로 1년의 준비 기간이 필요할 것으로 예상한다.



2. 자동화 구현


통합된 시스템이 자동 처리될 수 있도록 구현하는 데 집중해야 한다. 아무리 잘 통합된 시스템이라 하더라도 장애 처리를 위한 자동화 처리 공정이 구현되지 않으면, 인력과 시스템 낭비가 그만큼 심해질 것이다. 하둡으로 시스템 이관 시 자동화 부분이 해결되지 않으면 기존 시스템을 사용하는 것과 차이 없거나 오히려 성능이 더 떨어지는 최악의 상황에 봉착할 수 있다. 이것은 시스템 자동화뿐 아니라, 이 일과 관련된 인력에 대한 교육도 포함된다. 대략 이러한 일을 수행하는 데 걸리는 시간은 구현 1~2년, 교육 및 숙달을 병행해 2년 정도 소요될 것으로 예상한다.



4. 하둡 시스템으로 마이그레이션


매우 어려운 단계다. 앞서 하둡으로 마이그레이션하기 위한 통합화와 자동화 교육에 2~3년이 필요하다고 했다. 이제 남은 것은 기업의 중대한 결단뿐이다. 앞서 소개한 지침을 바탕으로 내부 정책을 수립하고 대안 모델로 기업의 체질을 개선해왔다면, 분명이 이 부분에서 고민은 줄어들 것이다. 왜 하둡이나 이와 유사한 시스템 환경으로 이관해야 하는지 충분히 공감하고 있을 테니 말이다. 필자의 관점상, 딱히 이러한 이관 경험이 없어도 이러한 시스템이 주게 될 만족감은 충분히 예측된다. 그러니 여기 저기서 하둡에 대해 거론하면서 하둡이 전부인 것 같은 분위기가 형성되고 있다. 중요한 것은 이러한 시스템으로의 이관이 가져다 줄 이점을 최대로 활용하기 위해서는 반드시 앞서 소개한 과정을 착실히 수행하고 전사적인 전략과 정책에 대한 장고의 과정이 필요하다. ‘정책’이 관건이다. 하둡과 같은 시스템으로 마이그레이션하기 위해서는 ‘정책’을 수립하고 단계적으로 진행하되 반드시 중간 과정에 대체 수단을 통해 체질(?)을 개선한 다음에 이관해야 한다.



5. 팩트가 아닌 패턴


끝으로 하나 더 부연하자면 통계학적 분석이 빅데이터 분석에도 필요하다. 하지만 그 적용 방식은 분명히 다르다. 만일 기존 통계학적 분석에 익숙하다면 관점의 변화를 추구할 것을 권한다. 소개한 것처럼 빅데이터 분석은 플랫폼의 변화만큼이나 인식의 변화도 요구되기 때문에다. 나무가 아닌 숲을 지향하고 미시적 팩트가 아닌 거시적 패턴을 발견하려는 노력이 필요하다.

‘브라질에서 한 나비의 날갯짓이 텍사스의 토네이도를 일으킬 수도 있다’는 혼돈이론이 등장한 당시만 해도 빅데이터를 운용할 수 있는 환경이 아니었기 때문이라고 생각해 본다. 이제 빅데이터 분석이 가능한 환경적?기술적 여건이 갖춰진 만큼, 기존에 존재했던 수많은 분석 모델들이 다른 관점에서 적용될 것으로 예상된다. 예전에는 버려졌던 이상치 데이터에도 주의를 기울이는 예리함이 필요하다.

또한 마치 법의학자가 사자의 마지막 말을 프로파일링을 통해 발견하고 전달하는 것과 같은 직관이 필요하다. 빅데이터 분석은 과학과 인문학의 융합만큼이나 당연한 것 같지만 이질적인 복합성이 존재하는 영역이라는 것을 첨언하며 마친다.






출처 : 한국데이터베이스진흥원

제공 : DB포탈사이트 DBguide.net

Eclipse, ANT, 그리고 EJB (java) 개발환경

[출처] http://blog.naver.com/cjturtle/90028172222

Eclipse와 ANT의 연동 작업, 빌드 파일의 제작필요한 기술

2008/02/22 18:37

복사http://blog.naver.com/cjturtle/90028172222

[48] Eclipse와 ANT의 연동 작업, 빌드 파일의 제작|ejb
2008.01.16 12:01
퉁퉁이(skybb1224) 카페 매니저
http://cafe.naver.com/loveloveitwill/204 <INPUT id="cafeurlstr" type="hidden" value="http://cafe.naver.com/loveloveitwill/204" name="cafeurlstr">

[48] Eclipse와 ANT의 연동 작업, 빌드 파일의 제작

▩ Eclipse와 ANT의 연동 작업
- eclipse 2.1.1에는 Ant 1.5.3버전이 포함되어 있습니다.
- eclipse 3.1.x에는 Ant 1.6.5버전이 포함되어 있습니다.

1. Ant의 설정
- [Window --> Preference] Ant 노드의 "Names:"필드에 빌드할 파일을 나열한다.
기본 환경을 설정한다.

▩ 빌드 파일의 제작
- src
- lib
- bin

1. 빌드의 설계
- clean --> compile --> mkjar --> dist --> run
- [Project 선택 --> New --> File] build.xml입력

2. 기본 타겟의 지정
- default="start.copy" :
최초로 시작되는 타켓은 start.copy
- <target name="start.copy" depends="jars">:
jars에 의존함으로 jars 타겟이 먼저 실행됩니다.
- <target name="jars" depends="compile">:
compile에 의존함으로 compile 타겟이 먼저 실행됩니다.
- <javac srcdir= "${src.dir}":
컴파일될 java 소스 파일이 있는 경로 지정
- destdir="${build.dir}":
컴파일되어 class 파일이 저장될 경로 지정
- includes="ejb/**,test/**":
ejb, test 폴더의 하위 폴더를 포함해 모든 파일을 컴파일 지정합니다.
- excludes="ejb/*.class":
이미 컴파일된 확장자가 .class인 파일은 제외합니다.
- classpath="${classpath}${classpath_weblogic}":
컴파일시 참조할 패키지를 명시합니다.
- <jar destfile="${dist.dir}/${jars.name}":
압축 파일명을 지정합니다.
- basedir="${build.dir}":
압축할 소스가 있는 폴더를 지정합니다.
- includes="classes/**": 압축할 파일들을 지정합니다.
- compress="true" : 압축을 합니다.
- <mkdir dir="${deploy.dir}"/>:
압축 파일을 저장할 폴더를 생성합니다.
- <echo message="Application Name:${jars.name}"/>:
ANT의 실행 메세지를 출력합니다.
- <copy file="${dist.dir}/${jars.name}" todir="${deploy.dir}" overwrite="true"/>
압축된 jar 파일을 지정된 폴더로 복사합니다.
- <copy file="${dist.dir}/${jars.name}" todir="${deploy.weblogic.dir}" overwrite="true"/>
weblogic application폴더로 jar 파일을 복사합니다.
- <copy file="${dist.dir}/${jars.name}" todir="${deploy.tomcat.dir}" overwrite="true"/>
Tomcat webapps 폴더로 jar 파일을 복사합니다.
- <delete file="${dist.dir}/${jars.name}"/>:
복사가 끝난 후 삭제합니다.

>>>>> build.xml
<?xml version="1.0" encoding="euc-kr" ?>

<project name="Board" default="start.copy" basedir=".">
<property name="project.name" value="$ant.project.name"/>
<property name="project.version" value="1.0"/>
<property name="user.name" value="왕눈이"/>

<!--Eclipse Project Name-->
<property name="apps.name" value="Board"/>
<!--jar 압축 파일 이름, Board.jar-->
<property name="jars.name" value="${apps.name}.jar"/>
<!--소스가 있는 기준 폴더-->
<property name="src.dir" value="."/>
<!--컴파일하여 class를 저장할 폴더-->
<property name="build.dir" value="./classes"/>
<!--jar압축 파일이 저장될 폴더-->
<property name="dist.dir" value="."/>
<!--jar압축 파일 백업본이 저장될 폴더-->
<property name="deploy.dir" value="deploy"/>
<!--EJB Component 폴더-->
<property name="deploy.weblogic.dir" value="C:/bea/user_projects/domains/ejb2030/applications"/>
<!--Tomcat lib 폴더-->
<property name="deploy.tomcat.dir" value="C:/tomcat-5.0.19/webapps/ejb2030/WEB-INF/lib"/>
<!--실행및 컴파일시 참조할 classpath 폴더-->
<property name="classpath" value="./classes;"/>
<!--실행및 컴파일시 참조할 classpath_weblogic 폴더-->
<property name="classpath_weblogic" value="C:/bea/weblogic81/server/lib/weblogic.jar"/>
<!--Documentation File 생성 폴더-->
<property name="javadoc.dir" value="docs/api"/>

<!--컴파일 타겟-->
<target name="compile">
<javac srcdir= "${src.dir}"
destdir="${build.dir}"
includes="ejb/**,test/**"
excludes="ejb/*.class"
classpath="${classpath}${classpath_weblogic}"
debug="on"
/>
</target>

<!--*은 모든 패키지, ','는 특정 패키지 나열-->
<target name="javadoc" depends="compile">
<mkdir dir="${javadoc.dir}"/>
<javadoc author="true"
destdir="${javadoc.dir}"
packagenames="*"
sourcepath="${src.dir}"
classpath="${classpath}${classpath_weblogic}"
use="true"
version="true"
windowtitle=" documentation"
private="true"/>
</target>

<target name="jars" depends="javadoc">
<jar destfile="${dist.dir}/${jars.name}"
basedir="${build.dir}"
includes="classes/**"
compress="true"
index="true"
manifest="${src.dir}/MANIFEST.MF"
>
<fileset dir="${build.dir}"/>
</jar>
</target>

<target name="start.copy" depends="jars">
<mkdir dir="${deploy.dir}"/>
<echo message="Application Name:${jars.name}"/>
<echo message="Application Name:${dist.dir}/${jars.name}"/>
<copy file="${dist.dir}/${jars.name}" todir="${deploy.dir}" overwrite="true"/>
<copy file="${dist.dir}/${jars.name}" todir="${deploy.weblogic.dir}" overwrite="true"/>
<copy file="${dist.dir}/${jars.name}" todir="${deploy.tomcat.dir}" overwrite="true"/>
<delete file="${dist.dir}/${jars.name}"/>
</target>

</project>


>>>>> EJB Component 배포용 단순한 Build.xml(권장)
- default="start.copy" :
최초로 시작되는 타켓은 start.copy
- <target name="start.copy" depends="jars">:
jars에 의존함으로 jars 타겟이 먼저 실행됩니다.
- <target name="jars" depends="compile">:
compile에 의존함으로 compile 타겟이 먼저 실행됩니다.
- <javac srcdir= "${src.dir}":
컴파일될 java 소스 파일이 있는 경로 지정
- destdir="${build.dir}":
컴파일되어 class 파일이 저장될 경로 지정
- includes="ejb/**,test/**":
ejb, test 폴더의 하위 폴더를 포함해 모든 파일을 컴파일 지정합니다.
- excludes="ejb/*.class":
이미 컴파일된 확장자가 .class인 파일은 제외합니다.
- classpath="${classpath}${classpath_weblogic}":
컴파일시 참조할 패키지를 명시합니다.
- <jar destfile="${dist.dir}/${jars.name}":
압축 파일명을 지정합니다.
- basedir="${build.dir}":
압축할 소스가 있는 폴더를 지정합니다.
- includes="classes/**": 압축할 파일들을 지정합니다.
- compress="true" : 압축을 합니다.
- <mkdir dir="${deploy.dir}"/>:
압축 파일을 저장할 폴더를 생성합니다.
- <echo message="Application Name:${jars.name}"/>:
ANT의 실행 메세지를 출력합니다.
- <copy file="${dist.dir}/${jars.name}" todir="${deploy.dir}" overwrite="true"/>
압축된 jar 파일을 지정된 폴더로 복사합니다.
- <copy file="${dist.dir}/${jars.name}" todir="${deploy.weblogic.dir}" overwrite="true"/>
weblogic application폴더로 jar 파일을 복사합니다.
- <copy file="${dist.dir}/${jars.name}" todir="${deploy.tomcat.dir}" overwrite="true"/>
Tomcat webapps 폴더로 jar 파일을 복사합니다.
- <delete file="${dist.dir}/${jars.name}"/>:
복사가 끝난 후 삭제합니다.


<?xml version="1.0" encoding="euc-kr" ?>

<project name="Board" default="start.copy" basedir=".">
<property name="project.name" value="$ant.project.name"/>
<property name="project.version" value="1.0"/>
<property name="user.name" value="왕눈이"/>

<!--Eclipse Project Name-->
<property name="apps.name" value="Board"/>
<!--jar 압축 파일 이름, Board.jar-->
<property name="jars.name" value="${apps.name}.jar"/>
<!--소스가 있는 기준 폴더-->
<property name="src.dir" value="."/>
<!--컴파일하여 class를 저장할 폴더-->
<property name="build.dir" value="./classes"/>
<!--jar압축 파일이 저장될 폴더-->
<property name="dist.dir" value="."/>
<!--jar압축 파일 백업본이 저장될 폴더-->
<property name="deploy.dir" value="deploy"/>
<!--EJB Component 폴더-->
<property name="deploy.weblogic.dir" value="C:/bea/user_projects/domains/ejb2030/applications"/>
<!--Tomcat lib 폴더-->
<property name="deploy.tomcat.dir" value="C:/tomcat-5.0.19/webapps/ejb2030/WEB-INF/lib"/>
<!--실행및 컴파일시 참조할 classpath 폴더-->
<property name="classpath" value="./classes;"/>
<!--실행및 컴파일시 참조할 classpath_weblogic 폴더-->
<property name="classpath_weblogic" value="C:/bea/weblogic81/server/lib/weblogic.jar"/>
<!--Documentation File 생성 폴더-->
<property name="javadoc.dir" value="docs/api"/>

<!--컴파일 타겟-->
<target name="compile">
<javac srcdir= "${src.dir}"
destdir="${build.dir}"
includes="ejb/**,test/**"
excludes="ejb/*.class"
classpath="${classpath}${classpath_weblogic}"
debug="on"
/>
</target>

<target name="jars" depends="compile">
<jar destfile="${dist.dir}/${jars.name}"
basedir="${build.dir}"
includes="classes/**"
compress="true"
index="true"
manifest="${src.dir}/MANIFEST.MF"
>
<fileset dir="${build.dir}"/>
</jar>
</target>

<target name="start.copy" depends="jars">
<mkdir dir="${deploy.dir}"/>
<echo message="Application Name:${jars.name}"/>
<echo message="Application Name:${dist.dir}/${jars.name}"/>
<copy file="${dist.dir}/${jars.name}" todir="${deploy.dir}" overwrite="true"/>
<copy file="${dist.dir}/${jars.name}" todir="${deploy.weblogic.dir}" overwrite="true"/>
<copy file="${dist.dir}/${jars.name}" todir="${deploy.tomcat.dir}" overwrite="true"/>
<delete file="${dist.dir}/${jars.name}"/>
</target>

</project>





3. [package Explorer]에서 "build.xml"을 선택하고 팝업메뉴에서 [Run As -- Ant Build]를 선택한다.

JAVA WEB EJB 엔터프라이즈 자바 빈즈 기초

[출처] http://dada.pe.kr/129

초보자의 간단한 EJB 프로그램 만들기

from 개발 끄적임들/케케묵어버린 것들 2005/03/14 11:32

※ 김성박님의 EJB 강좌와 EJB 엔터프라이즈 자바빈즈 바이블을 참고했습니다.

1. EJB 개발 순서
a. 홈 인터페이스(Home Interface)와 리모트 인터페이스(Remote Interface)의 작성
- 홈 인터페이스(Home Interface) : 엔터프라이즈 빈을 클라이언트가 사용할 수 있도록 생성하고 찾아주는 기능
- 리모트 인터페이스(Remote Interface) : 엔터프라이즈 빈이 클라이언트에게 제공하는 서비스를 메소드들로 선언한 인터페이스

b. Bean Class의 작성
- 엔터프라이즈 빈이 실제로 처리하는 작업을 내부코드로 구체적으로 작성하는 클래스입니다. Remote Interface에서 선언된 비즈니스 메소드를 실제로 구현해줘야 한다. 개발자 입장으로 보면 가장 할 일이 많은 작업이다.
- Bean Class를 작성할 때는 Remote Interface에서 정의된 메소드를 실제로 구현해 주는 것 외에도 EJB 컨테이너의 규약 메소드를 정의해야 한다. 이 메소드는 EJB 컨테이너가 특정한 순간에 호출하는 메소들로 아주 중요한 기능을 처리한다.

c. 디플로이먼트 디스크립터(Deployment Descriptor) 작성
- 디플로이먼트 디스크립터는 XML파일로 엔터프라이즈 빈의 이름, 트랜잭션 처리방법, 보안, 자원관리 방법 등의 정보를 작성한 파일아더,

d. 엔터프라이즈 빈과 관련된 모든 클래스와 디플로이먼트 디스크립터의 패키지화(jar로 묶음)
※ c,d를 묶어 디플로이먼트라고 한다.

e. 패키지를 EJB 컨테이너에 설치함
- 참고로 EJB 컨테이너 안에 EJB패키지를 설치하는 개발자를 배치자(deployeer)라고 한다.
- 컨테이너에 설치하는 과정을 '플로그인'이라고 말하며, 플러그인 되는 과정에서 리모트 인터페이스를 구현한 클래스, 홈 인터페이스를 구현한 클래스, 각각의 RMI 스텁, 스켈레톤 클래스가 자동으로 생성된다.


2. J2EE 설치하기
a. 그냥 다운로드 받아서 설치한다. 여기서 버젼은 1.4.x이다.

b. 환경 설정을 한다.
- 환경 변수에서 CLASSPATH를 만들고, C:SunAppServerlibj2ee.jar 를 입력한다.

- J2EE_HOME을 만들고, C:SunAppServer를 입력한다.

- JAVA_HOME을 만들고, C:SunAppServerjdk를 입력한다.

- PATH는 편집하기를 하여, C:SunAppServerin 과 C:SunAppServerjdkin을 추가한다.

- J2EE 서버에 관한 내용은 http://www.kid.pe.kr/blog/index.php?pl=118&ct1=4 에 있으므로 참고바람^^


3. 간단한 덧셈을 계산하여 주는 EJB와 jsp을 연동하는 프로그래밍하기
a. Home Interface 작성
AddHome.java
package kr.co.kid.ejb.user;

import java.rmi.*;
import javax.ejb.*;

public interface AddHome extends EJBHome {
public Add create() throws CreateException, RemoteException;
}


b. Remote Interface 작성
Add.java
package kr.co.kid.ejb.user;

import java.rmi.*;
import javax.ejb.*;

public interface Add extends EJBObject {
public int getAdd(int num1, int num2) throws RemoteException;
}


c. Bean Class 작성
AddEJB.java
package kr.co.kid.ejb.user;

import java.util.*;
import javax.ejb.*;

public class AddEJB implements SessionBean {
public int getAdd(int num1, int num2) {
return num1 + num2;
}

public AddEJB(){}
public void ejbCreate(){}
public void ejbRemove(){}
public void ejbActivate(){}
public void ejbPassivate(){}
public void setSessionContext(SessionContext sc){}
}


4. 디플로이먼트 하기
a. 먼저 컴파일을 한다.


b. class 파일을 소스 파일에서 package로 지정한 디렉토리(즉 kr.co.kid.ejb.user)를 차례대로 만들어 그곳에 복사한다.


c. J2EE의 default Server를 실행한다.

d. J2EE의 Deploytool을 실행한다.


e. File -> New -> Application 을 선택한다.

- 여기서는 임의의 폴더 project를 만들고, Add라는 임의의 이름을 지정해주었다. 이 project 폴더 안에서 jar과 ear이 만들어진다.
- OK 버튼을 누르면 Applications에 Add가 첨가되어있는 것을 볼 수 있다.


f. File -> New -> Enterprise Bean을 선택한다.

- JAR Display Name에 Add라는 이름을 지정하고 Edit Content를 선택한다.

- 앞에서 만들었던 최상위 폴더에서 kr폴더를 선택하고 Add한다. 그러면 아래 프레임에 krcokidejbuser 안의 class가 Add된 것을 알 수 있다. OK 버튼을 누르고 Next한다.

- 위의 그림처럼 설정하자. Enterprise Bean Type은 무상태, 즉 Stateless Session으로 놓아둔다. Remote Interface도 설정하고 Next한다.

- No로 설정하고 그냥 Next한다.
- 마지막 화면이 나오면 Finish한다.

- 설정이 끝나면 본화면에서 Add아래에 Add/AddEJB가 생성된 것을 확인할 수 있다.

- AddEJB위의 Add를 선택하고 아래의 Sun-specific Settings...버튼을 누르면 위 그림처럼 다이얼로그가 뜬다. 여기서 JNDI Name을 MyAdd로 설정한다.

5. EJB와 연동하기 위해 html 및 jsp 작성하기
※ 블로그에서 <>를 태그로 인식하므로 []로 대체해서 소스를 올렸다.
a. html 작성하기
Addform.html
[html]
[head]
[title]EJB 와 덧셈 [/title]
[/head]

[body]
[!--
post 방식으로 add.jsp를 호출합니다. add.jsp는 EJB객체를 이용하는 jsp 파일입니다.
--]

[form method = "post" action="Add.jsp"]
값 1:[input type = "text" name = "num1"][br]
값 2:[input type = "text" name = "num2"][br]
[input type = "submit" value="계산"]
[/form]
[/body]
[/html]


b. jsp 작성하기
Add.jsp
[%@page contentType = "text/html; charset=euc-kr" %]
[%@page import = "javax.naming.*" %]
[%@page import = "javax.rmi.PortableRemoteObject" %]
[%@page import = "kr.co.kid.ejb.user.AddHome" %]
[%@page import = "kr.co.kid.ejb.user.Add" %]
[html]
[head]
[title]EJB와 덧셈[/title]
[/head]

[body]

[%
int num1 = 0;
int num2 = 0;

try {
num1 = Integer.parseInt(request.getParameter("num1"));
} catch(Exception e) {
num1 = 0;
}

try {
num2 = Integer.parseInt(request.getParameter("num2"));
} catch(Exception e) {
num2 = 0;
}

Context initial = new InitialContext();
Object obj = initial.lookup("MyAdd");

AddHome home = (AddHome)PortableRemoteObject.narrow(obj, AddHome.class);

Add a1 = home.create();
out.println("결과값 : " + a1.getAdd(num1, num2));
%]

[/body]


6. EJB와 연동하기 위해 Web Compoent 만들기
a. Deploytools에서 File -> New -> Web Component... 를 선택한다.

- Create New WAR Module in Application에서 Add를 선택하고, War Display Name은 AddWar로 설정한 후 아래의 Edit Content 버튼을 클릭한다.

- Enterprise Beans 와 마찬가지로 다이얼로그 창이 뜨는데, 조금전에 작성했던 Addform.html과 Add.jsp를 선택하여 Add하고, Next한다.

- Web Component로 JSP를 사용할 것이기 때문에 JSP Page를 선택하고 Next.

- JSP filename으로 Add.jsp를 선택하면 자동으로 에디트툴에 설정해준다. 그 후에 Next하고 Finish

- AddWar라는 이름의 Web Component가 생성된 것을 확인할 수 있다. AddWar를 선택하고 General Tab의 Context Root에 AddContextRoot라고 입력한다.

- EJB Ref's 탭의 Add 버튼을 선택하고 위 그림처럼 설정한다.

b. Applications의 바로 아래 Add를 선택한 후, Tool -> Deploy를 선택한다.

- Return Client Jar의 라디오 체크버튼을 체크하고 OK한다.

- 위의 그림처럼 나오면 deplyment를 성공한 것이다.

- localhost:4848을 선택하면 오른쪽 프레임에 Add가 running되어 있는 것을 확인한다. (deployment 되었음)

c. 제대로 연동이 되는지 웹브라우저에서 확인해보자

- 주소를 http://localhost:8080/AddContextRoot/Addform.html 지정하고 위의 화면이 나오면 첫번째 관문은 통과~ 값을 입력하고 계산 버튼을 눌러보자!

- Add.jsp가 불러지고 위의 화면처럼 결과값이 나오면 제대로 연동된 것이다~ 축하~

7. 몇가지 참고할만 한 것들
a. deployment된 파일들은 C:SunAppServerdomainsdomain1applicationsj2ee-appsAdd 에서 확인할 수 있다.
b. 자바 1.4대 부터는 이전처럼 같은 폴더 안에 있는 class파일을 그냥 import할 수 없다. package 명령을 사용하여 폴더를 지정해줘야한다. 4-b 디렉토리 설정과 5-b jsp 소스의 3,4번째 import 참고

8. 후기
인터넷에 나온 예제들이 J2EE 1.3을 기준으로 하여 약간씩 변화된 것이 많다. 특히 deploy tools의 설정이 많이 변경되었다. (삽질이 많았다 ㅜㅜ) 또한 jsp에서 사용자 class의 import와 java파일의 package 설정 또한 자세히 나와있지 않아(자바 기초 부족 ㅡㅡ;), 여러 서적을 뒤적거리면서 찾아냈다. (이것땜시 이틀 날림;;)
아직 끝난 것은 아니다. MySQL 등 관계형 데이터베이스와 연동을 시도해야한다 ㅡㅁㅡ; 휴~

JSP MVC 모델 기본 설명 : 모델 2 구조를 이용한 MVC 패턴 구현

[출처] http://dawnisthm.tistory.com/152

< 모델 2 구조를 이용한 MVC 패턴 구현 >

1. 모델 2 구조의 구현 방법 : 기본 MVC 패턴 구현 기법

[SimpleController.java]



package soldesk.mvc;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class SimpleController extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

processRequest(request, response);

}

private void processRequest(HttpServletRequest request, HttpServletResponse response)

throws IOException, ServletException {

// 2단계, 요청 파악

// request 객체로부터 사용자의 요청을 파악하는 코드

String type = request.getParameter("type");

// 3단계, 요청한 기능을 수행한다.

// 사용자에 요청에 따라 알맞은 코드

Object resultObject = null;

if (type == null || type.equals("greeting")) {

resultObject = "안녕하세요.";

} else if (type.equals("date")) {

resultObject = new java.util.Date();

} else {

resultObject = "Invalid Type";

}

// 4단계, request나 session에 처리 결과를 저장

request.setAttribute("result", resultObject);

// 5단계, RequestDispatcher를 사용하여 알맞은 뷰로 포워딩

RequestDispatcher dispatcher =

request.getRequestDispatcher("/simpleView.jsp");

dispatcher.forward(request, response);

}

}


[simpleView.jsp]

<%@ page language="java" contentType="text/html; charset=EUC-KR"%>

<html>

<head>

<title>뷰</title>

</head>

<body>

// 컨트롤러가 전달한 값을 읽어옴.

결과 : <%= request.getAttribute("result")%>

</body>

</html>



[WEB-INF\web.xml] 추가

<servlet>

<servlet-name>SimpleController</servlet-name>

<servlet-class>soldesk.mvc.SimpleController</servlet-class>
< /servlet>

<servlet-mapping>

<servlet-name>SimpleController</servlet-name>

<url-pattern>/simple</url-pattern>

</servlet-mapping>


그리고 SimpleController.java 실행시켜 보자.(JSP 페이지 구동시키는 아님을 주의!!)

2. 커맨드 패턴 기반의 코드

컨트롤러 서블릿이 사용자가 어떤 기능을 요청했는지 분석하기 위해 가장 일반적으로 사용하는 방법은 명령어를 사용하는 것이다.

  • 특정 이름의 파라미터에 명령어 정보를 전달한다.
  • 요청 URI 자체를 명령어로 사용한다.

<커맨드 패턴을 이용한 명령어 처리기의 분리>

String commend = request.getParameter("cmd");

CommandHandler handler = null;

if(command == null){

handler = new NullHandler();

}else if{command.equals("BoardList")){

handler = new BoardListHandler();

}else if(command.equals("BoardWriteForm"){

handler = new BoardWriteFormHandler();

}

String viewPage = handler.process(request, response);

RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage);

dispatcher.forward(request, response);


명령어를 처리하는 핸들러 클래스들은 CommandHandler 인터페이스를 구현하면 된다.

핸들러 클래스에서 처리해야 작업

public class SimeHandler implements CommandHandler{

public String process(HttpServletRequest request, HttpServletResponse response)

throws Throwable{

// 1. 명령어과 관련된 비즈니스 로직 처리

// 2. 페이지에서 사용할 정보 저장

request.setAttribute("someValue", value);

// 3. 페이지의 URI 리턴

return "/view/someView.jsp";

}

}

3. 설정 파일에 커맨드와 클래스의 관계 명시하기

: <명령어, 명령어 핸들러 클래스> 매핑 정보를 설정 파일에 저장

BoardList = soldesk.command.BoardListHandler

BoardWriteForm = soldesk.command.BoardWriteFormHandler

[ControllerUsingFile.java]

package soldesk.mvc.controller;

import java.io.FileInputStream;

import java.io.IOException;

import java.net.URL;

import java.util.Iterator;

import java.util.Map;

import java.util.Properties;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import soldesk.mvc.command.CommandHandler;

import soldesk.mvc.command.NullHandler;

public class ControllerUsingFile extends HttpServlet {

// <커맨드, 핸들러 인스턴스> 매핑 정보 저장

private Map commandHandlerMap = new java.util.HashMap();

public void init(ServletConfig config) throws ServletException {

String configFile = config.getInitParameter("configFile");

Properties prop = new Properties();

FileInputStream fis = null;

try {

String configFilePath = config.getServletContext().getRealPath(

configFile);

fis = new FileInputStream(configFilePath);

prop.load(fis);

} catch (IOException e) {

throw new ServletException(e);

} finally {

if (fis != null)

try {

fis.close();

} catch (IOException ex) {

}

}

Iterator keyIter = prop.keySet().iterator();

while (keyIter.hasNext()) {

String command = (String) keyIter.next();

String handlerClassName = prop.getProperty(command);

try {

Class handlerClass = Class.forName(handlerClassName);

Object handlerInstance = handlerClass.newInstance();

commandHandlerMap.put(command, handlerInstance);

} catch (ClassNotFoundException e) {

throw new ServletException(e);

} catch (InstantiationException e) {

throw new ServletException(e);

} catch (IllegalAccessException e) {

throw new ServletException(e);

}

}

}

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

process(request, response);

}

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

process(request, response);

}

private void process(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

String command = request.getParameter("cmd");

CommandHandler handler = (CommandHandler) commandHandlerMap

.get(command);

if (handler == null) {

handler = new NullHandler();

}

String viewPage = null;

try {

viewPage = handler.process(request, response);

} catch (Throwable e) {

throw new ServletException(e);

}

RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage);

dispatcher.forward(request, response);

}

}


[WEB-INF\web.xml] 추가

<servlet>

<servlet-name>ControllerUsingFile</servlet-name>

<servlet-class>soldesk.mvc.controller.ControllerUsingFile</servlet-class>

<init-param>

<param-name>configFile</param-name>

<param-value>/WEB-INF/commandHandler.properties</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>ControllerUsingFile</servlet-name>

<url-pattern>/controllerUsingFile</url-pattern>

</servlet-mapping>



[commandHandler.properties]

hello = soldesk.mvc.command.HelloHandler

[CommandHandler.java]

package soldesk.mvc.controller;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import soldesk.mvc.command.CommandHandler;

public class CommandHandler {

public String process(HttpServletRequest request, HttpServletResponse response) throws Throwable{

return.setAttribute("hello", "안녕하세요!");

return "/mvc/view/hello.jsp";

}

}


[HelloHandler.java]

package soldesk.mvc.command;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import soldesk.mvc.command.CommandHandler;

public class HelloHandler implements CommandHandler {

public String process(HttpServletRequest request,

HttpServletResponse response) throws Throwable {

request.setAttribute("hello", "안녕하세요!");

return "/mvc/view/hello.jsp";

}

}


[NullHandler.java]

package soldesk.mvc.command;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class NullHandler implements CommandHandler {

@Override

public String process(HttpServletRequest request,

HttpServletResponse response) throws Throwable {

return "/mvc/view/nullCommand.jsp";

}

}


[hello.jsp]

<%@ page contentType = "text/html; charset=euc-kr" %>

<html>

<head><title>Hello</title></head>

<body>

<%= request.getAttribute("hello") %>

</body>

</html>


[nullCommand.jsp]

<%@ page contentType="text/html; charset=euc-kr" %>

<html>

<head><title>에러</title></head>

<body>

잘못된 요청입니다.

</body>

</html>



4. 요청 URI 명령어로 사용하기

: 명령어 기반의 파라미터는 컨트롤러의 URL 사용자에게 노출된다는 단점이 있다.

따라서 URL 일부를 명령어로 사용하여 이런 문제를 방지할 있다.

  • URI 명령어로 사용하기 위해서는 컨트롤러 서블릿의 process()메서드에서 request.getParameter("cmd") 대신

    String command = request.getRequestURI();

    if(command.indexOF(request.getContextPath()) == 0){

    command = command.subString(request.getContextPath().length());

    }

사용하면 된다.



[ControllerUsingURI.java]

package soldesk.mvc.controller;

import java.io.FileInputStream;

import java.io.IOException;

import java.net.URL;

import java.util.Iterator;

import java.util.Map;

import java.util.Properties;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletConfig;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import soldesk.mvc.command.CommandHandler;

import soldesk.mvc.command.NullHandler;

public class ControllerUsingURI extends HttpServlet {

// <커맨드, 핸들러인스턴스> 매핑 정보 저장

private Map commandHandlerMap = new java.util.HashMap();

public void init(ServletConfig config) throws ServletException {

String configFile = config.getInitParameter("configFile2");

Properties prop = new Properties();

FileInputStream fis = null;

try {

String configFilePath = config.getServletContext().getRealPath(

configFile);

fis = new FileInputStream(configFilePath);

prop.load(fis);

} catch (IOException e) {

throw new ServletException(e);

} finally {

if (fis != null)

try {

fis.close();

} catch (IOException ex) {

}

}

Iterator keyIter = prop.keySet().iterator();

while (keyIter.hasNext()) {

String command = (String) keyIter.next();

String handlerClassName = prop.getProperty(command);

try {

Class handlerClass = Class.forName(handlerClassName);

Object handlerInstance = handlerClass.newInstance();

commandHandlerMap.put(command, handlerInstance);

} catch (ClassNotFoundException e) {

throw new ServletException(e);

} catch (InstantiationException e) {

throw new ServletException(e);

} catch (IllegalAccessException e) {

throw new ServletException(e);

}

}

}

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

process(request, response);

}

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

process(request, response);

}

private void process(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

String command = request.getRequestURI(); // /soldesk/hello.do

if (command.indexOf(request.getContextPath()) == 0) { // /soldesk

command = command.substring(request.getContextPath().length()); // /hello.do

}

CommandHandler handler = (CommandHandler) commandHandlerMap.get(command);

if (handler == null) {

handler = new NullHandler();

}

String viewPage = null;

try {

viewPage = handler.process(request, response);

} catch (Throwable e) {

throw new ServletException(e);

}

RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage);

dispatcher.forward(request, response);

}

}


[web.xml]

<servlet>

<servlet-name>ControllerUsingURI</servlet-name>

<servlet-class>soldesk.mvc.controller.ControllerUsingURI</servlet-class>

<init-param>

<param-name>configFile2</param-name>

<param-value>

/WEB-INF/commandHandlerURI.properties

</param-value>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>ControllerUsingURI</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>


[commandHandlerURI.properties]

/hello.do=soldesk.mvc.command.HelloHandler


Xcode4로 시작하는아이폰 프로그래밍


Yoshnao Mori지음 / 김태현 옮김 : 로드북(roadbook)


Section 3-1
오프젝티브 C 기본

C + smalltalk(NextStep) -> ObjectiveC


Section 3-2 포인터 변수

01 NSString *str = [NSString stringWithString: @"문자열"];

02 myLabel.text = str;

문자열 데이터 : @"문자열";

문자열 데이터 표시
NSLog(@"문자열");
NSLog(@"문자열 포멧", 값);

많은 데이터를 처리하기 : 배열
NSArray *배열 변수 =
[NSArray arrayWithObjects: 값, 값, 값, 값, … ,nil];

배열의 데이터 개수
배열 변수.count

번호를 지정해서 읽기
[배열변수 objectAtIndex:번호];

사전데이터 만들기
NSDictionary *사전 데이터 =
[NSDictionary dictionaryWithObjectsAndKeys:
값, 키, 값, 키, 값, 키, …., nil];

모든 키
사전 데이터.allKeys

키로 지정해서 읽기
[사전 데이터 objectForKey: 키];

Section 3-3 : 제어문


Section 3-4 : 클래스
오브젝트 사용방법

오브젝트 만들기
클래스명 *오브젝트명 = [[클래스명 alloc] 초기화 명령;

오브젝트 해제하기
[오브젝트명 release];

속성에 엑세스 하기
변수 = 오브젝트명.속성;
오브젝트명.속성 = 변수;

메소드 실행하기
[오브젝트명 메소드];

값을 넘겨주면서 실행할 때
[오브젝트명 메소드:인수];
[오브젝트명 메소드: 인수1 레이블: 인수2];

ex: 01 [myObject calc: 10 and 20]; <- myObject의 calc메소드에 인수 10, add라는 두번째 인수명에 인수 20을 넘겨주고 명령한다.

Bigtable, Blobstore 및 Google Storage를 사용하는 GAE 스토리지

[출처] http://www.dbguide.net/knowledge.db?cmd=view&boardUid=165874&boardConfigUid=20&boardStep=&categoryUid=574

GAE용 세 가지 데이터 스토리지 옵션에 관해 배운다.

이러한 저장소는 바이트를 덤프할 장소로 항상 사용되었기 때문에 디스크 드라이브와 그 위에 있는 파일 시스템을 당연한 것으로 생각하기 쉽다. 파일을 작성할 경우에는 파일의 위치, 사용 권한 및 공간 요구사항만 고려하면 된다. java.io.File을 생성하고 작업에 착수하면 되며, java.io.File은 사용자가 데스크탑 컴퓨터나 웹 서버 또는 모바일 디바이스 중 어느 위치에 있거나 동일하게 작동한다. 그러나 GAE로 작업하기 시작하면 이러한 투명성이나 투명성의 부족이 바로 분명해진다. GAE에서는 사용할 수 있는 파일 시스템이 없기 때문에 파일을 디스크에 쓸 수 없다. 이 클래스는 GAE SDK에서 블랙리스트에 올라 있기 때문에 사실상, java.io.FileInputStream을 선언하는 것만큼 컴파일 오류가 throw 명령을 통해 처리된다.

다행히도 사용 기간에는 옵션이 있으며 GAE는 특히 강력한 몇 가지 스토리지 옵션을 제공한다. 처음부터 확장성을 염두에 두고 설계되었기 때문에 GAE는 두 가지 키 값 저장소를 제공하며, Datastore(즉, Bigtable)는 일반적으로 데이터베이스에 삽입되는 일반 데이터를 저장하는 반면에 Blobstore는 대용량 2진 BLOB을 저장한다. 이 두 가지 저장소는 일정 시간 액세스 특성이 있으며 과거에 다루었을 수도 있는 파일 시스템과는 완전히 다르다.

이러한 두 가지 저장소 외에도 새로운 저장소가 있는데, 그것이 바로 Google Storage for Developers이다. 이 저장소는 기존의 파일 시스템과는 완전히 다른 Amazon S3와 비슷하게 작동한다. 이 기사에서는 각각의 GAE 스토리지 옵션을 차례로 구현하는 예제 애플리케이션을 빌드하게 된다. 독자는 Bigtable, Blobstore 및 Google Storage for Developers를 사용하는 것과 관련된 실천적 경험을 얻게 될 뿐만 아니라 각 구현의 장단점을 이해하게 될 것이다.

사전 설정: 예제 애플리케이션

GAE 스토리지 시스템을 탐구하기 전에 예제 애플리케이션에 필요한 세 가지 클래스를 작성해야 한다.

  • 사진을 표시하는 bean 클래스. Photo에는 title 및 caption과 같은 필드뿐만 아니라 2진 이미지 데이터를 저장하는 데 필요한 몇 가지 다른 필드가 포함되어 있다.
  • Photo가 GAE 데이터 저장소, Bigtable에 지속되게 하는 DAO 클래스. DAO에는 Photo를 삽입하는 메소드 하나와 ID로 Photo를 다시 끄집어내는 또 다른 메소드가 포함되어 있다. 이 클래스에서는 지속성을 위해 오픈 소스 라이브러리인 Objectify-Appengine을 사용한다.
  • Template Method 패턴을 사용하여 세 가지 단계의 워크플로우를 캡슐화하는 servlet 클래스. 여기에서는 워크플로우를 사용하여 각 GAE 스토리지 옵션을 탐구한다.

애플리케이션 워크플로우

이 기사에서는 동일한 절차에 따라 각 GAE 데이터 스토리지 옵션에 관해 배우게 되며, 이 과정에서 독자는 해당 기술에 집중할 수 있는 기회를 얻게 될 뿐만 아니라 각 스토리지 방법의 장단점을 비교할 수 있게 된다. 애플리케이션 워크플로우는 다음과 같이 매번 동일하다.

  1. 양식 표시 및 업로드
  2. 스토리지에 이미지를 업로드하고 데이터 저장소에 레코드 저장
  3. 이미지 제공

그림 1은 애플리케이션 워크플로우의 다이어그램이다.


그림 1. 각 스토리지 옵션을 설명하는 데 사용된 세 가지 단계의 워크플로우
GAE 데이터 스토리지 예제 애플리케이션 다이어그램

이 예제 애플리케이션을 이용하면 2진 이미지를 작성하여 제공하는 모든 GAE 프로젝트의 핵심 태스크를 실습할 수 있다는 부가적인 혜택을 누릴 수 있다. 이제 이러한 클래스를 작성해 보자.

간단한 GAE 애플리케이션

Eclipse를 설치하지 않았으면 Eclipse를 다운로드한 후, Eclipse용 Google 플러그인을 설치하고 GWT를 사용하지 않는 Google Web Application 프로젝트를 새로 작성한다. 프로젝트 파일을 구조화하는 방법에 관한 안내는 이 기사에 포함되어 있는 샘플 코드를 참조한다. Google 웹 애플리케이션 설정이 완료되면 목록 1과 같이 이 애플리케이션의 첫 번째 클래스인 Photo를 추가한다. (게터와 세터를 생략했다는 점에 유의한다.)


목록 1. Photo
import javax.persistence.Id; public class Photo {     @Id    private Long id;    private String title;    private String caption;    private String contentType;    private byte[] photoData;    private String photoPath;     public Photo() {    }     public Photo(String title, String caption) {        this.title = title;        this.caption = caption;    }     // getters and setters omitted}

@Id 어노테이션은 기본 키가 되는 필드를 지정하며 Objectify로 작업할 경?? 각 레코드는 엔티티라고도 하며 기본 키를 필요로 한다. 이미지가 업로드되면 이 이미지를 바이트 배열인 photoData에 직접 저장하도록 선택할 수 있다. 이 이미지는 Photo의 나머지 필드와 함께 Blob 특성으로 데이터 저장소에 작성된다. 다시 말해서 이 이미지는 bean 바로 옆에 저장되고 페치된다. 그대신 이미지가 Blobstore나 Google Storage에 업로드되면 바이트가 해당 시스템에 저장되고 photoPath는 바이트의 경로를 가리킨다. 어느 경우에든 photoData 또는 photoPath가 사용된다. 그림 2에는 각 저장소의 기능이 명확하게 표시되어 있다.


그림 2. photoData와 photoPath의 작동 방식
photoData와 photoPath 간의 차이점이 표시되어 있는 다이어그램

다음에는 bean의 지속성을 처리하게 된다.

오브젝트 기반 지속성

앞에서 언급한 바와 같이 Objectify를 사용하여 Photo bean을 위한 DAO를 작성할 것이다. JDO와 JPA가 더 인기 있고 널리 사용되는 지속성 API이지만, 이러한 API는 학습 커브가 가파르다. 앞에서와 달리 하위 레벨 GAE 데이터 저장소 API를 사용하기로 선택할 수도 있지만, 이런 경우에는 bean을 마샬링하여 데이터 저장소 엔티티에 저장해야 하는 성가신 작업이 수반된다. Objectify는 Java 리플렉션을 통해 이러한 작업을 처리한다. (Objectify-Appengine을 포함하여 GAE 지속성 대안에 관해 자세히 배우려면 참고자료를 참조한다.)

먼저, 목록 2에서와 같이 PhotoDao 클래스를 작성하고 코딩한다.


목록 2. PhotoDao
import com.googlecode.objectify.*;import com.googlecode.objectify.helper.DAOBase; public class PhotoDao extends DAOBase {     static {        ObjectifyService.register(Photo.class);    }     public Photo save(Photo photo) {        ofy().put(photo);        return photo;    }        public Photo findById(Long id) {        Key<Photo> key = new Key<Photo>(Photo.class, id);        return ofy().get(key);    }}

PhotoDaoObjectify 인스턴스를 느리게 로드하는 편리한 클래스인 DAOBase를 확장한다. Objectify는 API로 향하는 기본 인터페이스로, ofy 메소드를 통해 노출된다. 그러나 ofy를 사용하려면 목록 2에 있는 Photo와 같은 정적 초기화 프로그램에 지속적 클래스를 등록해야 한다.

DAO에는 Photo를 삽입하고 찾는 데 필요한 두 가지 메소드가 포함되어 있다. 각 메소드에서 Objectify에 대한 작업은 해시 테이블에 대한 작업만큼이나 간단하다. findById에 있는 Key를 사용하여 Photo를 페치한다는 사실을 알았을 수도 있지만, 이 기사에서는 Keyid 필드를 둘러싸는 랩퍼라고 생각한다.

이제 지속성을 관리할 PhotoDaoPhoto bean이 작성되었다. 다음에는 애플리케이션 워크플로우를 더 구체화한다.

Template Method 패턴을 통한 애플리케이션 워크플로우

Mad Lib을 해 본 경험이 있으면 Template Method 패턴이 이해가 될 것이다. 각 Mad Lib은 독자가 채우게 되는 다량의 빈 지점으로 구성된 이야기를 나타낸다. 독자의 입력, 즉 빈 지점이 어떻게 채워지느냐에 따라 이야기는 급격하게 바뀐다. 마찬가지로 Template Method 패턴을 사용하는 클래스에는 일련의 단계가 포함되어 있으며 이 중 일부는 빈 채로 남아 있다.

이 기사에서는 Template Method 패턴을 사용하여 예제 애플리케이션의 워크플로우를 실행하는 서블릿을 빌드할 것이다. 먼저, 추상 서블릿을 스텁아웃한 후, 이름을 AbstractUploadServlet으로 지정한다. 목록 3에 있는 코드를 참조로 사용할 수 있다.


목록 3. AbstractUploadServlet
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.*; @SuppressWarnings("serial")public abstract class AbstractUploadServlet extends HttpServlet { }

다음에는 목록 4에 있는 세 가지 추상 메소드를 추가한다. 각 메소드는 워크플로우의 단계를 나타낸다.


목록 4. 세 가지 추상 메소드
protected abstract void showForm(HttpServletRequest req,     HttpServletResponse resp) throws ServletException, IOException; protected abstract void handleSubmit(HttpServletRequest req,     HttpServletResponse resp) throws ServletException, IOException; protected abstract void showRecord(long id, HttpServletRequest req,     HttpServletResponse resp) throws ServletException, IOException;

이제, Template Method 패턴을 사용하고 있다는 점을 감안하여 목록 4에 있는 메소드와 목록 5에 있는 코드를 각각 공백과 공백을 짜맞추는 이야기라고 생각한다.


목록 5. 드러나는 워크플로우
 @Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)    throws ServletException, IOException {    String action = req.getParameter("action");    if ("display".equals(action)) {        // don't know why GAE appends underscores to the query string        long id = Long.parseLong(req.getParameter("id").replace("_", ""));        showRecord(id, req, resp);    } else {        showForm(req, resp);    }} @Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)     throws ServletException, IOException {    handleSubmit(req, resp);}

서블릿을 생각나게 하는 것

오랫동안 이전의 일반 서블릿으로 작업해 온 경우에는 doGetdoPostHTTP GETPOST를 처리하는 데 필요한 표준 메소드였다. GET을 사용하여 웹 자원을 페치하고 POST를 사용하여 데이터를 전송하는 것이 일반적인 관습이었다. 이러한 방식으로 doGet 구현은 업로드 양식이나 스토리지의 사진을 표시하고 doPost는 업로드 양식을 제출한다. 이러한 작업은 AbstractUploadServlet을 확장하여 각 작동을 정의하는 클래스가 담당한다. 그림 3에 있는 다이어그램에는 발생하는 이벤트의 시퀀스가 표시되어 있다. 정확히 어떠한 일이 벌어지고 있는지 분명히 알려면 몇 분 정도 시간이 필요하다.


그림 3. 시퀀스 다이어그램의 워크플로우
예제 애플리케이션 워크플로우의 시퀀스 다이어그램

세 가지 클래스가 빌드되면 예제 애플리케이션을 시작할 준비가 된다. 이제, Bigtable을 시작으로 각 GAE 스토리지 옵션이 애플리케이션 워크플로우와 어떻게 상호 작용하는지 집중적으로 살펴보도록 하자.

GAE 스토리지 옵션 #1: Bigtable

Google의 GAE 문서에는 Bigtable이 공유되고, 정렬된 배열로 기술되어 있지만, Bigtable을 방대한 서버 전체에 청크된 거대한 해시 테이블로 여기는 것이 더 이해하기 쉽다고 생각한다. 관계형 데이터베이스와 마찬가지로 Bigtable에는 데이터 유형이 있다. 사실상, Bigtable과 관계형 데이터베이스는 blob 유형을 사용하여 2진 데이터를 저장한다.

blob 유형을 나중에 살펴보게 될, GAE의 다른 키 값 저장소인 Blobstore와 혼동하지 말아야 한다.

blob은 다른 필드와 함께 로드하여 즉시 사용할 수 있으므로 Bigtable의 blob에 대한 작업이 가장 편하다. 한 가지 중요한 제한사항은 blob은 크기가 1MB 이하여야 한다는 점이지만, 이러한 제한사항은 미래에는 완화될 것이다. 현재는 크기가 1MB 미만인 사진을 찍는 디지털 카메라를 찾기가 어려우므로 Bigtable을 사용하는 것이 이미지와 관련된 유스 케이스의 단점을 돌릴 수 있는 방법이다. 현재 1MB 규칙을 따르고 있거나 이미지보다 더 작은 무엇인가를 저장하고 있는 경우에도 세 가지 GAE 스토리지 대안 중 Bigtable이 좋은 선택이 될 수 있으며 작업하기도 가장 수월하다.

Bigtable에 데이터를 업로드할 수 있으려면 업로드 양식을 작성해야 한다. 그런 다음에는 Bigtable에 맞게 사용자 정의된 세 가지 추상 메소드로 구성된 서블릿 구현을 처리할 것이다. 1MB 한계는 사람들이 위반하기 쉬우므로 마지막에는 오류 처리 기능을 구현하게 된다.

업로드 양식 작성

그림 4에는 Bigtable용 업로드 양식이 표시되어 있다.


그림 4. Bigtable용 업로드 양식
디지털 이미지용 업로드 양식의 스크린샷

이 양식을 작성하려면 datastore.jsp 파일로 시작하여 목록 6에 있는 코드 블록을 삽입한다.


목록 6. 사용자 정의 업로드 양식
<html>    <head>        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />    </head>    <body>		        <form method="POST" enctype="multipart/form-data">            <table>                <tr>	                    <td>Title</td>                    <td><input type="text" name="title" /></td>                </tr>                <tr>	                    <td>Caption</td>                    <td><input type="text" name="caption" /></td>                </tr>                <tr>	                    <td>Upload</td>                    <td><input type="file" name="file" /></td>                </tr>                <tr>                    <td colspan="2"><input type="submit" /></td>                </tr>				            </table>        </form>    </body>	</html>

이 양식에서는 method 속성과 enclosure 유형을 각각 POST와 multipart/form-data로 설정해야 한다. action 속성을 지정하지 않았으므로 이 양식은 자신에게 제출된다. POST를 수행하면 결국 AbstractUploadServletdoPosthandleSubmit을 호출한다.

양식을 작성했으므로 이 양식을 지원하는 서블릿을 살펴보도록 하자.

Bigtable에 업로드하고 업로드한 이미지를 다시 꺼내기

여기에서는 세 가지 메소드를 차례로 구현한다. 하나는 방금 작성한 양식을 표시하고 또 다른 하나는 업로드를 처리한다. 마지막 메소드는 업로드한 이미지를 다시 사용자에게 표시하는 역할을 하므로 이러한 과정이 어떻게 완료되는지 확인할 수 있다.

이 서블릿은 Apache Commons FileUpload 라이브러리를 사용한다. 이 라이브러리와 그 종속 항목을 다운로드하여 프로젝트에 삽입한다. 이 작업이 완료되면 목록 7에 있는 스텁을 생각해 본다.


목록 7. DatastoreUploadServlet
import info.johnwheeler.gaestorage.core.*;import java.io.*;import javax.servlet.ServletException;import javax.servlet.http.*;import org.apache.commons.fileupload.*;import org.apache.commons.fileupload.servlet.ServletFileUpload;import org.apache.commons.fileupload.util.Streams; @SuppressWarnings("serial")public class DatastoreUploadServlet extends AbstractUploadServlet {    private PhotoDao dao = new PhotoDao();}

여기에서는 아직 흥미로운 내용이 없다. 필요한 클래스를 가져오고 나중에 사용할 PhotoDao를 구성한다. 추상 모델을 구현할 때까지는 DatastoreUploadServlet은 컴파일하지 않을 것이다. 목록 8에 있는 showForm을 시작으로 각각 단계별로 살펴보도록 하자.


목록 8. showForm
@Overrideprotected void showForm(HttpServletRequest req, HttpServletResponse resp)     throws ServletException, IOException {    req.getRequestDispatcher("datastore.jsp").forward(req, resp);        }

아는 바와 같이 showForm은 업로드 양식을 전달할 뿐이다. 목록 9에 있는 handleSubmit이 더 관련이 있다.


목록 9. handleSubmit
@Overrideprotected void handleSubmit(HttpServletRequest req,    HttpServletResponse resp) throws ServletException, IOException {    ServletFileUpload upload = new ServletFileUpload();     try {        FileItemIterator it = upload.getItemIterator(req);         Photo photo = new Photo();         while (it.hasNext()) {            FileItemStream item = it.next();            String fieldName = item.getFieldName();            InputStream fieldValue = item.openStream();             if ("title".equals(fieldName)) {                photo.setTitle(Streams.asString(fieldValue));                continue;            }             if ("caption".equals(fieldName)) {                photo.setCaption(Streams.asString(fieldValue));                continue;            }             if ("file".equals(fieldName)) {                photo.setContentType(item.getContentType());                ByteArrayOutputStream out = new ByteArrayOutputStream();                Streams.copy(fieldValue, out, true);                photo.setPhotoData(out.toByteArray());                continue;            }        }         dao.save(photo);        resp.sendRedirect("datastore?action=display&id=" + photo.getId());                } catch (FileUploadException e) {        throw new ServletException(e);    }        }

코드가 길지만 이 코드가 하는 기능은 단순하다. handleSubmit 메소드는 업로드 양식의 요청 본문을 스트리밍하고, 각 양식 값을 FileItemStream으로 추출한다. 반면에 Photo는 한 번에 한 조각씩 설정한다. 각 필드를 조사하여 무엇이 유용한지 확인하는 것은 그다지 좋지 않지만, 이렇게 하는 것이 스트리밍 데이터와 스트리밍 API의 처리 방식이다.

코드로 다시 돌아가서 file 필드를 살펴보면 ByteArrayOutputStream은 업로드된 바이트를 photoData에 조금씩 보내는 데 도움을 준다. 마지막으로 PhotoDao를 사용하여 Photo를 저장하고 경로 재지정을 전송한다. 그러면 최종 추상 클래스인 showRecord(목록 10)를 시작할 수 있다.


목록 10. showRecord
@Overrideprotected void showRecord(long id, HttpServletRequest req,     HttpServletResponse resp) throws ServletException, IOException {    Photo photo = dao.findById(id);            resp.setContentType(photo.getContentType());            resp.getOutputStream().write(photo.getPhotoData());    resp.flushBuffer();                    }

showRecordPhoto를 검색하고, photoData 바이트 배열을 직접 HTTP 응답에 쓰기 전에 content-type 헤더를 설정한다. flushBuffer는 남아 있는 컨텐츠를 강제로 브라우저로 보낸다.

마지막으로 1MB보다 큰 이미지를 업로드하는 경우, 이를 오류로 처리하는 일부 코드를 추가해야 한다.

오류 메시지 표시

앞에서 언급한 바와 같이 Bigtable에는 1MB 한계가 있으며, 이는 이미지와 관련된 대부분의 유스 케이스에서 해결되지 않고 있는 문제점이다. 기껏해야 사용자에게 이미지의 크기를 조정한 후, 다시 시도하라고 요청할 수 있을 뿐이다. 데모를 하기 위한 것이므로 목록 11에 있는 코드는 GAE 예외가 throw 명령으로 처리될 때 단순히 예외 메시지를 표시한다. (이는 서블릿에 특정된 표준 오류 처리 방식이지 GAE에 특정된 것은 아니라는 점에 유의한다.)


목록 11. 오류가 발생함
import java.io.*;import javax.servlet.ServletException;import javax.servlet.http.*; @SuppressWarnings("serial")public class ErrorServlet extends HttpServlet {    @Override    protected void service(HttpServletRequest req, HttpServletResponse res)         throws ServletException, IOException {        String message = (String)               req.getAttribute("javax.servlet.error.message");                PrintWriter out = res.getWriter();        out.write("<html>");        out.write("<body>");        out.write("<h1>An error has occurred</h1>");                        out.write("<br />" + message);                out.write("</body>");        out.write("</html>");    }}

이 기사에서 작성하게 될 다른 서블릿과 ErrorServlet을 web.xml에 등록하는 것을 잊지 말아야 한다. 목록 12에 있는 코드는 ErrorServlet을 가리키는 오류 페이지를 등록한다.


목록 12. 오류 페이지 등록
<servlet>    <servlet-name>errorServlet</servlet-name>	      <servlet-class>        info.johnwheeler.gaestorage.servlet.ErrorServlet    </servlet-class></servlet> <servlet-mapping>    <servlet-name>errorServlet</servlet-name>    <url-pattern>/error</url-pattern></servlet-mapping> <error-page>    <error-code>500</error-code>    <location>/error</location></error-page>

이것으로 GAE 데이터 저장소라고도 하는 Bigtable에 대한 간단한 소개를 마무리한다. Bigtable은 GAE 스토리지 옵션 중 가장 직관적이지만, 파일 크기가 1MB로 제한되는 단점이 있어서 썸네일보다 더 큰 것(그러한 것이 있는 경우) 에 대해서는 Bigtable을 사용하고 싶지 않을 것이다. 다음에는 최대 2GB 크기의 파일을 저장하고 제공할 수 있는 또 다른 키 값 스토리지 옵션인 Blobstore를 살펴본다.

GAE 스토리지 옵션 #2: Blobstore

Bigtable에 비해 Blobstore는 크기면에서 장점을 지니지만, 문제점이 없는 것은 아니다. 다시 말해서 Blobstore를 사용하는 경우에는 일회성 업로드 URL을 사용해야 하기 때문에 여기저기에 웹 서비스를 구축하기가 어렵다. 예제는 다음과 같다.

/_ah/upload/aglub19hcHBfaWRyGwsSFV9fQmxvYlVwbG9hZFNlc3Npb25fXxh9DA

웹 서비스 클라이언트는 해당 URL에 POST하기 전에 이 URL을 요청해야 하며 이로 인해 네트워크에서 추가적인 호출이 필요하다. 이는 대부분의 애플리케이션에 심각한 영향을 주지는 않지만 그렇다고 아무런 문제가 없는 것은 아니다. CPU 사용 시간에 요금이 청구되는 GAE에서 클라이언트가 실행 중인 경우에는 이점이 문제가 될 수 있다. URLFetch를 통해 일회성 URL에 업로드를 전달하는 서블릿을 빌드하면 이러한 문제점을 피할 수 있을 것으로 생각한다면 다시 생각해 보아야 한다. URLFetch는 전송할 수 있는 한계가 1MB이기 때문에 그렇게 하려면 Bigtable을 사용하는 편이 낫다. 그림 5에 있는 그래픽에는 판단에 도움을 줄 수 있는, 한 갈래의 웹 서비스 호출과 두 갈래의 웹 서비스 호출의 차이점이 표시되어 있다.


그림 5. 한 갈래의 웹 서비스 호출과 두 갈래의 웹 서비스 호출의 차이점
웹 서비스 클라이언트와 Blobstore(두 갈래로 된) 사이 및 웹 서비스 클라이언트와 Bigtable(한 갈래로 된) 사이에서 이동하는 이미지 파일이 표시되어 있는 그래픽

Blobstore에는 장단점이 있으며 다음 섹션에서는 이점을 자세하게 확인한다. 다시 한 번 더 양식을 빌드하고 업로드하며 AbstractUploadServlet으로 제공되는 세 가지 추상 메소드를 구현하지만, 이번에는 Blobstore에 맞게 코드를 조정한다.

Blobstore용 업로드 양식

업로드 양식을 Blobstore에 맞게 고칠 부분은 별로 없으므로 datastore.jsp를 blobstore.jsp 파일로 복사한 후, 이 파일에 목록 13 코드의 굵은체로 표시된 행을 추가한다.


목록 13. blobstore.jsp
<% String uploadUrl = (String) request.getAttribute("uploadUrl"); %><html>    <head>        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />    </head>    <body>		        <form method="POST" action="<%= uploadUrl %>"            enctype="multipart/form-data">		<!-- labels and fields omitted -->        </form>    </body>	</html>

일회성 업로드 URL은 다음에 코딩할 서블릿에서 생성된다. 여기에서 업로드 URL이 해당 요청으로부터 구문 분석되어 양식의 action 속성에 배치된다. 업로드할 Blobstore 서블릿에 대한 제어는 없다. 그렇다면 기타 양식 값은 어떻게 얻게 될까? 그 해답은 Blobstore API의 콜백 메커니즘에 있다. 일회성 URL이 생성되면 콜백 URL을 Blobstore API에 전달한다. 업로드 후에는 Blobstore가 콜백을 호출하여 원래의 요청을 업로드된 모든 blob과 함께 전달한다. 다음에 AbstractUploadServlet을 구현하면 이러한 작동 상태에 있는 모든 것을 확인할 수 있다.

Blobstore에 업로드하기

먼저, 목록 14를 참조로 사용하여 AbstractUploadServlet을 확장하는 BlobstoreUploadServlet 클래스를 스텁아웃한다.


목록 14. BlobstoreUploadServlet
import info.johnwheeler.gaestorage.core.*;import java.io.IOException;import java.util.Map;import javax.servlet.ServletException;import javax.servlet.http.*;import com.google.appengine.api.blobstore.*; @SuppressWarnings("serial")public class BlobstoreUploadServlet extends AbstractUploadServlet {    private BlobstoreService blobService =         BlobstoreServiceFactory.getBlobstoreService();    private PhotoDao dao = new PhotoDao();}

초기 클래스 정의는 DatastoreUploadServlet에서 했던 것과 비슷하지만, BlobstoreService 변수가 새로 추가되었다. 이것이 목록 15의 showForm에 있는 일회성 URL을 생성한다.


목록 15. showForm for blobstore
@Overrideprotected void showForm(HttpServletRequest req, HttpServletResponse resp)     throws ServletException, IOException {    String uploadUrl = blobService.createUploadUrl("/blobstore");    req.setAttribute("uploadUrl", uploadUrl);    req.getRequestDispatcher("blobstore.jsp").forward(req, resp);}

목록 15에 있는 코드는 업로드 URL을 작성하여 이 URL을 해당 요청에 설정한다. 그 다음에는 이 코드가 목록 13에서 작성된 양식에 전달되며, 여기서 업로드 URL이 예상된다. 콜백 URL은 web.xml에 정의된 대로 이 서블릿의 컨텍스트에 설정된다. 이와 같이 Blobstore가 다시 POST되면 목록 16에 표시되어 있는 handleSubmit에 도달한다.


목록 16. Blobstore용 handleSubmit
@Overrideprotected void handleSubmit(HttpServletRequest req,     HttpServletResponse resp) throws ServletException, IOException {    Map<String, BlobKey> blobs = blobService.getUploadedBlobs(req);    BlobKey blobKey = blobs.get(blobs.keySet().iterator().next());     String photoPath = blobKey.getKeyString();    String title = req.getParameter("title");    String caption = req.getParameter("caption");        Photo photo = new Photo(title, caption);    photo.setPhotoPath(photoPath);    dao.save(photo);     resp.sendRedirect("blobstore?action=display&id=" + photo.getId());}

getUploadedBlobsBlobKeysMap을 리턴한다. 업로드 양식은 단일 업로드를 지원하므로 예상되는 유일한 BlobKey를 가져와서 이것의 문자열 표현을 photoPath 변수에 채운다. 그 후에는 나머지 필드가 구문 분석되어 변수에 저장되고 새로운 Photo 인스턴스에 설정된다. 이 인스턴스는 목록 17에 있는 showRecord로 경로가 재지정되기 전에 데이터 저장소에 저장된다.


목록 17. Blobstore용 showRecord
@Overrideprotected void showRecord(long id, HttpServletRequest req,     HttpServletResponse resp) throws ServletException, IOException {    Photo photo = dao.findById(id);    String photoPath = photo.getPhotoPath();     blobService.serve(new BlobKey(photoPath), resp);}

showRecord에서는 방금 handleSubmit에 저장된 Photo가 Blobstore에서 다시 로드된다. 어떤 것이든 업로드된 것의 실제 바이트는 Bigtable에 있었기 때문에 bean에 저장되지 않는다. 그 대신 BlobKeyphotoPath와 함께 다시 빌드되어 브라우저에 이미지를 제공하는 데 사용된다.

Blobstore는 양식 기반 업로드에 대한 작업을 짜증나게 하지만, 웹 서비스 기반 업로드는 얘기가 다르다. 다음에는 정확히 상반되는 난제, 즉 양식 기반 업로드는 해킹이 다소 필요한 반면에 서비스 기반 업로드는 쉽다는 점을 충족시켜 주는 Google Storage for Developers를 확인하게 된다.

GAE 스토리지 옵션 #3: Google Storage

Google Storage for Developers는 세 가지 GAE 스토리지 옵션 중에서 가장 기능이 강력하며 특별한 몇 가지 사항을 분명하게 하면 사용하기도 쉽다. Google Storage는 Amazon S3와 공통점이 많으며 사실상, 이 두 가지는 동일한 프로토콜과 RESTful 인터페이스를 사용하며 따라서 라이브러리가 JetS3t와 같은 S3 및 Google Storage와 함께 작동하도록 되어 있다. 불행히도 이 기사를 쓰는 현재는 이 라이브러리가 스레드 복제와 같은 허용되지 않은 조작을 수행하기 때문에 Google App Engine에서 정확하게 작동하지 않는다. 따라서 잠깐 동안 RESTful 인터페이스와 함께 작동하도록 내버려 두고 이렇게 하지 않았으면 이러한 API가 수행하게 되었을 힘든 작업 중 일부를 수행한다.

Google Storage는 ACL(Access Control Lists)을 통해 강력한 액세스 제어를 지원하므로 노력을 들일 만한 가치가 있다. ACL을 사용하면 오브젝트에 읽기 전용 및 읽기-쓰기 액세스 권한을 부여할 수 있으므로 Facebook과 Flickr에 있는 사진과 마찬가지로 사진을 쉽게 공용화하거나 사설화할 수 있다. 이 기사에서는 ACL을 다루지 않으므로 업로드하게 되는 모든 것에는 공용 읽기 전용 액세스 권한이 부여된다. ACL을 자세히 배우려면 Google Storage 온라인 문서(참고자료)를 참조한다.

Google Storage 정보

2010년 5월에 프리뷰 에디션으로 릴리스된 Google Storage for Developers는 현재, 미국에 있는 개발자 중 제한된 인원만 사용할 수 있으며 프리뷰 에디션에 대한 대기 목록이 있다. 아직은 초기 단계에 있는 Google Storage에는 구현상에 몇 가지 문제점이 있으며, 이 섹션에서는 이러한 문제점을 극복하는 방법을 살펴본다. Google Storage와 GAE 간에 명백한 통합 경로가 없다는 점은 코드를 추가로 작성해야 한다는 점을 의미하지만, 액세스 제어를 필요로 하는 경우와 같은 일부 유스 케이스의 경우는 노력을 들일 만한 가치가 있다. 조만간 통합 라이브러리를 살펴볼 수 있기를 바란다.

Blobstore와 달리 Google Storage는 기본적으로 웹 서비스와 브라우저 클라이언트 형태로 모두 사용할 수 있다. 데이터는 RESTful PUT이나 POST를 통해 전송된다. 첫 번째 옵션은 요청이 구조화되는 방식과 헤더가 작성되는 방식을 제어할 수 있는 웹 서비스 클라이언트용이다. 여기에서 탐구하게 될 두 번째 옵션은 브라우저 기반 업로드용이다. 업로드 양식을 처리하려면 Javascript 핵이 필요한데, 알다시피 여기에는 몇 가지 복잡한 문제점이 존재한다.

Google Storage 업로드 양식 해킹

Blobstore와 달리, Google Storage는 URL이 POST된 후에도 콜백 URL로 전달하지 않는다. 그 대신 지정한 URL로 경로를 재지정한다. 양식 값은 경로 재지정을 거쳐 실행되지 않기 때문에 이렇게 하면 문제가 발생한다. 이러한 문제점을 회피하려면 같은 웹 페이지에 두 가지 양식을 작성하여, 하나에는 제목과 캡션 텍스트 필드를 삽입하고 다른 하나에는 파일 업로드 필드와 Google Storage 필수 매개변수를 포함시켜야 한다. 그런 다음에는 Ajax를 사용하여 첫 번째 양식을 제출한다. Ajax 콜백이 호출되면 두 번째 업로드 양식을 제출한다.

이 양식은 마지막 두 가지 양식보다 더 복잡하므로 단계별로 구성한다. 먼저, 아직 빌드되지 않은 전달 서블릿(목록 18)에 의해 설정되는 몇 가지 값을 추출한다.


목록 18. 양식 값 추출
<% String uploadUrl = (String) request.getAttribute("uploadUrl");String key = (String) request.getAttribute("key");String successActionRedirect = (String)     request.getAttribute("successActionRedirect");String accessId = (String) request.getAttribute("GoogleAccessId");String policy = (String) request.getAttribute("policy");String signature = (String) request.getAttribute("signature");String acl = (String) request.getAttribute("acl");%>

uploadUrl은 Google Storage의 REST 엔드포인트를 유지한다. API는 아래와 같은 두 가지를 제공한다. 어느 것이나 사용할 수 있지만, 기울임꼴로 되어 있는 컴포넌트를 해당 값으로 바꿔야 한다.

  • bucket.commondatastorage.googleapis.com/object
  • commondatastorage.googleapis.com/bucket/object

나머지 변수는 다음과 같은 Google Storage 매개변수이다.

  • key: Google Storage에 업로드된 데이터의 이름
  • success_action_redirect: 업로드가 완료되면 경로가 재지정되는 위치
  • GoogleAccessId: Google에서 지정하는 API 키
  • policy: Base-64로 인코딩된 JSON 문자열(데이터 업로드 방식 제한)
  • signature: 해시 알고리즘으로 사인되어 Base-64로 인코딩된 정책. 인증에 사용된다.
  • acl: 액세스 제어 목록 스펙

두 가지 양식과 제출 단추

목록 19에 있는 첫 번째 양식에는 Title과 Caption 필드가 있다. 둘러싸는 <html><body> 태그는 생략되었다.


목록 19. 첫 번째 업로드 양식
<form id="fieldsForm" method="POST">    <table>        <tr>	            <td>Title</td>            <td><input type="text" name="title" /></td>        </tr>        <tr>	            <td>Caption</td>            <td>                <input type="hidden" name="key" value="<%= key %>" />	                <input type="text" name="caption" />            </td>        </tr>			    </table>		</form>

이 양식은 자신에게 POST한다는 점을 제외하면 그다지 언급할 만한 사항이 없다. 목록 20에 있는 양식을 살펴보도록 하자. 이 양식은 숨겨진 입력 필드를 여섯 개 포함하고 있어서 훨씬 더 크다.


목록 20. 숨겨진 필드가 있는 두 번째 양식
 <form id="uploadForm" method="POST" action="<%= uploadUrl %>"     enctype="multipart/form-data">    <table>        <tr>            <td>Upload</td>            <td>                <input type="hidden" name="key" value="<%= key %>" />                <input type="hidden" name="GoogleAccessId"                     value="<%= accessId %>" />                <input type="hidden" name="policy"                     value="<%= policy %>" />                <input type="hidden" name="acl" value="<%= acl %>" />                <input type="hidden" id="success_action_redirect"                     name="success_action_redirect"                     value="<%= successActionRedirect %>" />                <input type="hidden" name="signature"                    value="<%= signature %>" />                <input type="file" name="file" />            </td>        </tr>        <tr>            <td colspan="2">                <input type="button" value="Submit" id="button"/>            </td>        </tr>    </table></form>

JSP Scriptlet(목록 18)에서 추출된 값은 숨겨진 필드에 배치된다. 파일 입력은 맨 아래에 있다. 제출 단추는 목록 21과 같이 Javascript를 사용하여 작동 가능하게 할 때까지는 아무런 작동도 하지 않는 일반 단추이다.


목록 21. 업로드 양식 제출
<script type="text/_javascript" src="https://Ajax.googleapis.com/Ajax/libs/jquery/1.4.3/jquery.min.js"></script><script type="text/_javascript">    $( document).ready(function() {			        $('#button').click(function() {            var formData = $('#fieldsForm').serialize();            var callback = function(photoId) {                var redir = $('#success_action_redirect').val() +                    photoId;                $('#success_action_redirect').val(redir)                $('#uploadForm').submit();             };			             $.post("gstorage", formData, callback);         });     });</script>

목록 21에 있는 Javascript는 JQuery로 작성된다. 라이브러리를 사용하지 않았지만, 코드를 이해하? 가져온다. 그 후에는 단추를 클릭하면 Ajax를 통해 첫 번째 양식이 제출되도록 클릭 리스너가 단추에 설치된다. 그러고 나면, 여기서 간단히 빌드하게 될 서블릿의 handleSubmit 메소드에 도달하며, 여기서는 Photo가 구성되어 데이터 저장소에 저장된다. 마지막으로 업로드 양식이 제출되기 전에 새 Photo ID가 콜백에 리턴되고 success_action_redirect에 있는 URL에 추가된다. 재지정된 경로에서 다시 돌아오면 Photo를 검색하여 그 이미지를 표시할 수 있다. 그림 6에는 전체 이벤트 시퀀스가 표시되어 있다.


그림 6. Javascript 호출 경로가 표시되어 있는 시퀀스 다이어그램
Javascript 호출 경로가 표시되어 있는 시퀀스 다이어그램

양식을 처리하려면 정책 문서를 작성하고 사인할 유틸리티 클래스가 필요하다. 그 후에는 AbstractUploadServlet을 서브클래스로 분류할 수 있다.

정책 문서 작성 및 사인

정책 문서는 업로드를 제한한다. 예를 들면, 업로드할 수 있는 용량이나 허용되는 파일 유형을 지정할 수 있으며 파일 이름을 제한할 수도 있다. 공용 버킷은 정책 문서를 필요로 하지 않지만, Google Storage와 같은 사설 버킷에는 정책 문서가 있어야 한다. 작동하게 하려면 목록 22에 있는 코드를 기반으로 하는 GSUtils 유틸리티 클래스를 스텁아웃한다.


목록 22. GSUtils
import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.GregorianCalendar;import java.util.TimeZone; import javax.crypto.Mac;import javax.crypto.spec.SecretKeySpec; import com.google.appengine.repackaged.com.google.common.util.Base64; private class GSUtils {}

일반적으로 유틸리티 클래스가 정적 메소드로만 구성된다는 점을 감안하면 기본 생성자를 사설화하여 인스턴스화를 막는 것이 좋다. 이 클래스를 스텁아웃하면 정책 문서를 작성하는 데 관심을 돌릴 수 있다.

정책 문서는 JSON 형식으로 되어 있지만, 이 JSON은 어떤 멋진 라이브러리에 의존하지 않아도 될 정도로 단순하다. 그 대신, 간단한 StringBuilder를 사용하여 수동으로 JSON 형식을 처리할 수 있다. 우선, ISO8601 날짜를 구성하고 이 날짜에 따라 정책 문서가 만료되도록 설정해야 한다. 정책 문서가 만료되면 업로드가 진행되지 않는다. 그 다음에는 앞에서 언급한 제한조건(정책 문서의 conditions)을 삽입해야 한다. 마지막으로 이 문서는 Base-64로 인코딩된 후, 호출자에게 리턴된다.

목록 23에 있는 메소드를 GSUtils에 추가한다.


목록 23. 정책 문서 작성
public static String createPolicyDocument(String acl) {    GregorianCalendar gc = new GregorianCalendar();    gc.add(Calendar.MINUTE, 20);     DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");    df.setTimeZone(TimeZone.getTimeZone("GMT"));    String expiration = df.format(gc.getTime());     StringBuilder buf = new StringBuilder();    buf.append("{\"expiration\": \"");    buf.append(expiration);    buf.append("\"");    buf.append(",\"conditions\": [");    buf.append(",{\"acl\": \"");    buf.append(acl);    buf.append("\"}");            buf.append("[\"starts-with\", \"$key\", \"\"]");    buf.append(",[\"starts-with\", \"$success_action_redirect\", \"\"]");    buf.append("]}");     return Base64.encode(buf.toString().replaceAll("\n", "").getBytes());}

미래의 20분으로 설정된 GregorianCalendar를 사용하여 만기 날짜를 구성한다. 이 코드는 복잡하므로, JSONLint(참고자료 참조)와 같은 도구를 통해 이 코드를 콘솔에 인쇄하고 복사하고 실행하면 도움이 된다. 다음에는 정책 문서에 acl을 전달하여 acl을 하드코딩하지 않아도 되도록 한다. 어느 것이든 그 변수는 acl과 같은 메소드 인수로 전달되어야 한다. 마지막으로 이 문서는 Base-64로 인코딩된 후, 호출자에게 리턴된다. 정책 문서에서 허용되는 것에 관한 자세한 정보는 Google Storage 문서를 참조한다.

Google의 SDC(Secure Data Connector)

이 기사에서는 Google의 SDC(Secure Data Connector)를 다루지 않지만, Google Storage를 사용할 경우에는 이 도?스템이 방화벽 뒤에 있는 경우에도 자신의 시스템에 있는 데이터를 쉽게 액세스할 수 있다.

Google Storage에서의 인증

정책 문서는 두 가지 기능을 한다. 정책을 시행하는 기능 외에 정책 문서는 업로드를 인증하기 위해 생성하는 시그너처의 기초가 된다. Google Storage에 등록하면 등록자와 Google만 알 수 있는 비밀 키가 주어진다. 등록자가 등록자의 위치에서 비밀 키를 사용하여 이 문서에 사인하면 Google도 같은 키를 사용하여 이 문서에 사인한다. 시그너처가 일치하면 업로드가 허용된다. 그림 7에는 이러한 과정이 잘 묘사되어 있다.


그림 7. Google Storage에서 업로드를 인증하는 과정
GAE 인증 과정이 표시되어 있는 다이어그램

여기에서는 시그너처를 생성하기 위해 GSUtils를 스텁아웃하는 과정에서 가져온 javax.cryptojava.security 패키지를 사용한다. 목록 24에는 메소드가 표시되어 있다.


목록 24. 정책 문서 사인
public static String signPolicyDocument(String policyDocument,    String secret) {    try {        Mac mac = Mac.getInstance("HmacSHA1");        byte[] secretBytes = secret.getBytes("UTF8");        SecretKeySpec signingKey =             new SecretKeySpec(secretBytes, "HmacSHA1");        mac.init(signingKey);        byte[] signedSecretBytes =             mac.doFinal(policyDocument.getBytes("UTF8"));        String signature = Base64.encode(signedSecretBytes);        return signature;    } catch (InvalidKeyException e) {        throw new RuntimeException(e);    } catch (NoSuchAlgorithmException e) {        throw new RuntimeException(e);    } catch (UnsupportedEncodingException e) {        throw new RuntimeException(e);    }}

Java 코드의 보안 해싱과 관련해서는 이 기사에서는 다루고 싶지 않은 장황한 이야기가 일부 있다. 목록 24에 표시되어 있듯이 문제는 해싱이 적절하게 수행되는 방식과 해시가 리턴되기 전에 Base-64로 인코딩되어야 한다는 점에 있다.

이러한 선수조건이 처리되면 익숙한 영역, 즉 파일을 Google Storage에 업로드하고 Google Storage에서 파일을 검색할 세 가지 추상 메소드를 구현하는 작업으로 돌아가게 된다.

Google Storage에 업로드하기

먼저, 목록 25에 있는 코드를 기반으로 하는 GStorageUploadServlet 클래스를 스텁아웃한다.


목록 25. GStorageUploadServlet
import info.johnwheeler.gaestorage.core.GSUtils;import info.johnwheeler.gaestorage.core.Photo;import info.johnwheeler.gaestorage.core.PhotoDao; import java.io.IOException;import java.io.PrintWriter;import java.util.UUID; import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial")public class GStorageUploadServlet extends AbstractUploadServlet {    private PhotoDao dao = new PhotoDao();}

목록 26에 있는 showForm 메소드는 업로드 양식을 통해 Google Storage에 전달하는 데 필요한 매개변수를 설정한다.


목록 26. Google Storage용 showForm
@Overrideprotected void showForm(HttpServletRequest req, HttpServletResponse resp)     throws ServletException, IOException {    String acl = "public-read";    String secret = getServletConfig().getInitParameter("secret");    String accessKey = getServletConfig().getInitParameter("accessKey");    String endpoint = getServletConfig().getInitParameter("endpoint");    String successActionRedirect = getBaseUrl(req) +         "gstorage?action=display&id=";    String key = UUID.randomUUID().toString();    String policy = GSUtils.createPolicyDocument(acl);    String signature = GSUtils.signPolicyDocument(policy, secret);     req.setAttribute("uploadUrl", endpoint);    req.setAttribute("acl", acl);    req.setAttribute("GoogleAccessId", accessKey);    req.setAttribute("key", key);    req.setAttribute("policy", policy);    req.setAttribute("signature", signature);    req.setAttribute("successActionRedirect", successActionRedirect);     req.getRequestDispatcher("gstorage.jsp").forward(req, resp);}

acl은 public-read로 설정되므로 모든 사람이 업로드된 모든 것을 볼 수 있게 된다. 다음 세 가지 변수, secret, accessKeyendpoint는 Google Storage에 접근하여 인증하는 데 사용된다. 이러한 변수는 web.xml에 선언되어 있는 init-params로부터 가져오므로 세부사항은 샘플 코드를 참조한다. showRecord에 있는 URL로 전달하는 Blobstore와 달리 Google Storage는 경로 재지정을 실행한다는 점을 상기한다. 경로 재지정 URL은 successActionRedirect에 저장된다. successActionRedirect는 목록 27에 있는 헬퍼 메소드에 의존하여 경로 재지정 URL을 생성한다.


목록 27. getBaseUrl()
private static String getBaseUrl(HttpServletRequest req) {    String base = req.getScheme() + "://" + req.getServerName() + ":" +         req.getServerPort() + "/";    return base;}

헬퍼 메소드는 수신 요청을 폴링하여 제어권이 showForm으로 넘어가기 전에 기본 URL을 생성한다. 돌아오게 되면 고유성이 보장되는 문자열인 UUID(Universally Unique Identifier)를 사용하여 키를 작성한다. 다음에는 앞에서 빌드한 유틸리티 클래스를 사용하여 정책과 시그너처를 생성한다. 마지막으로 JSP에 전달하기 전에 JSP에 맞게 요청 속성을 설정한다.

목록 28에는 handleSubmit이 표시되어 있다.


목록 28. Google Storage용 handleSubmit
@Overrideprotected void handleSubmit(HttpServletRequest req, HttpServletResponse     resp) throws ServletException, IOException {    String endpoint = getServletConfig().getInitParameter("endpoint");    String title = req.getParameter("title");    String caption = req.getParameter("caption");    String key = req.getParameter("key");     Photo photo = new Photo(title, caption);    photo.setPhotoPath(endpoint + key);    dao.save(photo);     PrintWriter out = resp.getWriter();    out.println(Long.toString(photo.getId()));    out.close();}

첫 번째 양식이 제출되면 Ajax POST에 의해 handleSubmit에 놓이게 된다. 여기에서는 업로드가 처리되지 않고, Ajax 콜백에서 별도로 처리된다. handleSubmit은 첫 번째 양식을 구문 분석하여 Photo를 생성한 후, 이것을 데이터 저장소에 저장한다. 그 후에는 Photo의 ID를 응답 본문에 쓰는 과정을 통해 이 ID가 Ajax 콜백으로 리턴된다.

콜백 과정에서 업로드 양식이 Google Storage 엔드포인트에 제출된다. Google Storage가 업로드를 처리하면 경로 재지정을 실행하여 목록 29에 있는 showRecord로 돌아가도록 설정된다.


목록 29. Google Storage용 showRecord
@Overrideprotected void showRecord(long id, HttpServletRequest req,     HttpServletResponse resp) throws ServletException, IOException {    Photo photo = dao.findById(id);    String photoPath = photo.getPhotoPath();    resp.sendRedirect(photoPath);}

showRecordPhoto를 검색하여 photoPath로 경로를 재지정한다. photoPath는 Google의 서버에서 호스트되는 이미지를 가리킨다.

결론

이 기사에서 세 가지의 Google 중심적 스토리지 옵션을 살펴보고 이러한 옵션의 장단점을 평가했다. Bigtable은 작업하기 쉬웠지만 파일의 크기가 1MB로 제한되었다. Blobstore의 blob은 최대 크기가 2GB이지만, 웹 서비스에서 처리하기에는 일회성 URL이 문제가 되었다. 마지막 Google Storage for Developers는 가장 강력한 옵션이었다. 사용한 스토리지에 대해서만 비용을 지불하면 되고 하나의 파일에 저장할 수 있는 데이터 양에 대한 제한도 없다. 그러나 Google Storage는 그 라이브러리가 현재 GAE를 지원하지 않기 때문에 다루기에는 가장 복잡한 솔루션이라고 할 수 있다. 또한, 현존하는 데이터 저장소 중에서 브라우저 기반 업로드에 대한 지원이 가장 단순하지 않다.

GAE가 Java 개발자들에게 더 인기 있는 개발 플랫폼이 되면서 Google의 다양한 스토리지 옵션을 이해하는 것이 중요해졌다. 이 기사에서는 Bigtable, Blobstore 및 Google Storage for Developers에 대한 간단한 구현 예제를 살펴보았다. 한 가지 스토리지 옵션을 계속해서 고수하건 아니면 다양한 유스 케이스에 맞게 각 옵션을 사용하건 현재는 GAE에 다량의 데이터를 저장하는 데 필요한 도구가 있어야 한다.

출처 : 한국IBM

제공 : DB포탈사이트 DBguide.net

클라우드 시대의 SW 기회와 위협


[출처] http://www.dbguide.net/knowledge.db?cmd=view&boardUid=165854&boardConfigUid=19&boardStep=&categoryUid=574

소프트웨어공학센터 이상은 센터장은 최근“클라우드 시대의 SW 기회와 위협”이라는 주제로 미래비즈니스포럼 회원들을 대상으로 특강을 했다. 이상은 센터장에 따르면 클 라우드 컴퓨팅은 대세이고, 이젠 개념 수준에서 벗어나 구축사례가 속속 늘어나고 있을 뿐만 아니라 기하급수적으로 증가하고 있다고 한다. 클라우드 시대에서 SW사업기회와 위협을 알아보기 위해서는 먼저 SW산업의 변화상황에 대해 알아봐야만 한다. 즉 2006 년 이후 지금까지 스마트 모바일 기기의 발달로 모바일 앱과 SaaS 클라우드, SNS, 빅 데이터를 처리하기 위한 SW들이 각광을 받고 있다. 국내 소프트웨어 기업들도 자사의 핵심 경쟁력이 무엇인지를 파악하고 가격정책과 라이선스 정책 등을 어떻게 세워야 하 는지 고민해야 한다. 소프트웨어 업계에 종사하는 인력에도 문제는 있다. 소프트웨어 개발자의 경쟁력은 지식에만 있는 것이 아니다. 지식 이외에 구현을 위한 스킬도 매우 중요하다. 소프트웨어 개발자는 소프트웨어의 기본 구성과 구조뿐 아니라 환경적 지식은 물론 소프트웨어를 완성해 가는 SE에 대한 전문성 도 갖춰야 한다고 이상은 센터장은 강조했다. 주요 내용을 정리한다.



정보통신산업진흥원(NIPA)은 2012년 10대 비즈니스 이슈를 발표했다. 이 발표에 따르면 사이버 공격 등으로 인한 정보보호 관심증대, 특허 지식재산권 분쟁 격화, 스마트 생태계 구축 확산, SNS등 소셜 관련 비즈니스 확대, 클라우드 컴퓨팅, 스마트업무환경 도입 등이 10대 비즈니스 이슈에 포함됐다. 이를 2011년 실제 비즈니스 이슈와 비교하면 순위에 변동이 있기는 하지만 큰 변화는 없다는 것을 알 수 있다. 단지 올해‘글로벌 경영환경확대로 인한 해외 진출 강화’가 10대 이슈에 들어가 있을 뿐이다.



대세는 클라우드 컴퓨팅


정보통신산업진흥원은 또한 이러한 비즈니스 10대 이슈에 대한 문제를 해결하기 위한 기술 이슈도 발표했 다. 정보통신산업진흥원이 선정한 2012년 10대 소프트웨어 기술이슈에는 빅 데이터, 차세대 OS, 클라우드 컴 퓨팅, 소셜 플랫폼, 사이버 공격, 모바일 오피스, HTML 등 차세대 웹브라우저, 스마트 생태계, M2M등 스마트 테크놀로지 등이 포함돼 있다. 이를 2012년 실제 소프 트웨어 기술이슈와 비교하면 차세대 웹브라우저와 스마 트 생태계를 제외하고는 모두 동일한 것으로 나타났다. 특히 클라우드 컴퓨팅은 10대 비즈니스는 물론 10대 기술적인 이슈에도 선정됐다.

네트워크, 서버, 저장공간, 애플리케이션 서비스 등의 각종 자원을 공유하고 편리하고 쉽게 사용할 수 있도록 해주는 클라우드 컴퓨팅은 IT 사용자가 겪고 있는 어려 움의 상당부분을 해결할 수 있는 솔루션으로 인식되면 서 IT분야의 대세로 떠오르고 있다.

과거 개념 수준에서 이제 실제 구축사례가 발표되는 등 구체화 되고 있는 클라우드 컴퓨팅 시장은 기하 급수적으로 늘어나고 있다.
시장 조사기관인 IDC에 따르면 전체 IT 시장의 15%를 클라우드 컴퓨팅이 차지하고 있으며 2014년에 퍼블릭 클라우드 시장은 550억 달러, 프라이빗 클라우드 시장은 260억 달러 시장을 형성할 것으로 예상된다. 국내 시장 역시 크게 성장해 2014년에 2조 5천억 원 규모를 형성할 것으로 IDC는 예측했다. 물론 클라우드 컴퓨팅 분야에서 보안 등 해결해야 할 문제가 여전히 남아 있기는 하다.



S/W 시장 성장 불구 문제점 많아


클라우드 시대에 있어 소프트웨어 사업의 기회와 위협 을 알아보기 위해서는 먼저 소프트웨어 산업의 변화 상 황에 대해 알아볼 필요가 있다. 60년대 이전 과학 기술용 으로 사용되던 컴퓨터가 70년대 들어 IC화 소형화되면 서 OS와 OS에 기반한 MIS 소프트웨어의 중요성이 강조 되기 시작했다. 80년대에는 복잡한 데이터처리를 위해 데이터베이스 시스템이, 90년대 들어서는 기업의 종합 적인 업무처리를 위해 ERP와 CRM같은 소프트웨어가 주목 받았다. 또한 개인용 PC가 일반화되면서 개인의 생 산성 향상을 위한 개인용 소프트웨어도 속속 출현했다. 2000년대에는 인터넷의 보급으로 인터넷상에서 업무를 처리하고 관리할 수 있도록 해주는 APP와 정보보안 소 프트웨어가 급부상했으며 2006년 이후 지금까지는 스마 트 모바일 기기의 발달로 모바일 앱과 SaaS 클라우드, SNS, 빅 데이터를 처리하기 위한 소프트웨어들이 각광 받고 있다.

국내 소프트웨어 시장은 규모 면에서 크게 성장해왔으 나 소프트웨어 산업은 해결해야 할 많은 문제를 갖고 있 다. 소프트웨어는 가치를 전달하고 그에 상응하는 가격 을 보상받는 것인데 국내에서는 소프트웨어가 가져다 주 는 가치보다는 그저 투입된 인원 수만을 따지고 유지보 수비 또한 터무니 없이 낮게 책정돼 소프트웨어 업체들 이 어려움을 겪고 있다. 물론 상황이 이렇게 되기까지는 소프트웨어 업체들의 책임도 크다고할수있다.

세계 소프트웨어 시장을 주도하고 있는 구글과 MS 그 리고 IBM의 서비스 사업부는 이익 창출을 위해 기술적경쟁력 이외에도 자사의 내부 시스템적 핵심 경쟁력이 무엇인지를 분석하고 이를 확보하기 위해 꾸준히 노력해 왔다. 소프트웨어 기업은 핵심 자산을 반복 제공함으로 써 이익 창출을 극대화 할 수 있다는 사실을 깨닫고 이를 실행해 왔던 것이다. 핵심 자산을 반복 제공함으로써 이 익 창출을 극대화할 수 있다는 점은 IT서비스 기업보다 는 패키지 기업이, 패키지 기업보다는 온라인 기업이 이 익을 많이 낼 확률이 높다는 것을 의미한다.



서비스보다는 패키지, 패키지보다는 온라인


국내 소프트웨어 기업들도 자사의 핵심 경쟁력이 무엇 인지를 파악하고 가격정책과 라이선스 정책 등을 어떻게 세워야 하는지 고민해야 한다.
소프트웨어 업계에 종사하는 인력에도 문제는 있다. 소프트웨어 개발자의 경쟁력은 지식에만 있는 것이 아니 다. 지식 이외에 구현을 위한 스킬도 매우 중요하다. 소 프트웨어 개발자는 소프트웨어의 기본 구성과 구조뿐 아 니라 환경적 지식은 물론 소프트웨어를 완성해 가는 SE 에 대한 전문성도 갖춰야 한다. 건축공학에서 건축구조 나 건축환경 외에 어떻게 설계하고 관리하며 품질 시험 을 하는 지를 알아야 하는 것과 같은 이치이다.

소프트웨어 업계는 앞에서 얘기한 10대 이슈 등 환경 변화에도 적절히 대응해야 한다. 최근 떠오르고 있는 스 마트기기, SaaS 클라우드, 에코시스템 등의 변화에 대응 할 수 있는 기술개발에도 관심을 기울어야 한다는 얘기 이다.
클라우드 컴퓨팅과 스마트 기기의 발현 및 스마트 생 태계의 구축 및 확산, 그리고 컨버전스 등은 IT 특히 소 프트웨어 업계에서 향후 10년 동안 계속해서 이슈가 될 주제들이다. 또한 2012년 공생발전형 소프트웨어 생태 계 구축 전략에서 발표된‘상호 출자제한기업의 공공시 장 신규참여 제한’은 중소 소프트웨어 업체의 역할을 확 대할 수 있는 절호의 기회가 될 것이다. 이 기회를 놓치 게 되면 앞으로 중소 소프트웨어 업체의 영향력 확대는 정말 어려워질 것이다. 모든 업체들이 힘을 합쳐 건전한 소프트웨어 생태계 조성에 나서야 하는 이유이다.



출처 : 컴퓨터월드 4월호

제공 : DB포탈사이트 DBguide.net

1337427737_[itfildi]클라우드서비스_발전전략과정책과제a1020120901.pdf

2012/5/16 …1
클라우드 서비스 발전전략과 정책과제1)
장 석 권*
최근 전 세계적으로 클라우드 서비스에 대한 국가전략 수립, 산업육성, 시장개발을 위한 움직임
이 정부와 민간을 구분하지 않고 매우 활발하게 진행되고 있다. 본고에서는 클라우드 서비스에 관
한 최근의 해외 정책 동향과 국내 현황 분석을 바탕으로 우리나라 차원의 발전전략과 정책과제를
소개하고, 향후 실천방안에 대해 논의한다.
목 차
Ⅰ. 서 론 / 1
Ⅱ. 선진국의 클라우드 서비스 정책 동향 / 4
1. 미국의 클라우드 서비스 정책 사례 / 5
2. EU의 클라우드 서비스 정책 사례 / 9
3. 영국의 G-Cloud 서비스 구축 사례 / 11
Ⅲ. 클라우드 서비스 발전전략과 정책과제 / 13
1. 국내 클라우드 현황 분석 / 13
2. 클라우드 서비스 발전전략 / 14
3. 클라우드 서비스 정책과제 / 16
Ⅳ. 결론 및 향후 과제 / 20
Ⅰ. 서 론
클라우드 컴퓨팅 서비스(이하 ‘클라우
드 서비스’)는 IT 자원의 이용방식을 ‘소
유’의 개념에서 ‘임차’의 개념으로 전환
하여 외부의 컴퓨팅 자원을 인터넷에 접
속하여 사용하고, 사용한 만큼 사용료를
지불하는 방식을 지칭한다. 그러나 이러
한 정의에도 불구하고 클라우드 서비스
는 매우 역동적으로 다양한 특화 서비스
로 진화하고 있어, 향후 클라우드 서비
* 한양대학교 경영대학 교수, 클라우드 서비스 정책연구센터 센터장, (02)2220-1049,
changsg@hanyang.ac.kr
1) 본고는 방송통신위원회, 지식경제부, 행정안전부가 관계부처 합동으로 2011년 5월에 마련한 ‘클라
우드 컴퓨팅 확산 및 경쟁력 강화전략’에 기초하여 작성된 것임.
초 점 제24권 9호 통권 531호
초 점
2012/5/16 …2
스의 개념은 지속적으로 새롭게 변화해 가리라 예상된다.
컴퓨팅 시장 환경이 직접구축 방식에서 아웃소싱 방식으로, 다시 클라우드 서비스
방식으로 전환되는 동기는 비교적 간단하다. 첫째, 컴퓨팅 자원을 직접 구축하여 운영
하는 것에 비해 최대 50% 정도의 비용절감을 가져 올 수 있다. 둘째, 이를 통해 자사
의 핵심 역량에 집중하여 생산성 향상은 물론, 비즈니스의 성과를 극대화할 수 있다.
셋째, 컴퓨팅 자원을 구축, 운용, 관리할 별도의 조직을 내부에 두지 않아도 되므로,
조직의 슬림화를 꾀할 수도 있다.
컴퓨팅 시장이 클라우드 서비스로 전환됨에 따라 공급시장 구조면에서나, 글로벌
가치사슬 측면에서 새로운 변화가 이루어질 것으로 예상된다. 우선 공급시장을 보면,
분산된 다수의 소규모 데이터센터보다 집중된 소수의 대규모 데이터센터가 컴퓨팅 전
문성 측면에서나, 에너지 이용효율의 측면에서 많은 경제적 효과를 가져다 줄 것이다.
이러한 공급시장의 경제적 동기가 컴퓨팅 시장의 무게중심을 클라우드 서비스로 옮겨
갈수록 공급시장은 글로벌 통합시장을 향해 점차 대형화될 것이고, 그 결과 개별 국가
의 클라우드 컴퓨팅 경쟁력은 국가 전체의 IT 산업경쟁력을 좌우하는 핵심요인으로 부
상할 것이다.
최근 스마트폰을 중심으로 스마트 미디어 시장이 급성장하면서, 클라우드 서비스에
대한 대중적 관심이 B2B의 비즈니스 컴퓨팅 영역보다는 B2C의 스마트 미디어 시장
영역에 쏠리고 있다. 이는 각종 개인용 스마트 미디어의 사용환경이 PC, TV, 스마트
폰을 아우르는 n-스크린 환경으로 전환됨에 따라, 이를 기술적으로 지원할 수 있는
서비스 플랫폼이 클라우드로 전환되고 있기 때문이다. 결국 향후 클라우드 서비스 시
장의 성장은 전 세계적으로 급성장하고 있는 B2C 스마트 미디어 시장과 B2B의 비즈
니스 컴퓨팅 시장이 서로 상승효과를 만들면서 이끌어 갈 것으로 전망된다.
IDC(2009, 2010) 자료에 의하면, 세계 클라우드 시장은 <표 1>과 같이 2011년 31
조 원에서 2014년 60조 원으로, 국내 클라우드 시장은 2011년 1,604억 원에서 2014
년 4,985억 원 규모로 성장하여, 각각 27.4%, 47.6%의 연평균 성장률을 보일 것으로
전망된다.
클라우드 서비스 발전전략과 정책과제
2012/5/16 …3
<표 1> 세계 및 국내 클라우드 시장
구분 2011 2012 2013 2014 연평균 성장률
세계 클라우드 시장(조 원) 31 39 47.5 60 27.4%
국내 클라우드 시장(억 원) 1,604 2,449 3,555 4,985 47.6%
자료: IDC(2009, 2010)
이러한 클라우드 서비스 시장의 성장은 새로운 가치 창출과 이를 현금화하는 다양
한 비즈니스 모델의 개발에 바탕을 두고 있다. 현재까지 가장 보편적으로 알려진 비즈
니스 모델 또는 서비스 유형으로는 IaaS(Infrastructure as a Service), PaaS(Platform
as a Service), SaaS(Software as a Service)를 들 수 있다. 이 유형분류에 입각하여 최
근까지 국내외에 개발 ․ 출시된 유형별 서비스를 예시하면 <표 2>와 같다. <표 2>에 의하
면, 국내에서는 통신사업자들의 서비스 출시가, 해외에서는 Amazon, Cisco, Google,
Salesforce.com, Apple, Microsoft 등 거대 IT 기업의 서비스 출시가 주목할 만하다.
근년에 들어서 클라우드 서비스 시장의 성장잠재력을 인지하고 미래시장을 선점하
려는 노력은 국내외 사업자들뿐 아니라, 국가 간 경쟁양상으로 발전하고 있다. 미국,
일본, 싱가포르가 공공기관의 클라우드 서비스 도입을 통해 시장을 선개발하려는 노
력과 의료, 교육 등 공공 서비스 영역에서 클라우드 기반의 시범 서비스 개발을 통해
한 차원 높은 공공 서비스를 제공하려는 노력 및 해외투자 유치방안의 일환으로 글로
벌 사업자의 데이터센터를 자국에 유치하려는 노력이 그 대표적인 예이다.
이러한 국가 간 경쟁양상을 보이고 있는 클라우드 서비스 시장 및 관련 산업 육성
을 위한 노력의 일환으로, 우리나라는 2011년 5월 관계부처 합동으로 ‘클라우드 컴퓨
팅 확산 및 경쟁력 강화전략’을 마련하여 클라우드 시장 선개발을 위한 글로벌 경쟁
에 뛰어 들었다. 본고에서는 이러한 배경하에 방송통신위원회가 관계부처와 합동으로
제시한 클라우드 서비스 발전전략과 정책과제를 중심으로 우리나라의 클라우드 서비
스 정책이슈를 살펴보고, 향후 실천방안에 대해 논의하고자 한다.
초 점
2012/5/16 …4
<표 2> 국내외 클라우드 컴퓨팅 서비스의 예시
국내 해외
IaaS
Cloud N(LG U+)
DAUM cloud(Daum)
I-Cloud Virtual Machine(Innogrid)
Tcloudbiz CloudServer(SKTelecom)
vDataCenter(LG CNS)
IBM cloud workload(IBM korea)
Cloud Solution(NetApp Korea)
Ucloud CS(KT)
Amazon E2C(Amazon)
EnterpriseCloudServices-Compute
WAAS(Cisco)
Cloud Hosting(Gogrid)
Cloud Server(Rackspace)
ManagedHostingServer(Hostway)
CloudForms(RedHat)
PaaS
Cloud Foundry(VMware Korea)
icube cloud(NEXR)
DCC Platform(Wisetodd)
SB Platform(SolutionBox)
Google App Engine(Google)
Force.com(Salesforce.com)
MicrosoftAzure(Microsoft office)
Bungee Connect(BungeeLabs)
mcloudDCU(MorphLabs)
Oracle PaaS(Oracle)
OpenShift(RedHat)
Saas
SmartSME(LG U+)
vApps(LG CNS)
U+Box(LG U+)
FieldServiceManagement(Innogrid)
Tcloudbiz FTA Insight(SKTelecom)
Ucloud biz(KT)
NDrive(Naver)
SmartProcess(DAOU)
BCube(SK broadband)
Enterprise work(NamuSoft)
IBM cloud industry(IBM korea)
Google Docs(Google)
Google Apps(Google)
Sales Cloud(Salesforce.com)
Service Cloud(Salesforce.com)
Icloud(Apple)
MicrosoftOffice365(Microsoft office)
IBM SmartCloud(IBM)
CaaS(HP)
Cloud Application(Oracle)
자료: 장석권 ․ 김은정(2011)
Ⅱ. 선진국의 클라우드 서비스 정책 동향
현재 전 세계적으로 많은 국가들이 자국의 IT 성장전략 차원에서 클라우드 서비스
정책을 마련하여 시행하고 있다. 본고에서는 대표적인 선진국의 사례로 미국, EU, 영
국의 정책 동향과 서비스 시범개발 사례를 살펴보고자 한다.
클라우드 서비스 발전전략과 정책과제
2012/5/16 …5
1. 미국의 클라우드 서비스 정책 사례
미국의 클라우드 정책은 2009년 중반, 백악관 CIO가 클라우드 컴퓨팅 추진전략을
발표하고, 연방 GSA(General Service Administration)가 SaaS/IaaS 조달에 관한 RFI
(Request for Information)를 발표하면서 시작되었다. 2010년 3월 GSA는 FedRAMP
(Federal Risk and Authorization Management Program)라는 클라우드 보안정책 프
레임워크를 검토하기 시작하여, 7월에는 FedRAMP의 핵심의사결정구조인 JAB(Joint
Authorization Board)를 설치하고 정책수립 작업을 진행하였다. 그 결과 2010년 12
월 미국정부는 FedRAMP의 기관별 역할 및 책임 정립을 포함하여 클라우드 서비스
이용에 관한 연방정부의 보안정책을 수립하고, 25개 실행계획에 관한 보고서를 포함,
클라우드 서비스 도입을 최우선적으로 추진한다는 ‘Cloud First’ 정책을 발표하였다.2)
<표 3> 미국 정부의 클라우드 서비스 도입을 통한 기대 효과
비즈니스 가치 기대 효과 기존 환경
효율성
(Efficiency)
정부자산 이용의 효율성 제고(서버 이용
률(server utilization)을 60~70% 이상까
지 끌어올릴 수 있음)
∙ 수요 통합(aggregated demand)
∙ 시스템 통합 활성화(예: 데이터센터 통합)
∙ 앱 개발 및 관리, 네트워크, 엔드유저의
생산성 제고
자산 이용률 저조(서버 이용률이 30% 미만)
∙ 수요 분화(fragmented demand)
∙ 시스템 중복
∙ 관리 시스템 취약
기민성
(Agility)
신뢰성 높은 업체의 클라우드 서비스 구매
∙ 서비스 용량을 필요에 따라 즉시 늘리
거나 줄일 수 있음
∙ 긴급상황 시 민첩한 대응 가능
신규 서비스용 데이터센터 구축에 많은
시간이 소요됨
∙ 기존 서비스 용량을 늘리는 데 많은 시
간이 소요됨
2) 이 정책에는 연방정부로 하여금 12개월 내에 적어도 하나의 IT 서비스, 18개월 내에 도합 3개의
IT 서비스를 클라우드 컴퓨팅으로 전환해야 한다는 내용을 포함하여, 2010년 12월 연방정부가 발
표한 25가지 실행계획 중 클라우드 관련 전략을 구체화한 세부 정책이 포함되어 있다. 세부 내용
은 박춘식(2012) 참조.
초 점
2012/5/16 …6
비즈니스 가치 기대 효과 기존 환경
혁신성
(Innovation)
자산 소유(asset ownership)에서 서비스
관리(service management)로 무게중심 이동
∙ 민간분야의 혁신성 도입
∙ 기업문화 향상
∙ 새로운 기술과의 연계성 강화
자산 관리에 치중
∙ 민간분야에 비해 혁신성 저조
∙ 리스크 방어적 문화 중심
자료: Kundra(2011)
‘Cloud First’ 정책은 이후 미국 정부와 공공기관에서 클라우드 컴퓨팅이 확산되는
기폭제 역할을 했으며, 그 결과 미국 정부 내 인프라 구축과 민원 서비스 등이 클라우
드 서비스로 전환되기 시작하였다. 미국 정부가 연방 차원에서 수립한 클라우드 컴퓨
팅 전략은 행정 서비스에서의 효율성, 기민성, 혁신성을 목표가치로 설정하고 있으며,
이를 통해서 위의 <표 3>에 정리된 바와 같은 효과를 얻을 것으로 기대하고 있다.
행정 프로세스의 효율성, 기민성, 혁신성을 추구함과 동시에, 미국 정부가 클라우드
정책을 추진하여 달성하고자 하는 정책성과는 클라우드 서비스 시장의 기반 조성과
서비스 활성화이다. 사실 이러한 정책목표는 서로 밀접하게 연관되어, 정부의 조달 프
로세스 개선과 같은 직접적 활동과 함께 서비스 표준개발이나 도입 로드맵과 같은 보
조적 지원활동이 수반되어야 한다. 그 세부 정책은 다음과 같다.3)
(1) 클라우드 서비스 조달 프로세스 개선
미국 정부는 클라우드 서비스의 도입을 위해 관련 서비스 공급업체들의 승인절차를
간소화하였다. 즉, 한번 승인을 받으면 유효성이 계속 인정되는 방식(‘approve once
and use often’ approach)을 채택한 것이다. 이를 관장하는 미국의 GSA(General
Service Administration: 연방조달청)는 클라우드 공급업체들을 투명하게 상호 비교
할 수 있는 서비스를 제공하고 있다.
3) 윤재석(2011)
클라우드 서비스 발전전략과 정책과제
2012/5/16 …7
(2) 클라우드 서비스 표준개발
NIST(National Institute of Standards and Technology: 국립표준기술연구소)는
관련 업체 및 이해관계자들과 함께 특정 벤더의 솔루션과 제품에 한정하지 않고, 기술발
전 및 혁신에 유연하게 대응할 수 있는 중립적인 레퍼런스 아키텍처를 제공하고 있다.
(3) 클라우드 서비스 도입을 위한 로드맵 개발
NIST는 아래 적시한 활용을 목표로, 2011년 11월 클라우드 컴퓨팅 기술 로드맵에
대한 문서 초안 2건, 즉 ‘U.S. Government Cloud Computing Technology Roadmap
Volume I, Ⅱ’를 공포하였다.
∙ 연방정부 산하기관의 클라우드 서비스 도입 활성화
∙ 클라우드 정책결정자들에게 유용한 정보 제공
∙ 클라우드 컴퓨팅 모델의 지속적인 개발 촉진
∙ 민간업체 지원
이와 관련하여 미국 정부의 종합적인 클라우드 서비스 정책 중에서 가장 핵심적인
정책 프레임워크라고 할 수 있는 FedRAMP에 대해 살펴보기로 하자.
[그림 1] FedRAMP의 체제와 거버넌스 구조
자료: GSA(2012)
초 점
2012/5/16 …8
FedRAMP(Federal Risk and Authorization Management Program)는 연방정부기
관이 이용하는 정보 시스템/서비스에 대해 적정한 수준의 정보보호를 보증하면서 위
험관리비용을 절감하고, 연방정부기관용 정보 시스템/서비스를 신속하고 효율적으로
조달하기 위한 범정부 차원의 프로그램이다. 이 프로그램은 앞의 [그림 1]과 같이, 미
국의 표준기술연구소(NIST), 조달(GSA), 국방부(Department of Defense), 국토안보
부(Department of Homeland Security) 등이 구축한 일종의 클라우드 보안인증체계
이다. 이 프로그램은 각 행정부서가 취급하는 정보의 중요도에 따라 클라우드 서비스
사용을 허가할 수 있는 표준 보안요건을 지정하고, 제3의 보안평가기관으로 하여금
민간 클라우드 서비스 사업자들의 보안수준을 인증해 주도록 하고 있다. 인증은 상중
하 세 등급으로 부여되고, 각 행정부서는 인증받은 사업자에 한해 클라우드 서비스를
내부에 도입하거나 사용할 수 있다.
FedRAMP의 클라우드 관련 정책결정기구는 JAB(Joint Authorization Board)로서
서비스 조달 업무를 담당하는 GSA, 보안기술과 정보보안에 관한 핵심기관인 미 국방
성(DoD: Department of Defense)과 국토안보부(DHS: Department of Homeland
Security)로 구성되어 있다. 그리고 산업 측면에서의 클라우드 관련 기술/서비스 표준
화는 NIST, 즉 국가표준기술연구소가 담당하며, 행정부서의 정보화를 총괄조정하는
역할은 CIO Council이 맡고 있다. 또한 행정부서 전반의 예산통제를 담당하는
OMB(Office of Management and Budget Policy)는 IT 부문에서 정부예산의 효율적
집행이라는 목표를 가지고 FedRAMP 거버넌스의 일부를 구성하고 있다. <표 4>는
FedRAMP 거버넌스 구조상의 관계기관별 역할을 정리한 것이다.
<표 4> FedRAMP 참여기관별 역할분담
부처 역할
NIST(National Institute of
Standards and Technology)
클라우드 컴퓨팅 기술 표준 및 가이던스 확립
3PAO process의 기술적 지원(표준 관련)
클라우드 서비스 발전전략과 정책과제
2012/5/16 …9
부처 역할
JAB(Joint Authorization Board)
보안 승인(CIOs from DHS(국토안보부), GSA(조달청), DOD
(국방성))
OMB(Office of Management and
Budget Policy)
부처 간 활동 조정, 클라우드 컴퓨팅 이행에 대한 우선순위
설정
CIO Council 연방정부 전체의 클라우드 컴퓨팅 이행 촉진
DHS(Department of Homeland
Security)
지속적 모니터링, 사이버 침해 대응
FedRAMP PMO
(Program Management Office)
FedRAMP 운영 관리(전담부서: GSA)
GSA 연방정부 전체에 적용되는 조달 기준 확립
자료: 박춘식(2012)
2. EU의 클라우드 서비스 정책 사례
EU는 클라우드 컴퓨팅에 대한 연구 및 기술개발을 촉진하고, 규제에 대한 프레임
워크 체계를 정립하기 위한 전략을 세워 현재까지 효율적인 클라우드 활용방안에 대
한 의견수렴을 진행하고 있으며, 2012년 중 구체적인 정책안을 발표할 계획이다. EU
가 추진하는 핵심과제는 데이터 및 프라이버시 보호를 위한 법적 기반 마련, 기술적,
사업적 기반 구축, 파일럿 프로젝트 지원을 통한 시장의 확대이며, 클라우드 효용성
극대화를 위한 과제 해결 방안으로 <표 5>와 같은 정책 프레임워크를 제시하고 있다.
<표 5> EU의 클라우드 정책 프레임워크
분야 권고사항
연구개발
클라우드 컴퓨팅에 대한 연구 및 기술개발을 촉진해야 함. 주요 분야는 서비스
확장성 및 유연성 제고, 시스템 개발 및 관리, 데이터 관리, 프로그래밍 모델 및
자원 관리, 신뢰성 보장, 보안, 프라이버시 등
규제 기반
마련
집행위원회는 각 회원국과 함께 클라우드 컴퓨팅 확산을 촉진하기 위해 법적 이
슈와 그린 IT(Green IT) 등에 적절한 규제 기반을 구축해야 함
초 점
2012/5/16 …10
분야 권고사항
테스트베드 구축
대규모 R&D 테스트베드를 구축할 필요 존재. 민관협력 또는 기존 연구단체들이
공공 인프라를 구축하는 방식 등을 통해 테스트베드를 마련할 필요가 있음
전문가 협업
클라우드 시스템과 관련된 다양한 분야의 전문가들과 협력체계를 구축해야 함.
해당 전문가에는 R&D 종사자, 학계, 관련업체 등이 포함됨
표준 개발
클라우드 상호운용성 표준 개발 및 오픈소스 레퍼런스 구현을 촉진해야 함.
상호운용성 표준(interoperation standards) 개발 및 레퍼런스 구현(reference implementation)
은 특히 중소기업들의 클라우드 관련 제품 및 서비스 보급에 도움
오픈소스
소프트웨어 개발
집행위원회는 관련 업계와의 협력 강화를 통해 오픈소스 기반의 소프트웨어 개발
을 주도함으로써 상용 클라우드 서비스가 원활하게 제공될 수 있도록 지원해야
함. 이는 클라우드 시스템을 다양한 환경에서 간단한 프로세스를 통해 채택될 수
있게 하는 효과가 있음
자료: 윤재석(2011)
EU의 클라우드 서비스 정책 프레임워크에 따라 추진되고 있는 프로젝트에는
OPTIMIS(Optimized Infrastructure Services)가 있다. 이 프로젝트는 IaaS 소프트웨
어 ‘OPTIMIS’를 개발해 중소기업들이 클라우드 애플리케이션을 효율적으로 구축, 운
영, 모니터링, 관리할 수 있도록 하고, 하이브리드 클라우드(프라이빗 + 퍼블릭) 기반
에서 다양한 사업자들로 구성된 생태계가 자생적으로 마련될 수 있는 환경을 제공한
다. OPTIMIS에 의한 대략적인 서비스 개발과정은 [그림 2]에 도식화한 바와 같다.
우선, 서비스 개발단계에서 서비스 개발자는 OPTIMIS Programming model과 IDE
를 이용하여 Services Manifest와 Service Image를 만들어 낸다. 그 다음 개발자는 서
비스 제공을 위해 서비스 사업자의 OPTIMIS toolkit을 사용하여 서비스를 이식하고,
Infrastructure Provider의 OPTIMIS toolkin을 통해 VM을 이식한다. 이렇게 하여 서
비스 VM이 만들어지면, 서비스 사용자가 서비스를 이용할 수 있는 단계로 전 과정이
완성된다.
이러한 서비스 개발과정을 구현하기 위해 OPTIMIS 프로젝트는 다음과 같은 활동
을 수행하도록 계획되었다.
클라우드 서비스 발전전략과 정책과제
2012/5/16 …11
[그림 2] OPTIMIS에 의한 클라우드 서비스 개발 및 운용 프로세스
자료: Dawson, et al(2009)
∙ 건전한 클라우드 생태계 구축방안의 모색
∙ 서비스 구축과정의 간소화
∙ 관련 사업자들에 의한 사전평가를 기반으로 클라우드 구축 및 운영에 관한 의사
결정 지원
∙ 자원이용의 경제적 효율성, 환경친화성, 그리고 인프라 관리의 유연성 제고
∙ 상호운용성 및 아키텍처 독립성이 보장되는 다양한 서비스 구현
∙ 클라우드 시장의 가치사슬 파악 및 효율적인 시장운영을 위한 법적 가이드라인
제시
3. 영국의 G-Cloud 서비스 구축 사례
G-Cloud는 영국이 공공부문의 데이터센터 혁신전략의 일환으로 범정부 차원에서
구축한 정부용 클라우드 컴퓨팅 서비스이다. 이 서비스는 정보통신 서비스 및 애플리
케이션용 IT 자산의 새로운 이용 방식을 정부부처에 제공함으로써, 공공부문에서 발
초 점
2012/5/16 …12
생하는 IT 관련 비용을 절감하는 것을 최우선 목표로 두고 있다.
이뿐만 아니라 공급 측면에서는 이를 통해 중소 ICT 기업이 공공 서비스 영역에 진
출할 수 있으므로, 산업정책적 목표도 함께 추진하고 있다. 그리고 이용자 관점에서는
공공기관들이 정부 클라우드 인프라를 통해 특정 애플리케이션 및 업무 서비스를 이용
할 수 있기 때문에 자체적인 구축 및 운영에 필요한 비용과 시간지연을 피할 수 있다.
[그림 3] G-Gloud의 각종 서비스 인터페이스 화면
자료: http://www.govstore.net
클라우드 서비스 발전전략과 정책과제
2012/5/16 …13
G-Cloud 서비스를 위한 원스톱 쇼핑몰인 ‘클라우드 스토어(Cloud Store)’는 일종
의 웹앱 스토어로서 정부기관의 구매부서는 이곳에서 IaaS, PaaS, SaaS과 그 밖의 모
니터링 서비스, 특화된 관리 서비스들을 구입할 수 있다. 클라우드 스토어는 영국의
중소업체인 솔리트 소프트(SolidSoft)에 의해 마이크로 소프트 애저(Azure) 플랫폼을
기반으로 구축되었다. [그림 3]은 ‘클라우드 스토어’의 웹인터페이스를 보여주고 있다.
Ⅲ. 클라우드 서비스 발전전략과 정책과제
1. 국내 클라우드 현황 분석
클라우드 서비스 발전전략을 수립하는 데 가장 중요한 출발점은 우리나라의 현 위
치를 냉철하게 분석하고, 평가하는 일이다. 현재 전 세계 클라우드 서비스 시장은 글
로벌 업체가 주도하여 Amazon, Salesforce.com 등 선두 클라우드 사업자의 서비스를
이용하고 있는 기업이나 사례가 매우 빠르게 늘고 있다. 반면, 국내 시장은 수요 기반
이 매우 취약하고, 시장 기반을 뒷받침할 법제도가 미비하며, 보안 및 안정성을 담보
할 정책 거버넌스 체제도 아직 제대로 갖추어지지 않았다.
<표 6> 우리나라의 클라우드 경쟁력 국제비교
구분 미국 일본 유럽 한국
HW 설비 100 88 87 74
SW 100 80 83 65
기술 100 82 86 67
인력 100 79 81 58
가격 대비 품질 100 81 80 80
자료: 지경부, 한국클라우드연구조합 실태조사(2011. 1.)
클라우드 서비스 시장의 전반적인 국제경쟁력을 살펴보면, 국내 클라우드 서비스
초 점
2012/5/16 …14
공급시장은 아직 B2C 퍼블릭 클라우드 영역에서만 가시화되어 있을 뿐, B2B 영역의
공급시장은 제대로 형성조차 되어 있지 않다. 여기에 우리의 R&D 기술역량은 미국
등 선진국에 비해 3~4년 정도 뒤처져 있고, 소프트웨어 기술의 외산의존도는 70%에
달하고 있다. <표 6>은 우리의 클라우드 기술역량을 선진국과 비교 ․ 평가한 것이다.
또한 클라우드 서비스의 국제경쟁력을 결정하는 중요한 요소로서 네트워크 및 데이
터센터 경쟁력을 살펴보면, 우리나라는 현재 세계 최고 수준의 네트워크 및 데이터센
터 운영능력을 보유하고 있으나, 글로벌 클라우드 사업자의 데이터센터 유치경쟁에서
는 일본과 싱가포르 등 시설기반이 유리한 다른 나라에 뒤지고 있다. 그리고 우리의
클라우드 이용여건은 기업의 클라우드 도입의향에 관한 국제비교에서 미국(68.8%),
일본(25.3%)에 비해 낮은 16.9%를 보이고 있다.4) 이는 IDC가 클라우드 도입 시 우려
사항으로 제시한, 보안(1위), 성능(2위), 가용성(3위) 면에서 아직 국내 시장여건이 만
족스럽지 못하다는 것을 잘 반영하는 것으로 판단된다.
결국 이러한 국내 클라우드 현황이 시사하는 바는 첫째, 초기단계에 있는 국내 클라
우드 시장을 견인하고 글로벌 경쟁력을 강화하는 것이 필요하다는 점, 둘째, 클라우드
시장수요를 확충하면서 동시에 공급시장 기반을 구축할 필요가 있다는 점, 셋째, 글로
벌 기술경쟁력을 높이기 위해 R&D를 촉진하고 공개 S/W의 이용을 증진시켜야 한다
는 점, 넷째, 글로벌 데이터센터를 유치하고 자체 구축을 통해 글로벌 데이터 Hub 구
축경쟁에 뛰어들어야 한다는 점, 그리고 마지막으로 클라우드 서비스를 안심하고 사
용할 수 있도록 법제도적 보완책이 반드시 정립되어야 한다는 점 등이다.
2. 클라우드 서비스 발전전략
우리나라는 이러한 배경하에서, 2009년 12월에 ‘범정부 클라우드 컴퓨팅 활성화 종
합계획’을 수립하여 중앙부처 정보자원의 통합, R&D 및 서비스 모델 검증을 위한
Test-bed 구축, 범정부 클라우드 컴퓨팅 정책협의회의 개최 등을 추진해 왔다. 이 종
4) 출처는 일본 총무성 2010년 자료, 우리나라 KRG 2011년 자료.
클라우드 서비스 발전전략과 정책과제
2012/5/16 …15
합계획에 이어 2011년 5월에는 방송통신위원회가 관계부처 합동으로 ‘클라우드 컴퓨
팅 확산 및 경쟁력 강화전략’을 발표하였다. 이 계획은 그간의 정부 클라우드 서비스
활성화 성과를 분석하고, 향후 정책적 대응을 위한 발전전략을 담고 있다. 그 구조는
[그림 4]에서 보는 바와 같다.
[그림 4] 정부의 클라우드 서비스 발전전략
이 발전전략은 ‘2015년 글로벌 클라우드 강국으로의 도약’이라는 비전하에 세 가지
전략목표와 이를 달성하기 위한 세 가지 추진전략, 그리고 이를 정책적으로 구현하기
위한 다섯 가지 정책과제로 구성되어 있다. 우선 추진전략과 목표를 내용면에서 살펴보
면, 크게 세 가지 부문의 균형적인 성장을 추구하고 있다. 첫째, 클라우드 공급시장에서
차별적이고 국제경쟁력을 갖춘 산업센터를 육성하는 것, 둘째, 정부부문의 정보화 부문
에서 IT 투자효율성을 혁신적으로 개선하는 것, 셋째, 민간부문에서 IT 인프라의 클라
초 점
2012/5/16 …16
우드 전환을 통해 비즈니스 혁신 및 시장 혁신을 이루어내는 것이 그것이다.
이러한 발전전략을 실현할 정책상 과제로 도출된 것이 첫째, 클라우드 친화적인 법
제도 환경의 조성, 둘째, 공공부문 IT 인프라의 클라우드화, 셋째, 클라우드 산업의 국
제경쟁력 강화, 넷째, 클라우드 데이터센터의 육성, 다섯째, 클라우드 시장 기반의 조
성이다. 본고에서는 이들 다섯 가지 정책과제가 어떠한 정책수단과 실천전략에 의해
구현되도록 설계되어 있는지에 대해 살펴보기로 한다.
3. 클라우드 서비스 정책과제
(1) 클라우드 친화적 법제도 환경 조성
클라우드 친화적 법제도 환경을 조성하는 것은 기본적으로 클라우드 서비스 환경에
부합하지 않는 기존 법제를 개선하고, 인증제나 서비스 수준협약(SLA: Service Level
Agreement)에 관한 가이드라인을 마련하여 클라우드 서비스 사용에 대한 이용자의
불안을 해소하는 것이다. 이러한 관점에서 도출된 구체적인 실천전략은 <표 7>과 같
다. 이러한 실천전략의 시행을 통해 클라우드 관련 법제도가 정비되면, 클라우드 활성
화에 걸림돌이 되는 규제가 완화되고 이용자의 불안도 해소될 수 있을 것으로 기대된
다. 방송통신위원회는 이 전략의 후속 사업으로 클라우드 SLA 가이드를 제정(’11년
10월)하여 관련 업체에 보급하였으며, 현재는 민간 클라우드 서비스 인증제를 마련
(’12년 1월)하여 시행 중에 있다.
<표 7> 클라우드 친화적 법제도 환경 조성을 위한 실천전략
실천전략 설명
‘전산설비 구비의무’
완화
∙ 교육, 의료, 금융 분야의 사업인허가 요건에서 전산설비 구비의무를 클라
우드 환경에 맞게 완화
클라우드
신뢰성 제고를 위한
법령 정비
∙ 이용자 정보보호 규정, 클라우드 업체의 서비스 중단 시 사전통지, 정보파
기나 보험에 관한 의무부과
∙ 중요정보의 해외유출에 대비한 해외유출 대응규정 마련
클라우드 서비스 발전전략과 정책과제
2012/5/16 …17
실천전략 설명
우수 서비스
인증제 도입
∙ 클라우드 서비스 제공자에 대해 구조, 성능, 보안성, 경영환경, 네트워크
및 데이터센터 등 서비스 제공기반과 서비스 지속성, 그리고 고객지원 수
준을 평가하여 인증
∙ 인증을 받은 서비스 제공자에게 각종 인센티브 제공
서비스 수준협약
가이드라인 보급
∙ 사업자와 이용자 간 품질분쟁을 예방하기 위해 서비스 수준협약에 관한
가이드라인을 제정하여 보급
∙ 항목은 이용약정시간 준수율, 백업준수율, 고객요청 처리율, 동일장애 발
생률, 변경요청 시 오류건수율 등
클라우드
보안안내서 마련
∙ 클라우드 서비스 보안요소별 자가점검 기준 등을 담은 보안관리 안내서와
클라우드상의 개인정보 보호를 위한 개인정보 보호 수칙을 마련하여 보급
(2) 공공부문 IT 인프라의 클라우드화
공공부문 IT 인프라의 클라우드화는 정부가 선도적으로 클라우드 서비스를 적극 도
입하여 국가 IT 인프라 효율화를 이끌면서 정부의 IT 예산을 절감하고, 더 나아가 국
내 클라우드 시장창출 및 산업발전에 기여하는 것을 목표로 하는 정책과제이다. 이
과제를 실행하기 위한 구체적인 실천전략을 정리하면 <표 8>과 같다.
<표 8> 공공부문 IT 인프라의 클라우드화를 위한 실천전략
실천전략 설명
국가 IT 자원의
클라우드화
∙ 중앙부처, 지자체, 공공기관이 보유한 HW 및 SW를 클라우드 환경으로
단계적 전환
∙ 정부통합전산센터를 중심으로, 중앙부처 IT 자원을 클라우드로 전환하여
예산을 절감하면서 전자정부 등 공공 서비스의 수준을 대폭 향상
∙ 이를 위해 ‘전자정부 표준 프레임워크’를 마련, 발전시킴
클라우드 기반 스마트
오피스 시범사업
∙ 정부 및 공공기관에서 사용하는 PC를 클라우드로 통합하고, 어디서나 다
양한 스마트 디바이스(스마트폰이나 스마트 Pad 등)를 통해 업무를 처리
할 수 있는 환경 제공
국내 기술의
선도적 도입
∙ 공공부문 IT 인프라 구축에 공개 SW와 함께 국산제품이나 기술을 우선
활용하도록 권고
∙ 정부의 R&D 지원사업을 통해 개발된 기술을 우선적으로 도입하거나 활용
초 점
2012/5/16 …18
(3) 클라우드 산업의 국제경쟁력 강화
국내 클라우드 산업 및 서비스의 국제경쟁력을 높이기 위해서는 R&D, 표준화, 인
력 양성, 벤처캐피탈 등을 통한 자금 지원, 테스트베드의 확대 등을 통해 튼튼한 산업
기반을 조성하는 것이 필요하다. 그 구체적 실천전략을 살펴보면, <표 9>와 같다.
<표 9> 클라우드 산업의 국제경쟁력 강화를 위한 실천전략
실천전략 설명
클라우드 기술개발
∙ 일차적으로 모바일 클라우드, 가상 데스트톱, 클라우드 기반 SW 플랫폼을
개발하고, 개발된 애플리케이션과 플랫폼의 유통을 위한 클라우드 마켓플
레이스를 구축
클라우드 기술표준화
∙ 국가표준 코디네이터를 활용하여, 모바일 및 공공 클라우드의 상호운용성,
데이터 호환성, 데이터센터 기술 및 보안 등에 대한 표준화를 추진
∙ 이와 함께 국제표준활동을 강화
공개 SW 활성화 ∙ 업계, 학계, 연구소, 커뮤니티 등이 참여하는 ‘클라우드 공개 SW 네트워크’
를 구축하여 공개 SW를 확산하고, 지원사업 등을 추진
인력 양성
∙ 클라우드 관련 인력 양성은 IT 재직자 단기집중교육, 석박사급 인력 양성,
클라우드 보안 전문교육으로 나누어서 실시
∙ 이를 위해 방송통신정책연구센터(CPRC)와 정보통신연구센터(ITRC)를
활용
지원체제 구축
∙ KIF(Korea Information and Technology Fund) 등을 통해 클라우드 벤처
기업 등에 금융 지원
∙ 클라우드 지원센터를 통해 중소 클라우드 기업에 비즈니스 컨설팅, 기술
자문, 법적 자문, 테스트베드 등을 지원
테스트베드 확충 ∙ 중소기업, 대학, 공공기관, 산업단지 등을 대상으로 서비스 모델 및 솔루션
을 시험, 검증할 수 있는 테스트베드 구축 및 이용 촉진
(4) 클라우드 데이터센터 육성
IT 자원의 클라우드화 추세에 부응하여 우리나라를 글로벌 IT 허브로서 포지셔닝
하는 것이 필요하다. 이에 따라 국내 데이터센터에 클라우드를 접목하여 글로벌 경쟁
력을 갖도록 지원하고, 해외 데이터센터를 유치할 수 있는 기반을 마련하는 것이 필요
클라우드 서비스 발전전략과 정책과제
2012/5/16 …19
하다. 이를 위한 실천전략은 <표 10>과 같다. 방송통신위원회는 향후 클라우드 데이
터센터 구축 성공사례를 분석하고, 전문가 자문을 통해 국내 기업들이 참조할 수 있는
클라우드 데이터센터 로드맵을 도출할 예정이다.
<표 10> 클라우드 데이터센터 육성을 위한 실천전략
실천전략 설명
클라우드 데이터센터
활성화
∙ 현재의 인터넷 데이터센터에 클라우드를 접목, 국내외 기업에게 서비스
제공 유도
∙ 성공사례의 공유를 통해 한국형 클라우드 데이터센터 로드맵을 도출하
고, 녹색인증, 지방세 감면 등 세제지원 방안 검토
글로벌 진출 지원
∙ 클라우드 데이터센터 구축경험 등을 통한 솔루션 수출, 해외업체와의
동반구축 등 해외진출 지원
∙ 패키지형 그린 IDC 통합솔루션의 수출상품화
해외 클라우드
데이터센터 국내 유치 ∙ 우선 아시아 국가를 대상으로 해외업체의 데이터센터를 국내에 유치
(5) 클라우드 시장 기반 조성
시장 기반의 조성을 위해서는 클라우드에 대한 인지도를 높이고, 글로벌 경쟁력을
가진 서비스 모델을 발굴하는 것이 필요하다. 이를 위한 실천전략은 <표 11>과 같다.
<표 11> 클라우드 시장 기반 조성을 위한 실천전략
실천전략 설명
클라우드 기반 스마트워크
서비스 이용 지원
∙ 중소기업 등이 클라우드 기반 스마트워크 서비스를 이용하는 경우,
사용료나 세제 지원
클라우드 활성화 홍보 ∙ 클라우드에 대한 중소기업의 인지도가 낮아, 클라우드 도입 성공사
례집을 발간하고 홍보를 위한 컨퍼런스를 개최
산업단지의 클라우드
시스템 도입
∙ 기존 산업단지의 정보 시스템을 클라우드 기반으로 전환하고 입주
기업에 서비스를 제공
∙ 테스트베드를 활용한 시범 서비스를 산업단지에 적용
초 점
2012/5/16 …20
실천전략 설명
시업사업 추진
∙ 한국이 강점을 가진 모바일, 한류 콘텐츠, 전자정부에 클라우드를
적용, 국제경쟁력이 높은 모델을 발굴
∙ 시범 서비스로서 모바일 클라우드 서비스, 융합산업 서비스, 전자정
부 서비스 등을 검토하여 추진
Ⅳ. 결론 및 향후 과제
본고에서는 우리나라의 클라우드 서비스 시장 활성화와 관련 산업의 국제경쟁력 강
화를 위한 국가 차원에서의 발전전략과 정책과제를 제시하였다. 우선, 과제도출의
reference로서 미국의 클라우드 정책, EU의 클라우드 정책 구상, 영국의 클라우드 정
책 사례를 살펴보았다. 이어 우리나라 정부가 관계부처 합동으로 마련한 정책과제별
세부 실천전략을 소개하였다. 소개된 발전전략과 정책과제는 글로벌 클라우드 시장을
선도하는 미국에 비해 약 2년 내외의 시간적 격차를 가지고 있으나, 정책의 범위와
다양성에서는 매우 포괄적인 정책수단을 담고 있다.
우리나라를 포함한 IT 선도국들의 이러한 선도적 정책 노력과 Amazon, IBM,
Google, Microsoft, Oracle 등 글로벌 IT 선도기업의 시장개발 노력에도 불구하고,
현재 전 세계 클라우드 서비스 시장은 B2B 비즈니스 시장보다는 스마트 단말을 중심
으로 한 B2C 서비스 시장이 선도하는 양상을 보이고 있다. 이는 클라우드 서비스 시
장의 무한한 성장가능성에도 불구하고 시장 확산은 개인형 모바일 클라우드에서 데스
크톱 가상화를 통한 통합 클라우드로 이루어지며, 이러한 단계가 어느 정도 성숙되고
난 후에야 본격적인 B2B의 범용 비즈니스 컴퓨팅 시장으로 확산되는 양상을 보일 것
임을 시사한다.
따라서 향후 치열하게 전개될 글로벌 클라우드 시장경쟁은 국가별로 자국에 적합한
전략적 시장 포지셔닝을 어떻게 잘 마련하느냐, 그리고 확산 초기단계에서 탄탄한 시
장 기반과 관련 산업 기반을 얼마나 꾸준히, 참을성 있게 지속해 나가느냐에 따라 그
승패가 결정될 것이다. 이러한 관점에서 방송통신위원회가 관계부처 합동으로 마련한
클라우드 서비스 발전전략과 정책과제
2012/5/16 …21
‘클라우드 컴퓨팅 확산 및 경쟁력 강화전략’의 발전전략, 정책과제, 과제별 실천전략
은 향후 추가적인 연구를 통해서 보다 실효성이 있고, 가시적인 성과와 연결되어 클라
우드 시장의 동태적 진화과정을 반영한 발전전략으로 업그레이드될 필요가 있다. 그
방향을 모색하는 데 있어서 미국의 Cloud First 전략과 FedRAMP 프로그램, EU의
OPTIMIS와 영국의 G-Cloud 등 선진사례는 물론, 방송통신위원회 주관으로 2012년
1월에 출범한 민간 클라우드 서비스 인증제 등을 지속적으로 모니터링하고, 광범위하
게 수집된 정책성과를 바탕으로 그 적용범위와 수준을 더욱 확대 ․ 발전시킬 필요가
있다.
클라우드 서비스는 그 정의에도 불구하고, 실제 모습은 시시각각 변하고 있다. 이는
아직까지 클라우드 서비스의 비즈니스 모델이 - 특히 B2B의 비즈니스 컴퓨팅 영역의
모델이 - 대중적 수요로 이어지지 못하고 있기 때문이기도 하지만, 클라우드의 기반
기술이라고 할 수 있는 다양한 분산형 컴퓨팅 기술, Software Defined Network과 같
은 미래 인터넷 기술, 대용량 콘텐츠 전송(Contents Delivery) 기술이 매우 빠른 속도
로 발전하고 있기 때문이기도 하다. 이에 따라 IT 강국에 자부심을 갖고 있는 우리나
라가 미래에 다가올 클라우드 컴퓨팅 환경에서도 선도적 위치를 차지하기 위해서는
보다 포괄적인 IT 정책의 틀 속에서 선도적이고 창의적인 클라우드 정책을 지속적으
로 개발하고, 실행해 나가는 것이 필요할 것이다.
참고문헌
관계부처 합동 (2011), “클라우드 컴퓨팅 확산 및 경쟁력 강화전략”, 보고자료.
박춘식 (2012), “미국 클라우드 컴퓨팅 보안인증제도 FedRAMP 소개”, 정보통신산
업진흥원.
박종훈 (2012), “영국정부 G-Cloud 서비스 개시, 초반 거래실적은 부진”, 정보통
신산업진흥원.
안원호 (2009), “클라우드 서비스 활성화를 위한 정책방향”,《TTA Journal》, 125
호, pp.33~36.
초 점
2012/5/16 …22
윤재석 (2011), “주요 국가 클라우드 정책동향 및 시사점”, 한국인터넷진흥원.
장석권 ․ 김은정 (2011), “Evolutionary Dynamics of Broadband Convergence
toward Cloud Services: The Case of Korea”. NAEC 2011 Proceedings.
Dawson, Stephen, et al. (2009). “OPTIMIS Use Case and Requirements Refinement
Report”.
European Commission (2010). “The Future of Cloud Computing: Opportunities
for European Cloud Computing Beyond 2010”. Expert Group Report.
Kundra, Vivek (2011). “Federal Cloud Computing Strategy”. The White House.
NIST (2011). “High-Priority Requirements to Further USG Agency Cloud
Computing Adoption”. US Government Cloud Computing Technology
Roadmap Vol. 1, Release 1.0.
GSA (2012). “FedRAMP Concept of Operations (CONOPS)”. Version 1.0.


대학시절 하얗게 밤을 세우며 프로그램과 PC통신 하이텔로 친구를 사귀던

IBM XT/AT 컴퓨터의 사진을 찾아봅니다.

비행기의 이착륙과 같은 시동소음을 내던 무려 40MB의 하드,

빌게이츠 어르신이 충분하리라고 생각했던 640KB의 메모리,

컴퓨터를 기동하며 계속 바꿔넣기 바빴던 5.25Inch 디스켓....

다시오지 않는 추억이 되었습니다.


* XT 컴퓨터의 모습


* 부팅시 메시지


* XT와 XT 구입시 딸려오는 정품MSDOS 소프트웨어 패키지


* 지금은 컴퓨터에 없고 하드인 C:\>로 시작되지만 보이는 A:\>드라이브 또 B:\> 드라이브로 나타게되는 플로피 드라이브


* 8bit 에서 기본으로 돌아가던 basic 언어의 DOS버전인 gwBASIC 구동화면

소프트웨어 특허출원, 소프트웨어 특허 명세서 작성법 안내

특허명세서, 요약서의 작성법과 도면 작성법

1.서론

소프트웨어 관련 발명은 두가지 유형이 있다.

그중에서 하나는 방법 카테고리의 발명이다. 이것은 시계열적으로 연결된 일련의 처리 또는 조작 즉, 「절차」(procedures 또는 steps)로서 표현 가능할 때에 그 「절차」를 특정함으로 써 「방법」카테고리의 발명 형태로 기재할수 있는 유형의 발명이다.

또하나는 물건 카테고리의 발명이다 이것은 복수의 「기능」결합으로서 표현 가능할때에 기능실현수단(means plus function)과 그들의 결합관계를 특정함으로써 「물건」카테고리의 발명(즉,「장치」발명) 형태로 기재할수 있는 유형의 발명이다. 이 밖에도 컴퓨터 자체의 구성이 특징인 발명은 대체로 장치발명의 형태로 기재하여야 할 것이다. 이하 3-2부터3-6에 있어서는 특허명세서에 관한 기초적 설명을 하고, 그 대음에 3-7부터3-8에 있어서는 소프트웨어관련 발명의 명세서 및 도면에 관한 설명을 한다. 또 실용신안에 관하여도 특히 일본에서는 1994년1월1일부터시행된 무심사제도 때문에 이분야에 관한 실용신안출원이 감소할것으로 예상되므로 간단하게 방식의 차이만 설명하고자 하며 명세서등의 기재 요령은 특허에 준한다.

2.명세서에 관한 기초사항

특허(또는 실용신안)의 명세서 및 요약서는 특허법 시행규칙 양식제 29 및 공업소유권에 관한 절차등의 특례에 관한 법률(이하단순히 특례법이라 한다) 시행규칙 양식제 14(또는 실용신안법 시행규칙의 해당하는 양식)에 의하여 도 1(또는 제2도) 및 제3도의 서식으로 작성한다. (실용신안명세서의 경우, 발명이 고안으로 용어가 바뀌는 것뿐이기 때문에 이하의 설명에 관하여 발명, 특허청구의 범위등의 단어를 각각 고안, 살용신안등록청구의 범위 등으로 바꿔 읽으면 된다.)

제 1 도의 양식에서 두칸오른쪽으로 들어간【 】속에 나타낸 산업상의 이용분야부터 발명의 효과까지의 각 항목의 제목에 관하여는 「원칙적으로 ...등의 제목을 기재한다」라고 특허법 시행규칙의 비고에 규정되어 있으므로 그 문언이나 항목의 분류법도 실제 각 명세서를 쓰는 법이나 발명의 내용에 따라서 필요하면 적당히 변경하여도 상관이 없다. 예를들어 일본특허청 편, 일본발명협회 발행의 「특허·실용#46145;신안의 명세서 기재 요령」에 있어서도 이러한 두칸 오른쪽으로 들어간 각 항목에 관하여 그 순서가 제 1 도에 나타낸 서식과 다르거나 이서식에 없는 항목이 추가되어 있는예, 이서식에 있는 항목이 없는 예등도 있다. 즉, 두칸 오른쪽으로 들어간 【 】에 의한 항목의 분류법이나 항목제목의 문언에 고나하여 그렇게 어렵게 생각할 필요가 없다. 그렇지만 상기 이외의 왼쪽으로 치우친 굵은【 】글로 나타낸 학목(【서류명】,【발명의 명칭】, 【특허청구의 범위】등)은 항상 이 순서로 모두 기재 할것이 필요하며 그 항목에 표시한 문언도 상기의 서식대로 하여야 한다. 그리고 제 1 도에 있는 「【 」,「 】」의 기호는 특허청 출원사무의 전자화에 따라서 도입된 것으로서, 특허청의 컴퓨터 시스템에 입력시키기 위한 기호이며 반드시 이 기호를 사용하여야 한다. 또 이기호는 소정의 항목이외에서 사용이 금지되어 있다.

제1도에서 나타내는 것처럼 명세서는 원칙적으로서 1. 발명의 명칭, 2. 특허청구의범위, 3. 발명의상세한설명, 4. 도면의 간단한 설명의 네가지 큰 항목을 구성陗 있지만 그 중에서 권리내영에 있어서 특히 중요한 것이 특허청구범위의 항목과 발명의 상세한 설명의 항목이다.

제3도에 나타낸 요약서는 평성원년 12월 1일부터의 출원사무의 전자화와 동시에 특허의 국제적 harmonization을 목표로 새로 추가된 것이지만 특허법 제43조에 의하여 제외국과 마찬가지로 요약서는 특허발명의 기술적 범위(외국에서 말하는 scope of the invention)를 결정할 경우 즉, 해석할 경우에 이를 교려하여서는 안되다고 규정되어 있다.

또 특허법 등의 시행규칙 규정에 의하여 출원서, 특허명세서 등의 양식은 일본공업규격 A열4번(A4사이즈)(가로21cm×세로29.7cm)의 백지를 세로로 사용하며 테두리, 괘선등은 기입하지 않고 좌우와 상하에 각각 2cm의 여백을 준다.

한페이지를 최대한 활용하는 경우에 한 행에 36문자, 한페이지에 29행 또는 그 이내로 타이핑하며 각행의 간격은 적어도 4mm이상의 한다. 그리고 각 페이지의 상단부 여백부분의 오른쪽 끝에 페이지수를 기입한다.

문자는 10point 부터 12point까지의 크기로 흑색을 사용하고 타이프라이터 또는 워드프로세서로 작성한다. JIS10수준 또는 JIS40수준을 사용한 플로피디스크에 의하여 출원할 경우 온라인에 의하여 출원할 경우 매우복잡하고, 내용적으로도 본서의 대상이 아니기 때문에 여기서 용지에 의한 출원서류 작성만을 설명한다.

다음의 3-3부터3-8가지는 일반적인 명세서(청구범위를포함한), 도면 및 요약서 작성에 관한 설명이다. 따라서 일반적인 명세서, 도면 및 요약서에 관하여 이미 알고 있으며 소프트웨어 관련 명세서등의 서류작성에 관한정보를 얻은 것으로 족하다면 3-3부터 3-8을 생략하고 「3-9 소프트웨어관련 발명의 명세서」 로 넘어가도 무방하다.

3.발명의 명칭

발명의 명칭은 발명의 표제로서 발명의 분류, 정리, 조사등을 용이하게 하기 위하여 기재하는 것이므로 이 난에는 발명의 내용에 따라 간명하게 기재하여애 한다.(특허법 시행규칙 제 24 조 양식29 비고 12 특례법 시행규칙 제 11 조 양식제14 비고 9 및 양식제19비고8).

기재상의 유의점을 열거하면 다음과 같다.

a) 기술분양 및 기술내용이 구체적으로 파악될수 있도록 정확하고도 간명하게 기재한다.

예를들어 온도계 제어밖에 사용할수 없는 자동제어장치의 경우 명칭으로서 「자동온도제어장치」는 적절하지만, 단순히 「자동제어장치」라고 하는 것이 적절하지 않다.

b) 될 수 있는 한 특허청구의 범위와 같은 기술용어를 사용하여 기재한다. 관습적으로 발명의 명칭과 같은 용어를 특허청구범위의 말미에 사용하여...「 ... 것을 특징으로 하는 ∼」또는 「 ... 를 구비한 ∼ 」라는 형태로 사용할 경우가 많다.

c) 특허청구범위의 난에는 서로 다른 카테고리의 발명 (물건, 그 물건의 부분 또는 응용물, 제조방법, 제조장치, 사용방법 등) 혹은 서로 다른 개념 (물건, 그 부분, 그 응용물, 조합장치와 그 조합요소 등 ) 의 발명 청구항 즉 claim의 각 항을 함께 기재할 때에는 그것을 간결하게 정리하여 발명의 명칭으로 기재한다. 각 카테고리의 명칭을 너무 기계적으로 나열하면 오히려 군더더기가 되어서 바람직하지 않다.

d) 개인명, 상표명, 상품의 애칭, 극히 추상적인 기능밖에 나타내지 않는 언어 (예: 「 」,「티파니」, 「문명식」, 「능률식」) 또는 「특허」「등록」등의 단어를 사용하여서는 안된다.

e) 발명의 명칭 기재에 사용할 수 있는 문자, 기호는 제한되어 있으며 사용가능한 문자, 기호는 다음과 같다.

; 문자 : 한자, 히라가나, 가타카나, 아라비아숫자, 그리스문자, 로마문자

⼑ 기호 : 。 ( 구두점 ), ·( 중점 ), ","( 콤마 ), / ( slash ), ( ( 왼쪽 괄호 ), ) (오른쪽 괄호), ' ( 어퍼스트로피 ), + ( 플러스 ), - ( 마이너스 ), . ( 피어리드 )

또한 명칭에서의 왼쪽 괄호 및 오른 쪽 괄호의 사용은 화학 물질에만 사용이 가능하다. 그리고 출원절차 전자화의 실무상의 요건으로서 특허출원서는 특정한 서체밖에 사용할 수 없으므로 사무의 안전과 간결을 위하여 발명의 명칭 표현에도 전각 이외의 문자는 피하는 것이 바람직하다.

4.특허청구의 범위

특허청구의 범위는 그 영어 이름을 사용하여 흔히 claim 이라고도 한다. 그 중에서 항으로 구분하고 각 발명을 기재한 항을 청구항이라고 한다. 이 난에는 발명의 상세한 설명에 기재한 발명이면서 특허를 받으려는 발명의 구성에서 빠뜨릴 수 없는 사항만을 기재한 하나 이상의 청구항을 기재한다. 특허법의 다항제을 위한 법개정 이래로 복수의 발명도 특허법 제 42조에 규정한 조건에 따라 하나의 출원으로 가능하다. 또 특허법 제36조제6항의 규정에 의하여 두가지 이상의 청구항에 관한 발명이 실제로 서로 동일하지만 표현만 다른 것도 아울러 기재하는 것도 가능하다.

주 : 과거의 특허·실용신안 공보를 보면 알 수 있겠지만 특허청구범위의 형태는 여러가지 형태이다. 각각 운용이나 해석방법이 다르므로 상세한 내용은 특허사무소에서 전문가가 확인할 필요가 있다.

당연하면서도 때로는 오해하기쉬운 내용으로서, 어떤 청구항의 발명은 그 구성요소 내지 구성요건의 수량이 많으면 많을수록 그 기술적 범위가 좁아진다. 또 청구항의 기재가 불분명하거나 이해하기 어려울때에는 본문을 참조하여 해석할때가 있지만, 그런 경우에 판례상 불분명한 점이 문헌보다 확대되어 해석할 경우는 거의 없으며 오히려 실시예에 의하여 좁게 해석될 경우가 많다. 따라서 각 청구항은 불분명하거나 이해하기 어려운 것이 기재되지 않도록 하여야 한다.

청구항의 기재에 있어서 유의하여야 할 점을 약간 언급한다면 다음과 같다.

a) 발명의 상세한 설명에서 공개한 발명의 범위를 넘지 않도록 또 필요한 불가결한 (기술적) 사항(발명을 구성하는 기술적 구성요소, 이하 같음)이 빠지거니 필요이상의 (기술적) 사항이 포함되지 않도록 기재한다.

구성으로서는 제조방법일 경우에는 원료·목적물질·반응조건·용매·촉매·조작순서나 공정등을, 장치불명일 경우에는 요부·전달기구·형상·구조·배치·결합 또는 결합상태·접속·접속형식·기능을 달성하는 장치수단등을, 조성물에서는 성분·비율등을 들수가 있다.

b) 각(기술적) 사항을 단순히 열거하는 것 뿐만아니라 상호관계도 명확히 기재한다.

c) 개량발명등의 경우에는 전체가 되는 선행기술을 기재할 때에 「…(선행기술)에 있어서, …」라는 표형형식을 사용하여 발명의 특징부분과의 구별을 명확히 하는 것이 바람직하다.(이것을 two-parts claim)이라고 한다.

e) 각(기술적) 사항을 조목별로 기재하는 것이 내용을 이해하는데 더편리한 경우에는 조목별로 기재한다. 단, 조목별로 기재할때에 표제부호를 붙인다면, 각 청구항에 붙는 번호 (1), (2), (3)등과 구별하기 위하여 (A), (B), (C) 또는 (가), (나), (다)와 같은 연속부호를 붙여야 한다.

[예]

【청구항】다음과 같은 공정에 의한 반사마크의 제조방법

(가) 내구성을 갖는 종이의 한쪽면에 풀을 붙이는 제 1 공정

(나) 풀을 붙인면에 유리알을 살포하는 제 2 공정

(다) 유리알 윗면에 합성수지를 피복하는 제 3 공정

f) 기재내용의 이해를 돕기 위하여 필요할 때에는 도면에서 사용한 부호를 괄호를 붙여 기재할수 있다. 그러나 그 부호를 제외하더라도 그 구성은 명확하게 기재되어야 한다.

g) 발명의 상세한 설명 또는 도면의 기재를 인용하여서는 안된다. 예를들어「제1도의 장치에 있어서… 」와 같은 표현을 사용하여서는 안된다.

h) 물건의 발명에 있어서 방법적 표현을 사용하면 안된다. 단, 방법적표현이외에 적절한 표현이 없는 경우 그렇지 않다.

I) 방법의 발명에 있어서 그 발명의 특정부분인 (기술적) 사항을 물건으로서 표현하면 안된다.

j) 목적이나 효과로서 (기술적) 사항을 기재하여서는 안된다. 예를들어「 기동시 탈수조의 회전운전을 억제하여 기동을 용이하게 할수 있는 원심탈수기」라고 기재하여서는 안되다.

k) 원칙적으로 다음과 같은 표현을 사용하면 안된다.

①「본문에서 상술하고, 또한 도면에 나타낸것처럼」,「본물의 목적에 있어서, 본문에서 상술한 바와같이」라는 것같은 예전에 사용되었던 관용어구

② 부정적 표현

③ 정도를 나타내는 표현(예:「약간 비중이 큰」,「훨씬 큰」,「저온」,「고온」)

④「바람직한」,「희망에 따라」,「필요에 따라」,「약」,「 」,「특히」,「예를들어」,「적당」,「또는」,이라는 표현. 단,「또는」이외에는 적절한 표현이 없고 전체적으로 한발명이라고 인정될 경우에 및 다수항에 종속하는 형식에 있어서는「또는」이 사용가능하다.

병렬적 개념에 상당하는 두가지 이상의 사항이 실직적으로 하나의 발명구성에 빠뜨릴수 없는 상항으로서 포괄적 표현이 불가능할 때에는 택일적 기재가 인정된다(예를들어 Markush claim적 표현).

⑤「...이상」,「...이하」등 하한 또는 상한 만을 나타내는 수치한정

⑥「0∼10%」와 같이 을 포함하는 수치한정.

주 : 보정의 제한에 관한 법개정으로 그 시행이후에 출원한 청구폗의 보정은, 동법규정에 의한 마지막 거절이유통지로 표시되는 통지에 대하여 청구항 마다의 포기, 하위개념으로 , 이 및 명료화를 위한 보정에만 한정하개 되었다. 그러무로 平成6년(1994년)1월1일부터 실시하는 개정법에서는, 출원 당초부터는 또는 첫 번째 거절이유통지에 대한 응답을 할 때에 필요하다고 생각되는 청구항목을 가능한 한 다수 기재해 두는 것이 출원절차 및 특허 등록후의 권리 운용에 있어서 중요하게 되었다.

5.발명의 상세한 설명

이곳에는 그 발명이 속하는 기술분야에서 통상의 지식을 가진 자가 용이하게 실시할수 있을 정도로 그 발명의 목적(구체적으로 산업상 이용분야, 종래의 기술, 그 발명이 해결하고자 하는 과제등을 포함함), 구성(구체적으로 실시예를 포함함) 및 효과를 기재하여야 한다.(특허법 제 36조 제 4 항(한국 제 42 조 제 3 항))

발명의 목적, 구성 및 효과의 설명은 서로 인질되어야 하며 이들간에 서로 모순이 생겨서는 안된다.

주 : 1)「그 발명이 속하는 기술분야」라 함은「출원에 관한 발명을 그 목적, 구성효과

및 효과로 판단할 때에 그 발명이 속하는 기술분야」를 말한다.

2)「그 발명이 속하는 기술분야에서 통상의 지식을 가진자(당업자)」란「출원에 관

한 설명이 속하는 기술분야에서 보통정도의 기술적 이해력을 가진자」를 말한

다.

3)「용이하게 실시할 수 있을 정도」란「출원시 기술수준에서 출원에 관한 발명을

정확히 이해 할수있으며, 동시에 재현할 수 있는 정도」를 말한다.

5-1 산업상의 이용분야

발명이 어느 기술분야에 속하는 것인가를 기재한다.

5-2 종래의 기술

발명과 비교대조되는 종래의 기술에 관하여 그 내용을 구체적으로 기재함과 동시에 그 내용을 나타내는 문헌이 존재할 경우에 원칙적으로 그 문헌 명(예를들어 일본특허공개62-⼑⼑⼑⼑⼑호, ⼁⼁⼁주식회사발행잡지⼱⼱⼱ 1987년 제⼑ 제⼑⼑∼⼑⼑페이지등)을 함께 기재한다.

그리고 문헌명이나 특허공고를 열거하여 종래의 기술을 인용할 경우에 그리고 발명이 해결하고자 하는 과제를 지적하는데 있어서 그것에 기재된 기술을 함부로 비방하는 표현을 사용하여서는 안된다. 또 그 문헌이나 특허공보등의 번호 혹은 명칭·발행소등을 인용만 하고 종래의 기술 설명을 생략하는 것이 아니고, 명세서에 기재된 등을 인용만 하고 종래의 기술설명을 생략하는 것이 내용을 이해할수 있도록 인용문헌의 기술개요를 장황폁게 기재하지 말고 그 요점을 추출하여 설명하여야 한다. 또 일본의 일부명세서에 있어서는 종래의 기술설명을 다수의 도면과 상세한 설명으로 설명하는 한편, 본 발명의 짧은 문장으로 기술하는 경우가 있다. 이것은 국제적인 관점에서 좋은 명세서 스타일이라고 할수없으며, 권리운용에 있어서도 본 발명의 적극적이고 충분한 설명의 결여라는 문제를 남기게 될 염려가 있으며로 피하여야 할 것이다.

또한 종래기술이 없는 완전히 새로운 발명에 관하여는 비교하여야할 종래의 기술이 없다는 것을 설명함으로써 종래의 기술을 대신할수 있다.

5-3 발명이 해결하고자하는 과제

종래의 기술을 분석하여 본 발명이 해결하고자 하는 과제를 종래의 기술과 대비내지 관련시켜 기재한다.

이 항목의 말미에 본 발명이 목적을 간결하게 기재하는 것이 일반적이다. 발명의 목적은 특허법 제 42조 제 3 항에 그 기재에 필요한 사항이 규정되어 있으므로 명료하게 나타내야 한다.

5-4 과제를 해결하기 위한 수단

상기의「발명이 해결하고자 하는 과제」에서 논한 과제를 해결하기 위하여 어떠한 수당을 강구했는지를 기재한다. 즉, 이 항목은 발명의 구성을 나타낸다. 발명의 구성은 상기와 마찬가지로 특허법 제 36조 4항(한국제42조제3항)에 기재가 요구되어 있으므로 명료하게 나타내야 한다.

일반적으로 이미 특허청구의 범위란 발명의 구성에 빠뜨릴 수 없는 사항을 기입하였지만, 이「과제를 해결하기 위한 수단」란에 기재한 발명 구성의 기재내용은 청구범위란의 문언에 가까운 것 혹은 그것을 약간 쉽게 이해할수 있도록 바꾼 것이 많다.

또 이러한 경우에 강구한 수단이 복수의 수단(사항)으로 되어 있는 경우에는 그들이 서로 어떠한 관계에 있는지를 기재할 필요가 있다.

강구한 수단(기술적사항)에 관하여 무엇을 기입하여야 하는가에 관한 예를 이하에 나타낸다.

a)기계, 기구, 장치, 부품, 회로 등의 발명(물건의 발명)의 경우

(ⅰ) 구조체에 관한 발명에서는 구조체를 구성하는 단위부재, 그 단위 부재의 재질이나 형상, 단위부재 A에 대한 단위부재B의 위치나 설치상태등

(ⅱ) 회로에 관한 발명에서는 회로를 구성하는 각 소자와 그들의 접속관계등

(ⅲ) 기구, 부품등의 내부 부품(bolt, nut등)의 발명에서는 재질이나 형상등

(ⅳ) 화학물질의 발명에서는 화합물명 또는 화학 구조식, 물질의 동정, 제조방법, 용도(유용성)등

주 : 또한 화학물질을 대상으로 하는 실용신안의 출원은 할수 없다.

(ⅴ) 조성물의 발명에서는 재료의 배합, 용도 혹은 성질등.

주 : 조성물에 대하여도 실용신안 출원은 원칙적으로 할 수 없다.

b) 방법 발명의 경우 :

(ⅰ) 기계, 기구, 장치 등의 사용방법의 발명에서는 기계, 기구, 장치등의 조작순서나 조건, 조작의 대상이 되는 기계, 기구, 장치 등.

(ⅱ) 화합물, 조성물등을 사용하여 물건을 처리하는 방법의 발명에서는 피처리물의 처리순서나 조건, 처리에 사용되는 화합물, 조성물등

c) 기계, 기구, 장치, 부품, 조성물, 화합물등의 제조방법의 발명의 경우 :

그 발명에 의한 생산물, 생산공정, 온도·압력·시간등 생산조건(화학반응의 경우에 반응식, 사용촉매등), 생산물의 용도, 생산에 사용되는 기계, 기구, 장치등.

주 : 방법의 고안을 대상으로 하는 실용신안 출원은 할 수 없다.

강구한 이들 기술적인 수단중에서 당해 발명에 있어서 필요불가결한 사항은 반드시 그 모두를 기재하여야 한다. 그리고 이들이 본건 발명의 구성요건(특허청구범위의 청구항에 기재되는 기술적 사항을 발명의 구성요건이라고 함)이 되는 이유를, 자명한 경우를 제외하고 다음 항목에서 설명한 「작용」란에 기재함으로써 명료하게 한다.

전자계산기와 같은 복잡한 기술내용의 발명이나 발명구성의 설명이 길어서 내용을 파악하기 어려운 경우에는 처음부터 장황하게 기재하지 말고 발명구성의 에서 우선구성의 전체적인 내영을 이해할수 있도록 간명하게 기재하고, 다음에 그 구체적인 구성성문을 경우에 따라 번호등으로 표재를 붙인 항등으로 나누는 방법으로 상세히 기재하여 발명의 구성전체를 명료하게 하는 것이 바람직하다.

복수의 청구항을 가진 명세서의 경우 특히, 각청구항에 기재된 발명이 모두 발명의 상세한 설명에 기재된 것이어야 하므로 기본적으로 각 청구항에 대응하여 구성 및 실시예거 명세서에 기재되어야 한다. 단, 두가지 이상의 청구항에 동일한 부분이 있다면 그 부분에 대하여는 각 청구항과의 대응을 명료하게 하면 굳이 중복하여 기재할 필요는 없다.

발명의 구성요건에 포함되지 않는 기술적 상항(쉽게 말하면 청구항에 나오지 않는 사항)이라도 그 발명을 실시하는데 있어서 중요하고 청구범위에 기재된 사항과 밀접 불가분한 관계에 있는 사항에 관하여 이 항목 또는 다음의 「작용」항목에서 그것을 설명하는 것이 바람직하다. 물론 실시예에서는 꼭 설명이 필요하다.

도면을 첨부한 경우에 도면 부호를 인용하면서 발명의 구성 (예를 들어「과제를 해결하기 위한 수단」항목에 기재된 사항)을 설명하면 이해하기 쉽운경우가 있으므로, 복잡난해한 발명의 경우 등으로서 발명 구성의 각부분과 도면의 대비를 용이하게 하기 위하여 각부분에 (1), (2)와 같이 도면에 나타낸 부호를 함께 기재할수도 있다.

5-5 작용

개개의 기술적 수단이 어떠한 작용을 하는지, 그리고 그들이 서로 어떠한 관련을 가지고 전기한 과제를 해결하려고 작용하고 있는지 등을 기재한다. 단, 효과의 기재는 후술의「발명의 효과」란에 기입하게 되므로 이작용란에서 발명의 효과를 기입할필요가 없다. 따라서 단적으로 말하면 이 난은 기술적 수단과 효과의 중간 역할을 하는 사항을 기입하게 된다.

복수의 청구항을 갖는 명세서의 경우 앞절에서 논한 바와 같이 기본적으로 각 청구항에 대응하여 작용을 기재하여야 한다. 그러나 두가지 이상의 청구항에 있어서 동일한 부분이 있다면 그 부분에 대하여는 각 청구항과의 대응관계를 명료하게 하면 굳이 중복하여 기재할 필요는 없다.

5-6 실시례

발명이 재현될수 있을 정도로 상기 기술적 수단을 구체화하여 될 수 있다는 한 다양한 종류의 실시예를 구체적으로 기재한다.

상기한 문제점을 해결하기 위한 수단, 작용, 실시예의 기재에 공통적인 유의사항을 이하에 열거한다.

a) 청구항에 포괄적인 용어로 기재되어 있을 때에 그것에 의하여 구체적인 내용이 이론적, 경험적으로 이해될수 있는 경우를 제외하고는 포괄적 기재에 속하는 개개의 대표적인 예에 관하여 기재한다.

b) 청구항이 복수로 기재되어 있는 경우 기본적으로 诂청구항에 대응하는 기재가 상세한 설명에 있어야 한다. 단, 두가지 이상의 청구항에 있어서 동일한 부분이 있다면 그 부분에 대하여는 각 청구항과의 대응관계를 명료하게 하면 굳이 중복하여 기재할 필요는 없다.

c) 필요에 따라서 기본적 데이터, 실시태양, 비교예 등을 열거하면서 설명한다. 비교예로서는 당해 발명과 기술 그리고 시간적으로 가장 가까운 것을 기재한다. 또 예를 기재할 때에는 실시예, 비교예, 응용예등의 차이를 명확히 한다. 필요한 경우에 구체적 숙자, 도표등을 들어 증명한다.

d) 어떠한 기술적 수단에 대하여 그 수치를 한정하였을 때에는 그 한정이유를 기재한다. 한정의 근거를 실험데이타등에 의거하여 설명할 경우 그 실험방법을 당업자가 용이하게 재현할수 있을 정도로 구체적으로 기재한다.

e) 입수하기 어려운 재료, 소자 등을 사용할 경우에 그 제조 방법 또는 입수처(제조회사명, 품명등)를 기재한다.

f) 도면에 의거하여 설명할 때에는 대응하는 도면 번호(예를들어 도3등)를 명기한다. 또 도면에 있어서 사용한 부호는 용어의 뒤에 기재한다. 이지개에 있어서「...의 내부에는 2가 3에 의하여 고착되어」와 같은 도면에 나타낸 부호만으로 설명하여 명칭을 생략하여서는 한된다.

g) 또한 발명의 구성이 간단한 동시에 극히 구체적일경우에 구성을 설명한「과제를 해결하기 위한 수단 」란의 기재를 더욱 구체화한 실시예 기다릴 그 발명 내용을 정확히 이해할 수 있고 그 발명을 용이하게 실시할수 있는 경우가 있다. 이러한 경우 과제를 해결하기 위한 수단을 상세히 기입하여 두면 이것과는 별도로 실시예를 기재할 필요가 없는 경우가 있다.

h) 또 실시예이외에 그 이외에 관련한 사항을 실례를 들어 설명하고 자 할 때에는, 예들어 화합물의 제조방법에 관한 발명인 경우에 있어서 그 제조방법의 실시예 이외에 그 발명에 제조된 화합물의 용도등을 실례나 혹은 대비되는 비례를 들어 설명하고자 할 때에는 실시예와는 별도로 참고예(응용례, 비교예)로서 기재한다.

5-7 발명의 효과

발명의 효과는 발명이 해결하고자 하는 과제를 해결한 결과로서, 발명구성에 빠뜨릴수 없는 사항(즉, 특허청구의 범위에 규정한 사항)에 의하여 얻어지는 것을 말한다(이것을 발명특유의 효과라고 부를때가 있다). 이항목의 기재에는 원칙적으로서 [발명의 효과]의 기재가 요구 되어 있으므로 명료하게 기입하여야 한다.

기재상의 유의 사항을 말하면 다음과 같다.

a) 각 청구항에 기재된 발명과 종래의 기술과의 특성상의 차이에 의하여 어떠한 효과, 기술적 장점을 얻을수 있는지를 구체적으로 기재한다

b) 어느청구항에도 기재되어 있지 않은 사항에 의하여 발생의 효과를「발명의 효과」한에 지재하여서는 안된다. 그러한 효과는 관계되는 실시예의 설명중에서 그 실시예의 효과로서 기재한다. 그러한 부대적 사항에 의하여 발생하는 효과 또 참교례, 응용례에 있어서의 효과를 기재하는 경우에는 그 취지를 기입한다. 단, 장래 거절이유통지등에 대비하여 청구범위를 감축할 때에, 이들 실시예의 효과를 발명의 효과로 하는 명세서를 보정큁는 경우도 있으니 그 기재는 발명의 효과와 같이 논리적이고 동시에 명료한 것이 바람직하다.

c) 기술적 뒷받침이 없는 경제적 효과만을 발명의 효과로서 개재하여서는 안된다.

6.도면의 간단한 설명

이 난은 출원서에 도면을 첨부할 경우 필요하며 각 첨부도면이 무엇을 나타내는 도면인지 간단하게 설명하고 동시에 도면의 구요부분을 나타내는 부호에 대한 설명을 기재한다.

도면의 주요부분이란 특허청구의 범위에 필요한 청구항으로 기재된 기술적 사항 및 그것과 관련된 기술적으로 의미있는 사항에 대응하는 부분을 말한다. 청구항이 실시예보다 상위개념의 용어로 기재되어 있는 경우에 실시예로서 기재된 기술적 사폗에 대응하는 부분도 주요부분이다.

도면의 간단한 설명의 유의점을 들면 다음과 같다.

a) 도면의 설명에 있어서 종래의 기술을 나타내는 도면과 실시예를 나타내는 도면이 혼재하는 경우에 양자를 명확히 구별할수 있도록 기재한다.

원칙적으로 당해 발명 또는 고안의 특징을 잘 나나내는 도면을 제 1도로한다. 도면의 설명은 뒤의 명세서예와 같이 다음과 같은 형태를 취한다.

【도 1】

본 발명의 제 1 실시예鱁 나타내는 평면도,

. . .

. . .

. . .

【도 5】

종래기술의 대표적인 예를 나타내는 정면도,

도면의 명칭으로서 평면도, 측면도, 정면도 Ⅱ-Ⅱ선의 단면에 의한 측면단면도, 사시도, 부분확대도, 파단도, 블록도, 공정도, 회로도, 동작설명도, 파형도, time chart, flow chart, 원리설명도, 전개도, 분해도, 배치도등 적절한 표현을 시용하는 것이좋다.

전체 도면의 간단한 설명을 기재한 후에 【부호의 설명】의 표제를 붙여 도면에서 사용한 부호, 번호 중에서 주된 것(주요한 청구항에 나오는 정도의 부분)에 관하여 그 부호, 번호와 같이 나타내는 부분의 이름을 기입한다.

b) 부호의 설명에 있어 주요한 부분의 명칭만으로 당해 부분의 기술적 특징을 충분히 설명한수 없을 때에는, 당해 부분의 기능 또는 다른 부분 과의 연관성르 가미하여 기재하였도 된다.

[예] S4 클러치 페달과 관련하여 작동하는 스위치

S5 브레이크 페달과 관련하여 작동하는 스위치

7.도면작성법

1999년 부터 실시될 출원절차의 전자화에 따라 도면을 작성하는 방법에 관한 요건이 엄격하여 졌다.

(1) 우선 용지는 제 4 도에 나타내는 것처럼 A4사이즈를 사용하여 그 중에서 점선으로 나타낸 150mm×245mm범위내에 도면, 부호 및 설명의 문자를 모두 기입하여야 한다. 또 도면의 점선테두리는 그리지 않는다.

(2) 다음에 한 장의 A4사이즈 용지에 복수의 도면을 그리는 경우에는 도 5 와 같이 A4의 수평한 가상선(실제는 그리지 않는다)에 의하여 분할되는 배치를 하여야 한다.(이것은 특허청의 컴퓨터 도면 입력 소프트웨어 사정에 의한 것이다)

8. 요약서

출원절차 전자화를 위한 법개정 때 절차의 국제적 harmonization화를 위하여 요약서를 첨부하기로 규정하였다(특허법 제 36조 제 2 항).

요약서는 명세와는 별도의 페이지로 작성되어 기술적으로 정확하고도 간명하게 발명 전체를 기재한다.

【요약】란에는 명세서 또는 도면에 나타낸 발명 개요를 다음과 같이 나타낸다.

가. 원칙적으로 발명의 목적, 구성 등의 항목으로 나누어서 평이하고 도명료하게 기개한다.

나. 문자수는 400자 이내로 하며 간결하게 기재한다.

주 : 요약문은 실제로 더욱 자수로 구체적, 예시적으로기입하는 것이 좋다. 상기의 400자라 하더라도 국쩍으로 비교하면 대단히 길다. 외국출원이 예정되어 있을 때에는 200자 이하로 기재하지 않는다면 외국어로 번역하는 때에 다시 짧은 문장으로 작성하여야 할 염려가 있다.

다. 내용을 용이하게 이해기키기 위하여 선택도에서 사용한 부호를 문장에虡서 사용하여도 된다. 이경우에 괄호( )안에 기입하는 것이 바람직하다.

2012년도 감리사 필기시험 출제 분야()

과목

분 야

세부 출제 분야

감리

사업관리

공통 기술

데이터 수집/분석, 문서화/보고서 작성, 정보화 관련 표준, 의사소통 능력 등

IT 및 정보화 관련 표준, 국내외 표준화 동향

IT거버넌스, CoBIT

IT 및 정보화 관련 표준, 국내외 표준화 동향

TRM, BRM, SRM, DRM EA관련 ITA

SLA/SLM, 아웃소싱 등

정보화감리 관련 법/제도

전자정부법, 감리기준 등 정보화/SI 관련 법령

소프트웨어 사업대가기준, 소프트웨어 분리발주가이드, 전자정부서비스 호환성 준수지침, 전자정부 서비스연계표준 지침, 행정정보 DB 표준화 지침, 정보시스템구축운영 기술지침, 행정기관 정보화사업 가이드 등

감리지침 및 관련 기술

감리점검체계 및 감리지침 주요 내용

감리 방법론 , 감리 기법 및 도구

위험 분석 및 관리 기법

조직 관리론

조직구조, 조직이론, 조직설계

프로젝트관리 : 품질, 인적 자원관리

프로젝트관리

범위/일정/위험/형상/기성/비용 관리 등

S/W

공학

객체지향 및

컴포넌트 기술

UML, 컴포넌트 관련기술(인터페이스,재활용 등)

디자인 패턴

MVC 모델 등

프로세스 품질

CMM, SPICE

비용 산정

기능점수, LOC

정보화관련 표준

IT 및 정보화 관련 표준, 국내외 표준화 동향

개발방법론

UML, 정보공학, Agile, 객체지향, 패키지, CBD

프로토타이핑 등 기법 및 도구

프로그래밍

언어

프로그래밍언어이론, 프로그래밍언어(Java, Ajax, C, XML ), 프로그래밍 환경

시스템 테스트

단위, 모듈, 연계, 통합, 시스템, 성능, 인수 등

사용자

인터페이스

인터페이스의 본질, 휴먼-컴퓨터 인터페이스와 상호작용, 인간의 능력과 특성, 컴퓨터 입출력 장치와 상호작용, 상호작용과 인간공학, 상호작용 시스템 개발, 웹 디자인과 HCI, 상호작용 시스템의 평가 , HCI에 대한 국내외 표준, 웹접근성 등

유지보수

SW분석설계

데이터

베이스

자료구조론

자료 관리론, 자료 구조론

데이터마이닝

데이터마이닝

데이터베이스 개념

데이터베이스시스템 개념, 데이터베이스 이론

관계형DB 지식

데이터 모델의 개념, 논리/물리 데이터베이스 설계, 데이터베이스 운영

객체지향DB 지식

객체지향 데이터베이스의 개념, 객체 데이터베이스 모델링, 객체 데이터베이스 설계

DB관련 기술

DB 성능(튜닝), 데이터 백업 등

상용 DBMS 지식

RDBMS, ORDBMS, OODBMS

인터넷 정보처리

전자상거래, 정보검색, 웹기반정보시스템, 멀티미디어

웹 관련 기술(시멘틱 웹, 2.0, 웹서비스, Open API)

경영기반기술

SCM, CRM, DW, BPM, ERP

시스템

구조

아키텍처

설계

S/W 아키텍처(웹기반기술구조, J2EE, 닷넷 등 개발 플랫폼, 분산컴포넌트 기술 등)

하드웨어 아키텍처(이중화, 고가용성, 원격 백업기술 등)

네트워크 아키텍처(이중화, L4/L3 스위치 등)

응용 기술

XML, 시스템간 연계(EAI), 개발언어, 스크립트 등

시스템성능/

용량산정

시스템 성능:부하 분산, 최적화, 용량산정 등

컴퓨터

시스템

분산시스템, 실시간 시스템, 시스템 모델링 및 성능분석

시스템소프트웨어(운영체제 등)

통신시스템

무선통신, 유선통신, 컴퓨터 통신/멀티미디어통신, 이동통신/위성통신, 광통신, 데이터 통신/부가통신, 영상통신/화상통신, 광대역 통신

네트워크

N/W 구조 및 설계(이중화, 스위칭 이론, IPV6 )

N/W 관리

N/W 장비(라우터, 스위치, 허브 등)

N/W 기술(홈네트워크, WPAN, BcN, IPTV, Wibro, HSDPA )

기타 신기술

유비쿼터스 관련 기술(RFID/USN, u-City )

컴퓨팅 기술(Green IT, 클라우드/그리드 컴퓨팅 등)

모바일 컴퓨팅

보안

보안기술

암호학(암호알고리즘, 해쉬함수, 전자서명, 인증, 키 관리, PKI )

보안 프로토콜(SSL, Kerberos, IPSec, SET, PGP, S-MIME )

응용보안(DB, WEB보안/OWASP, SSO, EAM, DRM )

N/W 보안(F/W, DMZ, IDS, IPS, VPN, NAC, Anti-Virus )

최신 보안 관련 기술, 해킹 등 보안 이슈

보안관리

정보보호 관리체계(ISO 27000 시리즈, KISA ISMS 인증 등)

보안정책, 위험관리, 위험분석

요소별(서버, DB, 응용, 네트워크, 단말기)보안관리

업무연속성 관리(업무영향평가, 비상계획, 재해복구, 백업 등)

개인정보보호제도, 보호조치, 관리체계 등

최신 보안 관리 동향 및 관련 법규

1336658717_2012년도 감리사 자격검정 안내문.hwp

2012년(제13회) 정보시스템 감리사 자격검정 시행공고
번호 190
글쓴이 : 관리자
날자 : 2012-05-10 15:34:30.0
조회수 : 95
2012년도 감리사 자격검정 안내문.hwp(28 KByte), 다운로드 : 106

한국정보화진흥원은 2012년도 국가공인 정보시스템감리사 자격검정 시행계획을 다음과 같이 공고합니다.


⊙ 원서접수 : 2012. 6. 5(화) 09:00 ~ 6. 14(목) 18:00 (마감시간 이후 접수불가)
- 필기시험 수수료 : 125,000원 (무통장 입금 : 하나 404-097848-04004, 한국정보화진흥원)
- 접수방법 : 감리사 홈페이지(auditor.nia.or.kr)에서 직접 입력

⊙ 필기시험 : 2012. 7. 14(토) 14:00 (14:00 이후 입실 불가)
- 과목 : 감리 및 사업관리, 소프트웨어 공학, 데이터베이스론, 시스템구조, 보안(객관식 120문제 4지 선다형, 시험 시간 120분)
- 장소 : 덕수고등학교(성동구 행당동) 예정, 추후 확정공지

⊙ 필기시험 이후의 주요 일정
- 가답안 공개 및 이의신청 : 2012. 7. 17(화) 10:00 ~ 7. 23(월) 13:00
- 필기시험 합격자 발표 : 2012. 8. 31(금) 10:00
※ 상기 일정은 변경될 수 있으며, 변경 시 감리사 홈페이지에 재공지함
※ 필기시험 합격자의 경우, 9월 ~ 11월까지 면접, 이론 및 실습교육이 예정되어 있음

◈ 유의사항
① 세부사항은 반드시 검정안내문(첨부파일)을 통해 확인하시기 바랍니다.
② 기타 사항은 02-2131-0437(auditor@nia.or.kr)로 문의 바랍니다.

2012. 5. 10

한국정보화진흥원장

+ Recent posts