리눅스 서버를 한글로 설치하고 SecureCRT를 사용하여 접속해 보면 한글이 깨져보입니다.

사용자 삽입 이미지


Posted by 양형

댓글을 달아 주세요

CSV file 이란

용어사전 2015. 12. 30. 17:56

CSV file (comma-separated values file)

컴퓨터에서 CSV[씨에스뷔] 파일이란, 각 항목의 값들이 컴마에 의해 분리되는 일련의 아스키 텍스트 라인들로 구성되며, 레코드간의 구분은 "줄 바꿈"(new line)으로 구분된다.

아래에 있는 것은 CSV 파일 내용의 예이다 (성명, 전화번호, 그리고 소속학과 등 3개의 항목을 갖는 레코드들로 구성된 파일로서, 각 항목 간에는 콤마로 구분되고, 레코드와 레코드 간에는 줄이 바뀜으로써 구분된다).

나보리,944-7077,전자계산학과
이주원,710-4221,국어국문학과
임영옥,321-6688,약학과

CSV 파일은 어떤 테이블로부터 데이터를 추출한 다음, 관계형 데이터베이스 형태를 띠는 테이블 위주의 응용프로그램 데이터로 쉽게 이용할 수 있는 길을 제공한다. 스프레드시트 프로그램의 선두주자인 마이크로소프트 엑셀 같은 프로그램은 CSV 파일을 잘 읽어들일 수 있다.

CSV 파일을 때로는, "플랫 파일"이라고 부르기도 한다. 


'용어사전' 카테고리의 다른 글

CSV file 이란  (0) 2015.12.30
API의 정의  (0) 2015.12.29
ORM(Object Relational Mapping) 이란?  (0) 2014.12.02
sorting  (0) 2014.11.19
클러스터링(clustering)  (0) 2014.11.19
RDBMS  (0) 2014.11.19
Posted by 양형

댓글을 달아 주세요

ETL이란?

기타등등;; 2015. 12. 30. 17:24

http://www.innoquartz.com/etl_introduction/24291 

Posted by 양형

댓글을 달아 주세요

포트포워딩

Network 2015. 12. 30. 17:16

IPTIME 공유기 고급설정의 꽃인 포트포워딩을 해보겠습니다.


하나의 공인 IP를 여러 사설 IP로 나눠쓰는 공유기에서


외부에서 특정 사설 IP로 접속하기 위해서는


포트포워드 설정이 필수 입니다.


흔히 포트포워딩이라고 하고도 하는데


뭐 하여튼.


그냥 뭐 간단하게 시작합니다.





IPTIME 공유기 고급 설정 - NAT/라우터 관리 - 포트포워드 설정 메뉴의 모습입니다.

(저는 뭐 많이도 포워딩 걸어놨네요)


여기서 지난 번 포스팅 때 마지막 부분에서 언급했던 수동 IP 설정이

왜 필요한지 느낌이 오실 겁니다. 포트 포워딩하는데 사설 IP의 값이 계속 바뀐다면

바뀔 때 마다 포트포워드 설정을 계속 해줘야 겠죠?

(2014/02/24 - [IT를만나다/내맘대로IT탐구] - IPTIME 공유기 고급설정 파헤치기 02 : 네트워크 관리)


근데 외부포트, 내부포트 뭐 골치아픈 개념도 있고


그냥 지나치기에는 뭔가 아쉬우니 간단한 그림으로 짚고 넘어갑시다.





공유기는 하나의 주소를 가집니다.


어차피 포트라는 개념이 하나의 아이피로 어떤 접속이 이루어 졌을 때


이 접속이 뭐할려고 접속했는지 구분하기 위해서 쓰이는 개념이라


사설 IP의 구분에도 쓰입니다. 그 예가 위의 그림입니다.


외부에서 80번 포트로 접근했다!! 근데 설정에서 내부의 PC1 80 포트로 보내란다!!


외부에서 1234번 포트로 접근했다!! 근데 설정에서 내부의 PC2 3389 포트로 보내란다!!


이런 개념이 포트를 포워딩 하는 포트포워드 개념입니다.



하여튼 이제 좀 느낌이 왔으면 실제로 설정해봅시다.


우선 설정을 위해 포워딩 받을 PC의 IP를 확인합시다.


명령 프롬프트 창을 열어(실행 - cmd) ipconfig 명령을 날려주면


이더넷 어댑터 로컬 영역 연결 에서 IPv4 주소를 확인 가능합니다.




여기서 확인한 IP 주소를 바탕으로


그냥 설정에 추가해주면 됩니다.



예제로 외부의 1234 포트로 들어온 놈을 192.168.0.254의 80으로 포워딩하게 설정하려면



이러한 느낌입니다.


안 어렵죠?







근데 여기서 부터는 초큼 어려운 심화 과정입니다.


VMware를 사용해 가상화 머신으로 포워딩 하고 싶으싶거나 

+

방화벽 설정까지 해야겠다 싶으면 보세여



일단 아까 위에서 발로 그린 그림을 재탕합시다.





공유기로 연결된 PC는 한대이고 그 PC안에 가상화 OS가 돌아가는 모양입니다.


공유기의 IP(게이트웨이)는 192.168.0.1

호스트 OS의 아이피는 192.168.0.10

VM 가상화 OS의 아이피는 192.168.0.20 과 30으로 설정되었다고 칩시다.

(VM 네트워크 모드는 브릿지로 설정되었다고 가정합니다.

공유기 쓰는데 네트워크 모드 NAT까지 설정되면 좀 골치아픔)


외부에서 세 개의 접근을 요청합니다.

하나는 80번 포트 하나는 1234 포트 하나는 65535 포트입니다.



그런데 PC 쪽의 방화벽에서 80번과 1234번 포트만 열려있고


65535번 포트는 열려있지 않은 상태라면




이렇게 80과 1234 포트만 방화벽을 통과하고 1

234 포트는 방화벽에서 막히게 됩니다.



포트포워드 설정에서 80번 포트는 192.168.0.10 의 80번 포트로,

1234번 포트는 192.168.0.30의 23번 포트로 떨어지게 설정되어 있다면




이렇게 떨어지게 됩니다. 

VM 사용자들은 이러한 느낌을 고려해서 포트포워드 설정하시기 바랍니다.


+


어차피 VM도 호스트 OS(Windows) 내부에서 돌아가기 때문에 포트포워딩으로 

가상화 OS쪽으로 가도록 설정했어도 호스트 OS의 방화벽을 거칩니다.


윈도우즈 방화벽에서 특정 포트를 예외처리 해봅시다.


윈도우 7 기준 고급 보안이 포함된 Windows 방화벽에 들어갑시다.




그럼 아래와 같은 창이 뜨는데 왼쪽의 인바운드 규칙을 눌러보면


아래와 같이 현재 방화벽에 설정된 포트 규칙 설정들을 볼 수 있습니다.


새로운 규칙을 추가하기위해 오른쪽의 새 규칙을 눌러여




그럼 밑의 창이 뜰텐데


옵션에서 포트를 선택하고




아래 화면이 나오면 TCP / UDP를 선택하고 (왠만하면 TCP 일거임)


새로운 규칙에 적용할 포트번호를 넣읍시다.

(포트를 범위로 지정하려면 x-x 형태로)





그리고 연결에 관한 옵션이 나오는데


모든 연결을 허용할 것이냐, 보안 연결만 허용할 것이냐, 연결 차단할 것이냐 물어볼거임


연결 허용할려고 하니깐 연결 허용, 보안 연결만 허용 둘 중의 하나를 선택해야하는데


보연 연결만 허용을 하면 IPsec 연결이나 ssh 연결 밖에 안되니깐 왠만하면 그냥 연결 허용




다음으로 나오는 놈은 네트워크 위치, 혹은 도메인에 따른 연결 허용 여부인데


잘 모르겠으면 그냥 다 체크




그리고 간다한게 이름을 넣어주고 마침을 클릭하면




요로코롬 새로운 규칙이 생성되었음.


이제 7777포트로 들어오는 접근은 OS에서 제한하지 않음


즉 외부에서 7777 포트로 접근하고 VM에서 특정 포트로 접근 받을 수 있음

'Network' 카테고리의 다른 글

포트포워딩  (0) 2015.12.30
Posted by 양형

댓글을 달아 주세요

API의 정의

용어사전 2015. 12. 29. 11:38

API의 정의

API가 무엇인지 다들 알고 있지만, 그렇다고 해서 똑 부러지게 “이거다.”라고 이야기하는 사람도 없지요.
그 이유는 API라는 용어가 포괄적으로 사용되어지고 있기 때문이 아닐까 싶습니다. Wikipedia의 내용을 번역하여, 내용의 이해를 돕고자 합니다.

api1

※ 원문 : http://en.wikipedia.org/wiki/Application_programming_interface

API?

Application Programmable Interface a source code based specification intended to be used as an interface by software components to communicate with each other. An API may include specifications for routines, data structures, object classes, and variables. (wiki)

“소프트웨어 컴포넌트 간의 커뮤니케이션 인터페이스로 사용되어지기 위한, Spec에 기반한 소스코드.”

API 는 Object Class나 변수, 데이터 스트럭쳐, 루틴 등을 위한 Spec 을 포함할 수도 있다.
API Spec은 Posix(Portable Operating System Interfaces)와 같은 International Standard 이거나, MS Window API와 같은 vendor documentation 이거나, 프로그래밍 언어의 library일 수도 있다.
API 는 바이너리가 아니라소스코드라는 점에서 ABI(Application Binary Interface) 와는 다르다.
예를 들면 POSIX는 API이고, Linux Standard Base는 ABI 이다.

  1. 사용되어진 언어에 따라
    • API는 language-dependent 할 수 있다.
    • 즉, 특정 언어의 구성요소나 문장 속에서만 유효하다.
      대신 API를 사용하기 더 쉽게 만들 수 있다.

    • API는 language-independent 할 수 있다.
    • 여러 개의 프로그램 언어로 호출될 수 있도록 개발 되어졌다는 뜻이다.
      이것은 특정 프로세스나 시스템에 한정되어지지 않도록 하는 Service Oriented API의 특징이다.
      Remote procedure call 이나 web service 형태로 제공되어지기도 한다.
      예를 들면, 레스토랑을 찾는 웹사이트가 구글맵 API를 이용할 수도 있다.
      구글맵의 API는 3rd party 사이트가 어떤 정보를 사용할 수 있는지, 어떻게 그것을 이용할 수 있는지까지 지원한다.

    “API라는 용어는 완전한 인터페이스나 단일 fuction이나 어떤 조직에 의해 제공되어진 API set을 지칭할수도 있다.
    그래서, 그 의미가 일반적으로 사용되어지는 문맥 속에서 결정되어진다.”

  2. 상세 설명
  3. API 는 특정한 task 가 수행되어지는 방법을 표현할 수 있다.
    C 와 같은 “procedural languages”에서는 통상적으로 함수호출을 통해 acction이 일어난다.
    그래서, C에서는 function/routine 의 description 들을 API 라고 부른다.
    예를 들면, math.h는 libm에 있는 수학함수의 definition을 포함하고 있는데, 이 파일은 라이브러리에 포함되어진 함수들의 사용법을 기술하고 있다.
    사용법 등이 사람들이 훨씬 읽기 쉬운 포맷으로 작성되어져 있다.
    그래서 C에서는 math.h와 같은 라이브러리를 API라고 부른다.

  4. 객체지향 언어에서의 API
  5. 객체지향언어에서 API 는 class definition 의 “behaviors”와 “description” 을 포함한다.
    behaviors 는 class로부터 도출되어진 object 가 주어진 환경에서 어떻게 동작할 것인가를 나타내는 것이다.
    추상화된 컨셉은 method로 구현되어진 class에 의해 표출된 실제 기능과도 관련되어 있거나 fields나 constants 와 같이 공개적으로 만들어진 internal entity 을 포함하고 있기도 하다.
    이 경우 API는 class에 의해 표출된 공개 method 전부라고 할 수도 있다.
    즉, API 는 class definition으로부터 도출되어진 object 를 다루거나 상호 작용하는 method라고 말할 수 있다.
    활용은 public methods를 통해 실행된다.
    즉, method는 behavior가 어떻게 동작하는지를 보여주는 세밀한 기술단위이다.
    예를 들면, stack class 가 단순히 push()와 pop() 두 개의 method을 노출시킬 수 있다.
    이 경우 API 는 pop()과 push()이다.

  6. API library와 framework
    • API는 일반적으로 software library로도 불려진다.
    • API 는 library가 구현되었을 때 나타나는 action들을 기술하고 정의하는 것이다.
      단일 API 는 여러개의 implementation을 포함할 수도 있거나, 아니면 없거나, 그냥 추상적인 상태로 있을 수도 있다.
      그리고, 같은 프로그래밍 인터페이스를 공휴하는 다른 library 들로도 보일 수 있다.

    • API 는 software framework 이라고 불리기도 한다.
    • framework 이란 여러 개의 API 를 구현하는 여러 개의 library 에 기반할 수도 있다.
      그러나, API 의 일반적인 사용법과는 달리 framework 내에 구현되어진 behavior는 framework 내의 새로운 class 로 컨텐츠를 확장시킴으로써 사용할 수 있게 된다.
      더구나 전반적인 프로그램 흐름의 컨트롤은 caller의 영역 밖이다.
      컨트롤 흐름을 바꾸거나 유사한 메커니즘으로 프레임웍의 통제 하에 있다.

  7. API &protocols
  8. API 는 프로토콜의 구현이기도 하다.
    일반적으로 API와 프로토콜의 차이점은, 프로토콜은 통상적인 전송에서 request 와 response 를 교환하는 표준화된 방법을 정의하고, 메시지 표준을 정의하는 것을 말한다.
    반면, API 는 일반적으로 직접 사용되어지는 라이브러리로 구현되어진다.
    따라서, transport 가 포함되어지지 않을 수 있다.
    오히려 특정 언어의 데이터나 function call 을 통한 간단한 정보 교환일 수 있다.
    API 로 프로토콜을 구현할 때, 통신 프로토콜에 의존하는 remote invocation을 위한 proxy method에 기반할 수 있다.
    API의 역할은 정확히 transport 프로토콜의 세부내용을 숨기는 것일 수 있다.
    프로토콜은 일반적으로 다른 기술 사이에서 사용되어진다.
    일반적으로 서로 다른 기술이 정보공유를 할 수 있게 한다.
    즉, 두 세계의 추상화된 레벨로서 작동한다. 반면, API 는 특정 기술에 특화되어 있다.
    따라서, 특정 언어로 만들어진 API 는 다른 언어에서는 사용될 수 없다. (물론 wrapping 을 통해 사용되어지기도 한다.)

  9. Object API &protocol
  10. 객체 지향 API 는 특정 객체 교환포맷을 말한다.
    이 프로토콜은 remote system으로 메시지 안에 있는 동일한 종류의 정보를 전송하는 방법을 정의한다.
    object 메시지가 두개의 다른 플랫폼 사이에서 프로토콜로 사용되어지기도 한다.
    한 언어 안의 object 는 다른 언어 의 object로 전송되어진다.
    예를 들면 Java 프로그램은 C#으로 만들어진 SOAP, IIOP를 통해 서비스를 부른다.
    두 프로그램은 상호 call을 위해 메모리상의 object를 가지고 convert할 수 있도록 API를 사용한다.
    유사한 object가 API를 통해 하나의 머신으로 전달되어질 때 메모리 상에서 처리하는게 효과적일 때도 있다.

  11. Web API
  12. 웹 개발이라는 관점에서 API 는 http 프로토콜의 집합(XML, JSON 등) 으로 정의되어진다.
    WebAPI는 가상적으로는 웹서비스와 동의어다.
    최근 트렌드는 SOAP 기반 서비스에서 REST 기반의 직접 통신으로 바뀌고 있다.
    Web API 는 mashup이라고 알려진 새로운 어플리케이션으로 복합 서비스의 조합들을 허락하고 있다.

  13. API sharing and reuse on Virtual machine
  14. 가상 머신에서 실행되어진다면 그 언어들은 API 들을 공유할 수도 있다.
    이 경우 특정 언어로부터 도출된 가상머신의 공통분모가 중간 bytecode나 language binding을 통해 언어간 상호작용(API sharing)을 가능하게 한다.
    이런 관점은 존재하는 모든 라이브러리나 관련된 API 들에 대한 재사용성을 극대화 한다.

  15. 배포정책
  16. 두 개의 옵션이 있다.

    • Private API 예를 들면, Sony는 Official Playstation 2 API를 허가된 Playstation 개발자들에게만 배포하곤 했다.
    • 이것은 회사가 품질관리를 할 수 있게 하고, 라이센스를 통한 R/S를 가능하게 한다.

    • Public API (=Open API) Apple 은 API를 Carbon 과 Cocoa로 배포했다.
    • 이렇게 소프트웨어가 특정 플랫폼을 위해 사용되도록 할 수도 있다.


'용어사전' 카테고리의 다른 글

CSV file 이란  (0) 2015.12.30
API의 정의  (0) 2015.12.29
ORM(Object Relational Mapping) 이란?  (0) 2014.12.02
sorting  (0) 2014.11.19
클러스터링(clustering)  (0) 2014.11.19
RDBMS  (0) 2014.11.19
Posted by 양형

댓글을 달아 주세요

Jenkins

CI 2015. 12. 17. 14:26

상황!

#1 Windows 

MS Visual Studio를 이용하여 개발하고 Native C++, C# 프로젝트가 있다. 이 프로젝트들은 Windows Server에서 운영된다. 유닛테스트 프레임워크로 boost test를 사용한다. 추가적으로 Python으로 작성된 스크립트를 이용해 몇몇 데이터를 변환해서 배포전에 수행해야 한다. 프로젝트에 따라서는 SVN에서 몇몇 리소스를 받아 DB에 저장하는 단계가 포함 된다.


#2 Linux 

Spring framework + Junit 을 이용해 개발하는 Application Server가 있으며 Cent OS(Linux)에서 운영된다. maven을 이용해서 test, deploy 를 수행한다.


#3 Unity for android, ios

유니티 프로젝트를 수행할 경우 안드로이드 빌드와 ios빌드, 빠른 테스트를 위해 PC버젼까지 빌드해야 한다.


모든 소스는 SVN을 저장소로 이용하고 있으며, 개별 빌드와 배포를 수동으로 하면 1시간 이상이 소요된다. 사람이 하기에 가끔씩 배포시 단계를 빼먹고 난감한 상황이 연출 될 때도 있다.


요약> 여러환경에서 개발되고, 다양한 환경에 배포를 해야되는 상황에서 빌드, 배포 과정에서 사람의 실수가 발생 할 수 있다.



우리에게 필요한건 CI!

일반적으로 빌드하면 컴파일, 링크만 생각하기도 하는데 좀 더 큰 범주에서 생각해보자. 우리가 하고자 하는건 어떠한 코드를 작성하고 최종적으로 본인이 사용하던지, 서비스로서 타인에게 제공되기도 한다. 이런 환경에서 빌드를 하게 되면 테스트를 진행한 후 배포를 하게 된다. 물론 사람이 손으로 일일이 하는 경우도 있을것이고, test framework을 도입해서 자동화 했을 수도 있다. 어쨌든 컴파일에러가 없다고 배포를 해도 된다는 위험한 발상을 가지지는 않을 것이다. 지금은 unit test, regression test 등 test 에 대한 내용은 아니기에 자세한 내용은 생략한다. 


여튼 요구사항의 변경, 리펙토링, 신규 투입인력의 잘못된 사용으로 인한 에러등 무수히 많은 상황에서 빌드가 깨지기도 하고, 테스트가 실패하기도 하는데 이를 자동화 해서 적정시점에 알려줄 수 있다면? 그리고 우리는 빌드를 위해 키보드에서 손놓고 커피타임과 담배타임으로 업무시간을 뺏기지 않고 칼퇴근을 이룩할 수 있다면 이보다 더 좋은것이 어디 있겠는가?! 


요약> 품질과 안정성을 위해 빌드와 테스트를 자동화하면 칼퇴근 확률을 높일 수 있다.



Jenkins?


Cruise Control.Net, Hudson, jenkins 결국 다 빌드를 자동화 하자는게 핵심이다. 근데 CC.Net은 설정이 너무 복잡하다. 6년전쯤으로 기억되는데 프로젝트 4개정도에 CC.Net을 도입하는데 1주일 정도가 소요되고 불의의 사고로 서버가 죽었는데(HW문제), 그 뒤로는 해당프로젝트에서 환경구축을 하지 않았다. 너무 귀찮다는 느낌이 강하다. Hudson 개발자들이 나와서 jenkins를 만들었다고 하니 jenkins 1표! 장점은 웹에서 모든 설정을 다 할 수 있고, 설정이 간편하다. 그리고 다양한 플러그인을 통해 왠만한건 다 할 수 있다. 



빠르게 시작하기!


http://jenkins-ci.org/


웹서버가 구축되어 있다면 war 파일 다운로드 받아서 사용하면 된다. 웹서버가 구축되어 있지 않더라도 war 파일을 독립적으로 실행 할 수 있다.

  java -jar jenkins.war --httpPort=8080

위의 방식으로 실행한 뒤 웹 브라우져에서 http://localhost:8080/jenkins 로 접속하면 바로 화면을 볼 수 있다.


각 OS에 맞게 설치패키지를 다운받아서 사용 할 수도 있다. 개발용 windows server가 한대 있어서 windows native package를 다운로드 받아서 설치 했다.

설치시 경로는 되도록 빈칸을 빼고 설치하기를 권장한다. 몇몇 플러그인이나 빌드 환경에 따라서 파일을 못 읽어오는 경우도 있다. (특히 윈도우!)

그래서, 깔끔하게 C:\Jenkins에 설치했다.


환경설정

설치가 완료되었으면 기본적으로 플러그인 몇개를 깔아줘야 한다. MSBuild, Subversion, xUnit plugin 이다. 



필터에 방금 언급한 플러그인 이름을 넣으면 잘 걸러서 보여준다. 앞에 체크 박스를 선택하고 제일 하단에 "재시작 없이 설치하기"를 누르면 설치된다.  

이제 설치된 플러그인에 맞는 정보와 각종 환경 설정을 할 차례다.


Jenkins 관리 - 시스템 설정에 들어가면 뭐가 많이 보인다. 자바를 사용한다면 Maven, JDK, Ant 등의 정보를 넣고 MSBuild에 경로 정보를 ... 이렇게 말하면 너무 귀차니즘에 차있는거 같으니, 그냥 이미지로 보자. ㅡㅡ;

JDK는 대부분 JDK_HOME 등의 정보로 자동으로 되긴 하지만, JDK를 여러개 사용하는 관계로 경로를 지정해주었다. MSBuild는 자동으로 안되고 해당 경로에 MSBuild가 있는지 확인해야 한다. 64비트 빌드시에도 Framework64를 사용하지 않고 Framework 경로를 사용한다는것에 유의한다.



Maven 경로도 수동으로 적어줘야 한다. Jenkins Location 정보는 현재 사용되는 서버 주소와 jenkins에서 빌드가 깨졌을 때 메일을 보내줄때 sender의 메일 주소를 적어주면 된다. 넣어줘야 메일 필터링 하기가 좋다. (실제 계정은 없어도 무관하다.) E-mail로 알려줌 SMTP 서버 정보를 넣어준다.  SMTP설정이 제대로 되었는지 확인하기 위해서Test Configuration by sending test e-mail 체크를 하고 Test e-mail recipient에 메일 주소를 넣어주고 Test configuration을  선택해서 메일이 잘 오는지 확인한다. 잘온다. 그럼 된것이다. 저장하고 마무리!


보안설정

안그래도 은행권, 통신사 보안 얘기가 빵빵 터지는 지금의 상황에서, 우리도 보안에 관심을 가지자... 라고 하는것은 아니고. 최소한 외부에서 접근가능한 서버라면 해줄 필요가 있겠다.

보안설정이라고 복잡할 것이 없다. Jenkins 관리 - Configure Global Security 에 들어가보자. 보안 사용을 선택해주고 사용자 가입을 허용 해주고, 계정을 추가하고, 권한을 주면 된다. 



맺음말

글로 쓰니 길어보이지만 실제 셋팅에 걸리는 시간은 10분도 안걸린다. 실제 item 추가 방법에 대해서는 다음에... 오랜만에 포스팅을 하자니 은근 피곤하다. jenkins 설정과 관련해 검색해보면 많이 나오지만 OS에 따라서 환경변수도 다르고, 실제 사용된 값이 적혀있었다면 좀 더 쉽게 했을텐데 하는 아쉬움에 포스팅을 하게됐다.


현재 셋팅된 프로젝트를 한번 찍어봤다. 하나의 프로젝트에 비가오고 있다. 나의 마음 같구나~ ㅠㅠ 


'CI' 카테고리의 다른 글

Jenkins  (0) 2015.12.17
Posted by 양형

댓글을 달아 주세요

수정화면을 개발시 읽을 수만 있고 변경을 못 하도록 할때 일반적으로

<input type="text" name="title" readonly> 처리를 한다.

그런데 체크박스/라디오버튼/Select는 readonly 프로퍼티가 먹지 않는다.

다른 방법은 disabled ( 예:<select name="jobtype" disabled> )

인데 이건 안타깝게도 처리화면으로 값을 넘기지 못한다.


그리고 readonly와 disabled의 차이는...

헤당 필드의 값을 넘겨주냐 안주냐의 차이이다... 

disabled로 처리하고 히든으로 다른 값을 보내서 처리하면 readonly 효과를 낼 수 있다.

아래 소스를 보고 느낌만 보시라... th: 이런건 그냥 무시하자 타임리프 문법이다.



checkbox도 disabled 처리를 하면 동일한 문제가 발생하는데.. onclick="return false;"로 처리하면 된다고 하네요

제가 상황과 맞지 않아서 이건 패스...

Posted by 양형

댓글을 달아 주세요

Cache vs Cookies: 웹브라우저 캐시와 쿠키의 차이 점

Cache와 Cookies는 특정 웹사이트의 접속 속도 개선을 위해 클라이언트의 컴퓨터에 임시로 저장되어 있는 데이터란 개념은 같지만 아래와 같은 다른 점들이 있습니다.

Cookies란?
Cookies란 넷스케이프의 Netscape Navigator란 자사의 웹브라이저를 통해 소개된 기술로 특정 웹페이지에 대한 유저의 행동 패턴을 주로 저장하는 작은 사이즈의 텍스트 파일입니다. 주로 저장되는 정보로는 특정 웹사이트나 웹페이지에 얼마나 자주 또는 몇 번 방문했는지 그리고 특정 배너를 클릭을 했는지 했으면 얼마나 자주 했는지 검색 시 어떤 키워드를 사용했는지 등의 정보들입니다. 또한 웹서버 쪽에서 유저를 식별하기 위한 Session Tracking의 방법으로 사용되기도 합니다. Cookies 정보는 오직 그 Cookies를 작성한 웹서버만이 Access 가능하며 대부분의 Cookies는 Expiration Date (사용기한)이 정해져 있어서 기한이 만료되면 자동으로 삭제됩니다. 

Cache란?

Cache란 웹페이지 Resource 파일들 (오디오, 비디오, 이미지 등)의 임시 저장소로 다음에 같은 웹페이지 (또는 웹사이트) 접속 시 페이지 로딩 속도를 개선해주는 역할을 합니다. 

차이점
1. 유저의 컴퓨터에 임시로 저장되어 있는 점은 같지만 사용 목적은 위에 이야기한 것 처럼 다릅니다.
2. Cache는 오직 웹페이지 로딩 속도 개선을 위해서만 사용되지만 Cookies는 유저 관련된 여러가지 다른 목적으로 사용 가능합니다.
3. Cache는 오디오, 비디오, 이미지 등의 Resource 파일등을 주로 저장하는 반면에 Cookies는 User preference (유저가 웹사이트 접속 시 하는 행동 패턴 또는 관련 정보) 위주의 정보를 저장합니다.
4. 보통 Cache는 유저가 삭제할 때까지 유저의 컴퓨터에 저장되지만 Cookies는 서버 쪽에서 설정한 기간이 지나면 자동으로 삭제됩니다.
5. Cookies는 웹서버의 Access가  가능한 반면에 Cache는 Access가 불가능합니다. (사실 Access를 해야할 이유도 없지만요)


Posted by 양형

댓글을 달아 주세요

캐시란 무엇인가

IT[innotree] 2015. 12. 16. 19:56

컴퓨터 사양을 보거나, 컴퓨터를 설정하다 보면 캐시라는 말이 종종 나온다. 재미있는 개념이면서 또 성능에 큰 영향을 주기 때문에 이번 호에서는 캐시가 무엇인지에 대해 알아보려고 한다.

캐시를 이해하기 위해 비유를 들어 보겠다. 책이 많이 있는 도서실에서 참고 자료를 찾아 보면서 글을 쓰는 상황을 생각해 보자. 책이 책꽂이에 잘 정리되어 있기는 하지만, 책상에 앉아서 글을 쓰다가 책꽂이에 가서 필요한 책을 찾아오는 데는 꽤 시간이 걸린다. 따라서 무언가 참고할 것이 있어서 책을 한번 찾아오면, 필요한 내용을 본 뒤에 바로 책꽂이에 다시 갖다 꽂지 않고 책상 위에 놓아두는 것이 훨씬 편리하다. 잠시 후 같은 책을 다시 참고할 일이 생길 가능성이 크기 때문이다. 물론 책상의 넓이가 한정되어 있기 때문에 무한정 책을 가져다 놓을 수는 없다. 책상이 너무 비좁아지면 앞으로 비교적 덜 필요할 것 같은 책은 다시 책꽂이에 갖다둬야 한다.

책상 : 책꽂이 = 캐쉬 : 하드디스크

여기서 주목해야 할 사실이 있다.

첫째로 책꽂이와 책상이라는, 성격이 다른 두 가지 저장 장소가 있다는 점이다. 책꽂이는 용량이 큰 대신 시간이 많이 걸리고, 책상은 빨리 찾아볼 수 있는 대신 용량이 작다. 둘째는 한번 본 책은 앞으로 다시 보게 될 가능성이 크다는 점이다. 만약 그렇지 않다면 한번 본 책을 책상 위에 놓아 둘 필요는 없는 것이다.

캐시는 컴퓨터의 기억장치에 관련된 기술이다. 책꽂이와 책상의 비유에서와 마찬가지로, 컴퓨터에 있는 여러 기억장치들도 그 속도와 용량이 각각 다르다. 하드디스크는 용량이 아주 크지만 속도가 느리고, 메인 메모리(RAM)의 용량은 하드디스크의 백 분의 1 정도로 작지만 속도는 십만 배 정도로 빠르다. 또 CPU에 들어 있는 캐시 메모리는(그냥 캐시라고 하면 보통 이것을 말한다) 메인 메모리의 백 분의 1 정도 용량이지만 속도는 훨씬 빠르다. 즉 기억장치들은 피라미드 모양의 계층 구조를 이루고 있어서, 위쪽은 용량이 작은 대신 속도가 크고, 아래쪽은 용량이 크면서 속도는 느리다.

캐시는 이와 같이 속도가 느린 기억장치와 속도가 빠른 기억장치가 있을 때, 빠른 기억장치에 느린 기억장치의 내용 중 최근에 사용한 일부를 넣어 두는 것을 말한다. 이렇게 하면 같은 내용을 여러 번 참조할 때, 두 번째부터는 빠른 속도로 읽어들일 수 있다.

예를 들어 하드디스크와 메인 메모리의 경우를 생각해 보자. 최근에 나오는 디스크의 용량은 수십에서 수백 기가바이트에 이르지만, 특정한 짧은 시간 동안을 생각해 보면 디스크 안의 내용이 모두 필요한 것은 아니다. 일반적인 경우 전체 디스크의 용량 중에서 극히 일부만을 사용하게 된다. 따라서 이 부분을 하드디스크보다 훨씬 빠른 메인 메모리에 넣어 두면, 번번이 하드디스크를 읽고 쓰는 것보다 훨씬 빠르게 작업할 수 있는 것이다.

하드디스크를 한 번 읽거나 쓰는 데 백 분의 1초 정도의 시간이 걸리지만, 메인 메모리는 천만 분의 1초밖에 걸리지 않는다. 따라서 메모리 용량이 모자라면 하드디스크를 읽고 쓰는 일이 많아지고 컴퓨터의 속도가 급격히 느려지게 되므로, 컴퓨터를 업그레이드할 때 가장 먼저 살펴볼 것은 메모리 용량이 충분한가이다.

읽기 캐쉬와 쓰기 캐쉬

캐시에는 읽기 캐시와 쓰기 캐시가 있다. 읽기 캐시는 한번 읽어들인 내용을 캐시에 저장해 두었다가 다음에 읽을 때 사용하는 것이고, 쓰기 캐시는 데이터를 읽을 때뿐만 아니라 쓸 때에도 디스크에 바로 쓰지 않고 캐시에만 임시로 써 두는 것이다. 

쓰기 캐시를 사용하면 방금 쓴 내용을 다시 변경할 때 디스크에 두 번 쓸 필요가 없고, 변경된 내용을 하나하나 쓰는 대신 모아서 한꺼번에 쓸 수 있다는 장점이 있다. (모아서 하면 더 빠르다.) 대신 캐시에 임시로 저장된 내용을 아직 디스크에 쓰지 않았는데 컴퓨터를 끈다든가 하면 문제가 생긴다. 컴퓨터를 끄기 전에 제대로 종료시켜야 하는 이유 중 하나가 이 때문이다.

CPU 발목 잡는 느린 메모리도 캐시가 해결

CPU와 메인 메모리의 경우도 마찬가지다. 컴퓨터의 역사를 돌아보면 CPU의 속도는 엄청나게 빨라졌지만 메모리의 속도는 큰 변화가 없었다. (대신 메모리는 용량이 늘어나는 쪽으로 발전해 왔다.) 최근의 CPU들은 수 GHz(기가헤르쯔)의 속도로 움직이는데, 이는 1초에 수 십억 개의 명령어를 실행할 수 있다는 것을 뜻한다.

그런데 CPU가 실행하는 명령어들(프로그램)은 메인 메모리에 있다. 위에서 메인 메모리를 읽어들이는 데 천만 분의 1초 정도가 걸린다고 했는데, 명령어를 실행할 때마다 매번 하나하나 메인 메모리에서 읽어들인다면 1초에 잘해야 천만 개의 명령어밖에 실행할 수 없다는 결론이 나온다. 메모리의 느린 속도가 CPU의 발목을 잡는 격이다.

이런 속도 차이 문제를 해결하는 데도 캐시가 사용된다. 컴퓨터 프로그램은 같은 작업을 반복하는 구조로 되어 있는 경우가 대부분이기 때문에, 명령어를 한번 메모리에서 읽어들여서 캐시에 넣어 두면 속도를 크게 높일 수 있다. 또한 CPU가 메인 메모리에서 명령어를 읽어들일 때 한 개씩이 아니라 수천 개의 명령어를 한꺼번에 읽어들여서 시간을 절약한다. 캐시의 위력을 실감할 수 있는 예가 인텔의 노트북용 CPU인 펜티엄 M(센트리노)이다. 노트북에서는 전력 소모가 중요한 문제이기 때문에, 펜티엄 M은 데스크탑용 CPU보다 훨씬 낮은 속도로 동작한다. 데스크탑용 CPU가 2-3GHz의 속도로 움직이는 데 비해 펜티엄 M은 1-2GHz의 속도로 움직이는 것이다. 그런데 실제 성능을 비교해 보면 큰 차이가 나지 않는다. 그 비결은 노트북용 CPU가 훨씬 큰 캐시를 가지고 있기 때문이다.

네트워크에도 캐시 기술 응용

컴퓨터 네트워크에도 캐시 기술을 응용할 수 있다. 인터넷에서 웹페이지를 본다는 것은 서버에 저장된 웹페이지를 네트워크를 통해 내려 받아 보는 것이다. 그런데 네트워크를 통해 내려 받는 데는 시간이 많이 걸리기 때문에, 한번 본 웹페이지를 사용자의 컴퓨터에 저장해 두면 다음에는 훨씬 빨리 볼 수 있다. 한 가지 문제점은 웹페이지의 내용이 바뀌는 경우이다. 아이콘 등의 이미지는 잘 바뀌지 않지만 텍스트는 바뀔 수 있고, 게시판의 목록 등은 매우 자주 바뀐다.

이 문제를 해결하기 위해 서버가 웹페이지를 이루는 파일들의 유효기간을 알려준다든가, 캐시에 저장된 내용을 사용하더라도 변경이 있었는지 여부를 서버로부터 확인한다든가 하는 보완책이 필요하다.

Posted by 양형

댓글을 달아 주세요

Request method 'HEAD' not supported 오류에 대한 대처 방법.

HTTP method GET, POST 이외에...PUT, DELETE...등 그 중 HEAD....

원리는 간단하다. web.xml 전 단계에서 doFilter 를 이용해 우회 처리를..

01public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throwsIOException, ServletException {
02         
03        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
04        logger.debug("========== isHttpHead(httpServletRequest) : {}", isHttpHead(httpServletRequest));
05        if (isHttpHead(httpServletRequest)) {
06            chain.doFilter(new ForceGetRequestWrapper(httpServletRequest), response);
07        else {
08            chain.doFilter(new FilteredRequest(request), response);
09        }
10    }
11     
12    private boolean isHttpHead(HttpServletRequest request) {
13        return "HEAD".equals(request.getMethod());
14    }
15 
16    private class ForceGetRequestWrapper extends HttpServletRequestWrapper {
17        public ForceGetRequestWrapper(HttpServletRequest request) {
18            super(request);
19        }
20 
21        public String getMethod() {
22            return "GET";
23        }
24    }
25     
26    public void destroy() {
27    }
28}

doFilter 에 분기문을 추가하여 HEAD 요청시 GET으로 Method 를 변경한다.

참고 http://axelfontaine.com/blog/http-head.html 
http://forum.spring.io/forum/spring-projects/web/89981-request-method-head-not-supported

Posted by 양형

댓글을 달아 주세요