2014/03/25 북쇼핑리스트 




주말에 쉬지도 못하고 계속 회사일을 해야 했다.

그나마, 토요일 오전에 영화 본게 내 힐링의 전부.

다행히 실장님이 오늘을 휴가를 주셔서, 이번주 일요일에 못간 신촌 알라딘에 가서 

책을 사고, 알라딘 바로 앞에 있는 큰 창이 있는 까페에 가서 베이글과 까페라떼를 먹으면서 힐링할 수 있었다.

난 역시 커피를 마시면서 책을 읽을 때 행복한 것 같다.


오늘의 북쇼핑리스트


- 지금 저지르지 않으면 후회할 일들

13500 -> 6100

에세이 책이라 구입


- 진격의 거인 11권

5000 -> 2400

10권까지 구입했는데 11권이 있어서 샀다. 


- 치즈랑 소금이랑 콩이랑

12000 -> 5400

에쿠니 가오리 책을 모으고 있는 중. 이건 에쿠니 가오리 뿐만 아니라 4명의 나오키상 수상작가가 쓴 책이라는 데 책이 너무 이뻐서 구입


- 비주얼 프로젝트

23800 -> 5800

요즘 너무 외모에 무심해 져서 구입. 최여진이 쓴 책인데 약간은 에세이 식이라 맘에 들어서 구입


- 백화점

13800 -> 6300

작가가 쓴 책인 것 같은데 초반 부분이 재미있어 보여서 구입했다. 백화점이라는 소재를 두고 에세이식으로 여러 주제에 대해 쓴 책인것 같다.


- 노플랜 사차원 유럽여행

12000 -> 3600

유럽여행은 언젠가 해보고 싶은 일이라서, 계획없이 떠났다는 게 맘에 들었다. 앞에 살짝 봤는데 유머스럽게 써져 있어서 재미있어 보인다.


- 요리하는 그들의 부엌살림

15000 -> 68000

인테리어 코너에 딱히 좋은 책이 없었는데 이런 책도 있어서 구입. 아무래도 주부(?)가 되고 나서 부엌에 대해서나 살림에 대해서나 관심이 좀 생겼다. 



* 다 읽었으면 읽음으로 표시하고, 몇일날 읽었는지 간단한 감상정도는 적어놓아야 겠다.





WRITTEN BY
뮤네

,

관심있는 책 카테고리

Book 2014. 3. 16. 18:50

요즘 들어 책 욕심이 더 많아 져서 매주 주말에 알라딘 중고에서 책을 사고, 그것도 부족해서 동네 주민센터에서 책을 빌려서 읽고 있다. 예전에는 책 편식이 심했었다. 그래도 요즘에는 관심 있는 책 카테고리가 많아진 편이다.


에세이 - 어떤 사람의 생각이나 느낀점을 훔쳐보는게 너무 좋다. 내가 구글에 검색하기 보다 네이버 블로그나 까페에 검색하기 좋아하는 건 그 검색어의 정확한 내용을 알려고 하기 보다 사람들이 어떤 생각을 하고 사는지가 궁금해서라는 걸 요즘 깨닫고 있다. 특히 에세이 중에서는 싱글 여성들의 이야기들이 재미있다.


소박한 삶, 미니멀라이즈 - 이건 재태크쪽에 관심 있어서 책을 보다가 오히려 내가 원하는 건 돈을 많이 벌고 엄청나게 관리하는 것이 아니라 소비를 줄이고 물건을 줄이고 소박하게 사는 것을 깨닫게 된 후 이런 책들을 많이 찾고 있다.


행복 - 이것도 위의 소박한 삶과 비슷한 메시지이기도 하고 어떻게 하면 행복하게 살 수 있을 지 많이 생각하곤 한다.


자기계발서, 재태크 - 요즘엔 조금 관심이 줄어들 긴 했지만 내가 원래 좋아했던 책이다. 종류는 다양하지만 한가지 주제에 대해서 그 주제에 대해 제대로 쓴 책을 좋아한다. 그냥 위대한 사람들의 일화들이나 자잘한 내용들만 모은 책은 싫어 한다.


노트정리, 시간관리 - 자기계발서랑 조금은 비슷하지만, 나는 노트정리에 강박관념도 있고 제대로 내 삶이나 자료들을 정리하고 싶은 그런 정리욕은 좀 있는 것 같다.


인테리어 - 인테리어 책들은 좀 비싸서 빌려서만 읽곤 했는데 요즘엔 사고 있다. 지금 이 집에서 2년(정확히는 1년 8개월 후) 있다가 이사갈 때는 제대로 내가 살고 싶은 집처럼 꾸미고 싶은 욕심이 있다.


소설 - 소설은 취향이 좀 있어서 고르는 데 힘든 편이다. 아예 쉬운 칙릿소설은 오히려 좋아하고, 일본소설의 에세이같은 분위기랄까 그런 책을 좋아하는 것 같다. 사실 소설을 사는 건 좀 아까워 했었는데, 요즘에는 한 권씩 사고 있다. 다른 책들은 가볍게 읽을 수 있는데 소설을 읽으려면 그 소설을 읽고 나서 감정의 여파가 좀 있어서 마음을 굳게 먹고 읽곤 한다.


무협, 판타지 - 중,고딩학교 때 엄청 읽고, 지금도 가끔 너무 무료할 때 읽곤 한다. 그냥 시간 때우기용으로 읽는 용이랑 몇번을 보고 좋아하는 책들도 있다. 나중에 좋아하는 책은 따로 구입해 놓고 싶다.


개발, UI, 기획 서적 - 직업이 개발자인 만큼 일할 때와 회사에서 30분 책 읽는 시간에 읽고 있다. 예전엔 더 많이 읽었던 것 같은데, 관심있는 책들이 너무 많아져서 소홀해 지고 있다. 그래서 예전엔 죄책감도 들었던 것 같다. 그래도 내가 보고 싶은 책을 보는 게 더 좋은 것 같다. 이러다가도 관심사가 옮겨가면 다시 많이 읽는 때가 오지 않을까..


내가 좋아하는 카테고리가 확실해진 요즘은 그 카데고리의 책 중에 조금만 흥미로워 보여도 쉽게 구입할 수 있게 되었다. 책장에도 카테고리가 자연스럽게 생겼다. 주말에 5~6권정도 사고 주민센터에서 3권씩 빌려도 점심시간이나 저녁, 주말에 읽다보면 한,두개 생각보다 별로였던 것만 빼고 다 읽고 그 내용과 중복되는 원래 있던 책도 다시 읽기도 한다. 




WRITTEN BY
뮤네

,



2014/03/16 북쇼핑리스트


*북리뷰는 아님, 알라딘 중고서점에서 산 책과 어떤 점에 끌려서 샀는 지를 적었다.




- 다운시프트로 인생을 즐겨라 6000 -> 2700 (읽음)


내가 관심있어하는 미니멀라이즈, 소박하게 살기류의 책이라서 구입. 훑어보니 감성적인 내용은 아니고 표와 계산하는 내용들도 보여서 제대로 계획하고 실천하기에 좋을 것 같아서 구입했다.


 - 끌림 12000 -> 3000


까페에서 살짝 봤는데 괜찮아 보였다. 에세이가 좋아서 산 책


 - 울 준비는 되어 있다9000 -> 3700


내가 좋아하는 에쿠니 가오리의 책. 그 중에서 알라딘에 책 종류가 많길래 골랐다. 단편 모음집인듯. 소설책은 한꺼번에 많이 사면 안 읽어지는 경우가 있어서 한 권씩만 구입하고 있다.


 - 이사가는날13800 -> 6300 (읽음)


내가 좋아하는 이사. 그리고 인테리어쪽을 하는 남자의 에세이 + 인테리어에 관한 얘기라는 게 흥미로웠다. 


 - 혼자라서 좋은 날13000 -> 6300 (읽음)


결혼한 여자이면서도 내가 많이 산 종류의 싱글인의 이야기들. 이것도 그런 종류다. 내가 그런 책을 좋아하는 건 싱글인 여성 혹은 사람이 더욱 자신에 대해 많은 생각을 하고, 삶에 대해 그런 고찰을 하는 것이 좋아서인듯.


 - 언니네 방 9800 -> 1000 (읽음)


저번주에 산 언니들, 집을 나가다의 이전 편. 이것도 싱글인들의 이야기. 그것도 1000원이라니, 그냥 내용도 훑어보지 않고 구입. 


 - 까페탐험가 13800 -> 5600 (14.03.25 읽음)


도서관에서 빌린 책 중에서 좋았던 '북까페 인 유럽'과 비슷한 내용일 것 같아서 구입했다. 뉴욕과 홍대에서 좋은 까페를 찾고 느낀점이 있는 책일듯 하다.


 - 작은 아파트 인테리어13000 -> 5900 (읽음)

 - 소규모 작업실 인테리어13800 -> 6300


요즘엔 인테리어에 관련한 책도 좋아서 인테리어 책이 두개 있길래 산 책. 작은 아파트 인테리어는 까페에서 다 보긴 봤었던 책. 














WRITTEN BY
뮤네

,


* 사진은 나중에




- 누가 내 지갑을 조종하는가

->6100


- 디테일, 서울

->5900


- 새벽 5시 (읽음)

->3600


- 서른엔 뭐라도 되어 있을 줄 알았다 (읽음)

-> 5300


- 언니들, 집을 나가다 (읽음)

-> 4800


- 언제나 소박하게 

-> 3100


WRITTEN BY
뮤네

,


















-  카모메 식당의 여자들 (읽음)


- 지극히 적게 (읽음)


- 두 남자의 집 짓기 (읽음)


- 행복의 신화


WRITTEN BY
뮤네

,
단위 테스트 책 4챕터 읽기 (63~74)

Right-BICEP
Right - 결과가 옳은가?(결과의 유효성 검사)
B - 모든 경계 조건이 Correct한가?
I - 역의 관계를 확인할 수 있는가?
C - 다른 수단을 사용해서 결과를 교차확인 할 수 있는가?
E - 에러 조건을 강제로 만들어낼 수 있는가?
P - 성능 특성이 한도 내에 있는가?

1.Right
예상한 결과가 옳은지 살펴보는 것. 결과의 유효성 검사
테스트 파일 이용하기(testdata.text등을 활용할 수 있다)

2.경계 조건
- 형식 일치: 값의 형식이 기대한 형식과 일치하는가
- 순서 : 적절히 순서대로 되어있거나 그렇지 않은 값인가
- 범위 : 적당한 최소값과 최대값 사이에 있는 값인가
- 참조 : 코드가 자기가 직접 제어하지 않는 외부 코드를 참조하는가
- 존재성 : 값이 존재하는가(예: null이 아님, 0이 아님, 집합 안에 존재함 등)
- 개체수 : 확실히 충분한 값이 존재하는가
- 시간(절대적으로, 그리고 상대적으로) : 모든 것이 순서대로 일어나는가, 제시간에?때맞추어?

3.역관계확인
논리적 역을 적용하여 검증할 수 있다(예:제곱근곱은 제곱한 값이 원래 값과 오차한계 안에서 같은지 테스트)

4.다른 수단을 이용한 교차확인
다른 알고리즘, 다른 데이터부분은 분리, 합하기

5.에러조건을 강제로 만들어내기
메모리고갈, 디스트공간고갈, 총계산시간과 관련된 문제, 네트워크 가용성과 에러,
시스템 부하, 색상 팔레트 제한, 초고해상도 또는 초저해상도
모의객체를 사용한 방법 - 6장에서 설명

6.성능 특성
빠른 회귀 테스트
10000개, 100000개 등등으로 동작 확인

m: 단위 테스트 책 5챕터 읽기 (75~95)

CORRECT 경계 조건
버그는 '경계 조건' 근처, 즉 그 코드가 평소의 루틴과 다르게 동작하는 조건에서 많이 발생한다.

1. 형식일치
어떤 특정한 형식을 따르는 데이터를 기대하거나 만들어야 한다.
- 이메일 주소 firstname.lastname%somewhere@subdomain.somewhere.com 등
- 구조가 복잡한 데이터(헤더가 없고 데이터와 트레일러만 있다면? 헤더만 있다면 등등)
이메일주소나 구조화데이터와 비슷한 것을 만들어 낼 때에는 그 결과물을 테스트하여 기대한 형식과 일치하는지를 확인해야 한다.

2. 순서
어떤 검색 루틴이라 해도 반드시 대상이 시작 부분이나 끝 부분에 있는 조건을 테스트 받아야 한다.
- largetest()메서드에서는 가장 큰 수가 목록의 시작 부분이나 끝부분에 있는 경우에 생기는 버그
일이 일어날 가능성이 있고, '그리고' 이 경우를 작성한 메서드가 처리해야 한다면, 이런 조건에 대해 테스트하고 그 문제를 해결해야 한다.

3. 범위
범위는 어떤 변수형이, 필요하거나 원하는 값보다 범위를 허용하는 상황을 포괄적으로 함축하는 단어다.
- 원에는 360도밖에 없다, 각도 개념을 클래스에 캡슐화
- 직사각형에서 어느 한 변도 100보다 크지 않아야 할 때
assertTrue(message, Math.abs(one.x - two.x)<MAX_DIST); ..
- 빈 스택이나 스택 오버플로우 확인하는 부분
- 인덱스 관련 개념 광범위하게 테스트 
시작 인덱스와 끝 인덱스가 같은 값이다.
처음 인덱스가 마지막 인덱스보다 크다
인덱스가 음수다
인덱스가 허용된 것보다 큰 값이다.
원소 개수를 세는 변수 값이 실제로 들어 있는 항목 개수와 맞지 않는다.

4. 참조
메서드가 자기 영역을 벗어난 어떤 것을 참조하는가? 외부 의존성이 있는가? 클래스가 가져야 하는 상태는?
클래스의 상태나 다른 객체 또는 전역 애플리케이션의 상태를 추정해야 한다면, 이런 조건들이 만족되지 않았을 때 잘 동작하는지 확인하기 위해 코드를 테스트 할 필요가 있다.
어떤 메서드의 '사전 조건'은 이 메서드가 실행되려면 어떤 상태여야 하는지 나타낸다.
'사후 조건'은 어떤 메서드가 끝나고, 그 메서드가 일으킬 것이락 보장되는 일을 나타낸다.

5.존재성
주어진 것이 존재하는가?
넘겨받거나 가지고 있는 모든 값에 대해, 그 값이 존재하지 않는다면, 즉 null이거나 비었거나 0이라면 그 메서드에 어떤 일이 일어날지 자문해 보라.
-"Age가 준비되지 않았습니다." 같은 것을 보고해 주는 예외

6.개체 수
울타리 기둥 에러(울타리 세우는 문제 12피트 폭이 3피트 울타리는 5개여야 한다. 4개로 생각하기 쉽다)
개수를 필요한만큼 갖고 있다든가, 정확히 필요한 만큼 만들었다는 것을 확인해야 한다(0,1,1보다 클 때:1개 이상을 처리할 수 있다면 10,20,1000개까지도 처리할 수 있다는 것을 전제로)
private final static int NUMBER_TO_RETAIN = 20;

7.시간
상대 시간(시간적 순서), 절대 시간(경과한 총 계산 시간), 동시성 문제
어떤 인터페이스는 본질적으로 상태 정보를 가지고 있다. login()은 logout전에 호출되는 식으로.
이 메서드들의 순서가 뒤섞여 호출된다면 어떻게 될까? 기대하는 순서에 어긋나는 메서드 호출을 시도해 봐야 한다.
제한시간은 메서드가 짧은 시간 동안 쓸 수 있는 어떤 자원을 기꺼이 기다리는 시간을 의미한다.
경과 시간 문제 : 어떤 것을 기다리는데 '지나치게 오래' 걸린다면? 
스레드 여러 개가 같은 시간에 같은 객체를 사용한다면 무슨 일이 일어날지 자문해 보라. 동기화해야 할 전역이나 인스턴스 수준의 데이터나 메서드가 있는가?
외부 파일이나 하드웨어에 접근하는 부분은 어떤가? synchronized 키워드가 필요한 모든 데이터 요소나 메서드에 확실히 이 키워드를 붙이도록 하라. 그리고 테스트의 일부로 
스레드 여러개를 돌려보도록 하라.


단위테스트
카테고리 컴퓨터/IT > 프로그래밍/언어
지은이 데이비드 토머스 외 (인사이트, 2004년)
상세보기





WRITTEN BY
뮤네

,

1. 웹을 지탱하는 기술 : URI, HTML, HTTP
 

URI를 사용하면, 쇼핑 사이트의 상품이든 학술논문이든 동영상 사이트에 올라온 영상이든, 전 세계 온갖 정보를 가리킬 수 있습니다.  

HTML은 그 정보를 표현하는 문서형식입니다.

그리고 HTTP라는 프로토콜을 사용하여 그 정보들을 가져오거나 내보냅니다. 


HTTP,URI,HTML은 심플한 기술입니다. 

예를 들어, HTTP 1.1이 정의하고 있는 메서드는 고작 8개뿐입니다. 

그리고 URI는 종이 광고에 삽입할 수 있을 정도로 짧은 문자열입니다.

HTML은 XML을 바탕으로 한 범용 문서포맷입니다.

이런 심플함에 의해서 웹은 여러가지 응용이 가능하게 되어 있습니다.



1-1. URI : URI를 사용하면 웹상에 존재하는 모든 리소스를 한결같은 방식으로 보여줄 수 있습니다.


인터넷 상에서 반드시 유일한 호스트명의 구조와 호스트 내에서 유일한 계층적인 경로를 결합함으로써, 어떤 리소스의 URI가 전 세계의 다른 리소스와 절대로 중복되지 않도록 되어 있습니다.

* URN : 리소스의 이름을 나타내는 것 :리소스에 도메인명과는 독립된 이름을 붙일 수 있습니다. 예를 들어, 서적은 ISBN이라는 세계적으로 통일된 ID를 가지고 있습니다. URL과 같이 서버명과 프로토콜명이 들어있지 않기 때문에 URI로서 리소스를 가져 올 수 없다.

* URL : 리소스의 위치를 나타내는 것


* 리소스 : 웹상에 존재하는 이름을 가진 모든 정보. 

리소스의 이름은 어떤 리소스를 다른 리소스와 구별하기 위한 것이고 즉 URI를 말합니다. 리소스들은 URI로 식별할 수 있습니다.전 세계의 무수한 리소스는 각각 URI로 의미 있는 이름을 가진다. URI를 이용함으로써, 프로그램은 리소스가 표현하는 정보에 접근할 수 있다.서버와 클라이언트 간에 실제로 리소스를 주고받을 때는 어떤 구체적인 데이터를 서로 송신합니다. 

* 어드레스 가능성 : URI가 지니고 있는 리소스를 간단히 가리킬 수 있는 성질을 가리킴. 리소스를 어드레스 가능한 상태, 즉 제대로 이름이 붙어 있고 적절한 수단으로 접근할 수 있는 상태로 만들면, 프로그램을 만들기가 아주 쉬워집니다.

 

Cool URI : 변하지 않는 URI야말로 최고의 URI이다.

구현 의존성을 배제하고 심플하게 만들면 사용성이 향상된다. 기억하기도 간단하고, 개발자가 아닌 보통사람들도 사용하기 쉽다.

- 프로그래밍 언어에 의존적인 확장자와 경로를 포함하지 않는다.(.pl,rb,.do,.jsd 등)

- 메서드명과 세션ID를 포함하지 않는다.(jsessionid=123456)

- URI는 리소스를 표현하는 명사로 한다 (/show/123)

- 구현에 의존적인 경로명을 사용하지 않는다.(cgi-bin, servlet 등)

- URI를 변경하고 싶으면 가능한 한 Redirect하도록 합시다.



1-2. HTTP : 웹의 기반이 되는 프로토콜

 HTTP : 이름대로라면 하이퍼텍스트 전송용 프로토콜이지만, 실제로는 HTML과 XML같은 하이퍼텍스트뿐만 아니라, 이미지, 음성, 동영상, JavaScript 프로그램,PDF와 같은 각종 오피스 도큐먼트 파일 등 컴퓨터에서 다룰 수 있는 데이터라면 무엇이든 전송할 수 있습니다.


웹은 HTTP라는 프로토콜을 이용해 클라이언트와 서버가 서로 통신하는 클라이언트/서버의 아키텍처 스타일을 채용하고 있습니다. 즉, 클라이언트가 서버에 요청Request을 보내면 서버는 클라이언트에 대해 응답을 돌려줍니다. 


* TCP/IP : 인터넷의 토대를 구성하는 중요한 네트워크 프로토콜입니다. HTTP는 TCP/IP를 기반으로 하고 있습니다.인터넷의 네트워크 프로토콜은 계층 구조를 가지고 있습니다.각 계층별로 추상화하여 구현하면, 물리적으로 케이블이 동선인지 광케이블인지 하는 하위 계층의 구체적인 사항에 좌우되지 않고, 상위 계층을 구현할 수 있습니다.

- 네트워크 인터페이스 계층(이더넷) : 가장 아래의 계층으로 물리적인 케이블이나 네트워크 어댑터에 해당하는 부분입니다.

- 인터넷계층(IP) : 네트워크에서 데이터를 실제로 주고받는 것입니다. IP가 여기 해당합니다. IPㅇ서는 데이터의 기본적인 통신단위를 패킷이라고 부릅니다. 지정한 IP어드레스와 패킷 단위로 데이터를 주고받으면서 통신합니다.

- 트랜스포트(전송) 계층(UDP, TCP) : TCP가 여기 해당합니다. TCP는 목적지의 상대에 대해서 커넥션을 연결합니다. 이 커넥션을 사용해 데이터의 누락을 체크하고, 데이터의 도달을 보증합니다.

- 애플리케이션(응용) 계층(HTTP,NTP,SSH,SMTP,DNS) : TCP로 프로그램을 만들 때는 소켓이라고 불리는 라이브러리를 사용하는 것이 일반적입니다. 소켓은 네트워크에서의 데이터 교환을 추상화한 API로 접속,송신,수신,절단 등의 기본적인 기능을 갖추고 있습니다. HTTP서버와 브라우저는 소켓을 이용하여 구현합니다. 


HTTP의 구체적인 구조
웹은 아키텍처 스타일로 클라이언트/서버를 채용하고 있습니다. 즉 웹브라우저가 정보를 제공하는 웹서버에 접속하여 각종 요청을 보내고 응답을 받는 구조입니다. 
HTTP가 동기형 프로토콜이기 때문에 서버에서의 처리에 시간이 많이 걸리는 경우라도 요청을 보낸 클라이언트는 응답이 돌아올 때까지 대기합니다. 클라이언트는 우선 DNS를 사용해 호스트 이름을 해석하고, 그 결과로 얻어진 IP어드레스의 TCP 80번 포트에 접속한후 요청을 전송합니다. 서버는 이 요청을 읽어 들여 해석하고 응답을 보냅니다.

- 클라이언트에서 일어나는 일들 : 1.요청 메시지 구축 2.요청 메시지 송신 3.(응답이 돌아올 때까지 대기) 4.응답 메시지 수신 5.응답메시지 해석 6.클라이언트의 목적을 달성하기 위해 필요한 처리

- 서버에서 일어나는 일들 : 1.(요청을 대기) 2.요청 메시지 수신 3.요청 메시지 해석 4.적절한 애플리케이션 프로그램으로 처리를 위임 5. 애플리케이션 프로그램으로부터 결과를 취득 6.응답 메시지 구축 7.응답 메시지 송신

 
HTTP메시지의 구성요소 (스타트 라인, 헤더, 빈 줄 , 바디) 

요청메시지 (1.요청라인-메서드,요청URI,프로토콜버전으로 구성 2.헤더-메시지의 메타 데이터, 각 헤더는 이름:값의 구성 3.바디-메시지를 나타내는 본질적인 정보,리소스를 새로 작성하거나 갱신할 때는 요청의 바디부분에 리소스의 표현자체)

응답메시지  (1.스테이터스 라인-프로토콜버전,스테이터스 코드,텍스트구문으로 구성 2.헤더- HTML의 MIME미디어 타입과 그 문자 인코딩 방식을 지정 3.바디)

*메타 데이터 : 데이터를 기술하는 데이터, 데이터에 대한 데이터를 말합니다. 메타라는 것은 이렇게 어떤 대상에 대해 고차원 것을 나타내는 접두어입니다. 

 
HTTP의 스테이트리스성

스테이트풀의 결점 : 서버가 클라이언트의 애플리케이션 상태를 기억하는 것은 클라이언트의 수가 증가함에 따라 어려워지게 됩니다.  

스테이트리스의 이점 : 스테이트리스는 클라이언트가 요청 메시지에 필요한 정보를 모두 포함시킵니다. 스테이트리스한 서버는 애플리케이션 상태를 기억할 필요가 없기 때문에 서버 시스템이 단순해집니다. 이 특성을 이용하면 확장시키는 것이 간단해집니다.

스테이트리스의 결점 : 1. 퍼포먼스 저하(클라이언트의 송신할 데이터 양이 많아지고 인증 등 서버에 부하가 걸리는 처리를 반복한다) 2. 통신에러에 대한 대처(네트워크 트러블이 발생했을 때 그 요청이 처리되었는지 알 수 없습니다)

* 스트레이트리스 : 서버가 클라이언트의 애플리케이션 상태를 보존하지 않는다는 제약 

* 애플리케이션 상태 : 다른 이름으로 '세션상태'라고도 합니다. 시스템에 로그인하고부터 로그아웃할 때까지 일련의 조작을 모아'세션'이라고 부르는데, 이 일련의 조작 중의 상태는 애플리케이션 상태를 말하는 것이므로, 애플리케이션 상태와 세션 상태는 거의 동일한 의미가 됩니다. 


HTTP메서드 - 8개 밖에 없는 메서드(GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACE,CONNECT)
HTTP의 메서드를 한정하여 고정시켰기 때문에 결국 프로토콜이 심플하게 유지되었고, REST의 통일 인터페이스 제약으로 웹은 성공했습니다. GET의 숨겨진 안전성, PUT과 DELETE의 멱등성, 그리고 여차할 때는 뭐든지 할 수 있는 POST 각각의 메서드에 맞는 성질과 확장성을 갖춘 뛰어난 프로토콜입니다.

*GET : 리소드의 취득, 지정한 URI의 정보를 가져옵니다.

*POST : 리소스의 작성, 추가 1.서버 리소스의 작성(블로그 기사의 투고 등 조작에 사용) 2.리소스에 데이터 추가(로그등을 추가할 때) 3.다른 메서드로는 대응할 수 없는 처리(검색결과가 긴 경우 키워드를 요청 메시지의 바디에 넣는 경우)

* PUT : 리소스의 갱신,작성 1.리소스의 갱신(리소스의 텍스트를 바꿀때) 2.리소스의 작성(존재하지 않는 URI에 대한 요청) 

- POST와 PUT의 사용 구분 : POST로 리소스를 작성할 경우, 클라이언트는 리소스의 URI를 지정할 수 없습니다. URI의 결정권은 서버 측에 있습니다. 반대로 PUT으로 작성하면 리소스의 URI는 클라이언트가 결정합니다. 예를 들어 Twitter와 같이 포스팅한 트윗의 URI를 서버 측이 자동적으로 결정하는 웹 서비스와 같은 경우는 POST를 이용하고, Wiki처럼 클라이언트가 결정한 타이틀이 그대로 URI가 되는 웹 서비스는 PUT을 사용하는 것이 적합합니다.

*DELETE : 리소스의 삭제

*HEAD : 리소스의 헤더(메타 데이터) 취득

*OPTIONS : 리소스가 서포트하는 메서드의 취득

- POST를 PUT/DELETE대신 사용하는 방법 1._method파라미터 2.X-HTTP-Method-Override

- 멱등성(어떤 조작을 몇번을 반복해도 결과가 동일한 것)과 안정성(조작 대상의 리소스의 상태를 변화시키지 않는 것

GET,HEAD(멱등이고 안전하다, PUT,DELETE(멱등이지만 안전하지도 않다) POST(멱등이지도 안전하지도 않다)

*CRUD : Create작성(POST/PUT), Read읽기(GET), Update갱신(PUT), Delete삭제(DELETE)라는 데이터 조작의 기본이 되는 4가지 처리 


스테이터스 코드 - 요청의 결과로 얻어지는 응답메시지에서 그 의미를 전달한다.
클라이언트는 숫자를 보고 서버가 어떤 응답을 보낸 것인지 이해할 수 있으며, 클라이언트 측에서 어떻게 처리해야 할지 대략 알수 있게 됩니다. (1xx : 처리중 2xx : 성공 3xx : 리다이렉트 4xx : 클라이언트 에러 5xx : 서버 에러)

자주 사용되는 스테이터스 코드 9개(200 OK- 요청성공 201 Created-리소스 작성 성공 301 Moved Permanently-리소스의 항구적인 이동 303 See Other-다른 URI의 참조 400 Bad Request-요청 오류 401 Unauthorized-접근권한 없음, 인증실패 404 Not Found-리소스 없음 500 Internal Server Error-서버 내부 에러 503 Service Unavailable-서비스 정지


HTTP헤더 - 메시지의 바디에 대한 부가적인 정보, 즉 메타 데이터를 표현합니다. 클라이언트와 서버는 헤더를 보고 메시지에 대한 동작을 결정합니다. 미디어 타입과 언어 태그 등 프레임워크가 아닌 구현하는 사람이 구체적으로 설정해야만 하는 헤더도 많이 있습니다.
- 날짜 시간을 가지는 헤더, MIME 미디어 타입 


 
캐시
캐시란, 서버로부터 가져온 리소스를 로컬 스토리지(하드디스크 등)에 저장하여 재사용하는 방법을 말합니다. 로컬 스토리지에 캐싱한 데이터 자체를 "캐시"라고 부르기도 합니다.
클라이언트가 저장한 캐시는 그 캐시의 유효 기간 내에 다시 그 리소스에 접근하려고 했을 때 재사용됩니다.

캐시용 헤더
클라이언트는 서버에서 가져온 리소스의 캐시 가능 여부를 조사하고 가능한 경우는 로컬 스토리지에 저장합니다. 어떤 리소스가 캐시 가능한지는 그 리소스를 취득했을 때의 헤더로 판단합니다. 리소스가 캐시 가능한지, 그 유효기간이 언제까지인지는 Pragma, Expire, Cache-Control 헤더를 이용해 서버가 지정합니다.

Pragma - 캐시를 억제한다
HTTP/1.1 200 OK
Content-Type: application/xhtmll+xml, charset=utf-8
Pragma:no-cache

Pragma 헤더에 지정할 수 있는 값은 공식적으로는 no-cache뿐입니다. 이 값은 리소스를 캐시하지 말 것을 나타냅니다. 클라이언트가 다음번에 이 리소스를 가져올 때는 반드시 서버에 다시 접속하지 않으면 안 됩니다.

Expires - 캐시의 유효기간을 나타낸다.
HTTP/1.1 200 OK
Content-Type: application/xhtmll+xml, charset=utf-8
Expires:Thu, 11 May 2010 

이 응답에는 2010년 5월 11일 16시까지는 캐시가 유효하다는 것을 서버가 보증하고 있습니다. 클라이언트가 다음번 이 리소스에 접근 할 때는 캐시가 유효기간 내에 있는지에 따라, 서버에 다시 접속할 것인지 캐시를 이용할 것인지를 결정합니다. 
리소스를 변경할 가능성이 없는 경우는 캐시의 유효기간을 무한으로 설정하고 싶겠지만, 그런 경우라도 Expires 헤더에는 최장 약 1년 이내로 일시를 넣을 것을 스펙에서는 권장하고 있습니다.

cache-Control - 상세한 캐시 방법을 지정한다
Pragma 헤더와 Expires 헤더는 HTTP 1.0이 정의한 헤더입니다. 간단한 캐시는 이들로 구현할 수 있지만, 복잡한 지정은 할 수 없습니다. 좀 더 복잡한 지정을 가능하게 하기 위해서 HTTP 1.1에서는 Cache-Control 헤더를 추가했습니다. Pragma헤더와 Exires헤더의 기능은 Cache-Control 헤더로 완전히 대용할 수 있습니다.

Pragma : no-cache
Cache-Control:no-cache 와 같습니다.

Cache-Control : max-age:86400
또한, Expires에서는 절대시간으로 유효기간을 표시했는데, Cache-Control에서는 현재로부터의 상대시간으로 유효기간을 설정할 수 있습니다. 위의 예는 86,400초, 즉 현재로부터 24시간 캐시가 유효하다는 것을 의미합니다. Cache-Control헤더에서는 이 밖에도 다양한 식별자와 값이 들어가는데 이들에 의해서 더욱 섬세하게 캐시를 제어할 수 있습니다. 

캐시용 헤더의 사용 구분
캐시를 시키지 않을 경우는 Pragma와 Cache-Control의 no-cache를 동시에 지정한다.
캐시의 유효기간이 명확하게 정해져 있는 경우는 Expires를 지정한다.
캐시의 유효기간을 상대적으로 지정하고자 하는 경우는 Cache-Controldml max-age로 상대시간을 지정한다.

조건부 GET
클라이언트가 Expires와 Cache-Control 헤더를 검증한 결과, 로컬 캐시를 그대로 재사용할 수 없다고 판단한 경우라도 조건부 GET를 송신하면 캐시를 재사용할 수 있는 가능성이 있습니다. 조건부 GET은 서버 측에 있는 리소스가 클라이언트 로컬의 캐시로부터 변경되어 있는지 여부를 조사하는 조건을 요청 헤더에 포함시킴으로써, 캐시를 그대로 사용할 수 있는지 검토하는 구조입니다. 조건부 GET은 리소스가 Last-Modified 헤더 또는 ETag 헤더를 가지고 있을 때 이용할 수 있습니다.

If-Modified-Since - 리소스의 갱신일시를 조건으로 한다.

GET/test HTTP/1.1
Host: example.com
If-Modified-Since:Thu, 11 May 2010 16:00:00 GMT

이 요청은 로컬 캐시의 갱신일시가 2010년 5월 11일 16시 정각이라는 것을 나타내고 있습니다. 서버의 리소스가 이 이후로 변경되지 않았다면, 서버는 다음의 응답을 보냅니다.

HTTP/1.1 304 Not Modified
Content-Type: application/xhtmll+xml, charset=utf-8
Last-Modified: Thu, 11 May 2010 16:00:00 GMT

304 Not Modified는 조건부 GET에 대한 응답으로, 서버의 리소스를 변경하지 않았다는 것을 알려주는 스테이터스 코드입니다. 리소스의 갱신일시는 Last-Modified 헤더로 확인할 수 있습니다. 이 응답에는 바디가 포함되지 않기 때문에 그만큼 네트워크 대역을 절약할 수 있습니다.

If-None-Match - 리소스의 ETag(엔티티 태그)를 조건으로 한다.

GET/test HTTP/1.1
Host: example.com
If-None-Match: ab3322028

If-None-Match 헤더는 If-Modified-Since 헤더와 비슷하지만, 지정하는 값이 다릅니다. If-Modified-Since 헤더는 '지정한 시간 이후로 갱신되어 있으면'이라는 조건임에 반해, If-None-Match 헤더는 '지정한 값과 매치하지 않으면'이라는 조건이 됩니다. If-None-Match 헤더에 지정하고 있는 값은 캐시하고 있는 리소스의 ETag 헤더의 값입니다.
위의 조건부 GET의 결과, 서버상의 리소스가 변경되어 있지 않으면 다음의 응답을 반환합니다.

HTTP/1.1 304 Not Modified
Content-Type: application/xhtmll+xml, charset=utf-8
ETag: ab3322028

ETag는 리소스의 갱신 상태를 비교하기 위해서만 사용하는 문자열입니다. 리소스를 갱신했을 때 다른 값이 되는 것이면 어떤 문자라도 상관 없습니다.

ETag의 계산

정적 파일 
Apache는 기본적으로 정적 파일의 ETag의 값은 inode번호, 파일 사이즈, 갱신일시를 이용해 자동으로 계산해 줍니다.
단, inode번호는 동일 내용의 파일이라도 파일 시스템이 다르면 다른 값으로 되기 때문에 서버를 분산시킨 경우에는 주의가 필요합니다. 그런 경우는 파일 사이즈와 갱신 일시만으로 ETag의 값을 계산하도록 설계할 수 있습니다.

동적 파일
동적으로 생성한 HTML 페이지와 피드 등의 경우, 정적 파일과는 달리 Apache 등의 웹 서버가 ETag를 자동으로 계산해주지 않습니다. 따라서 ETag를 이용한 조건부 GET을 구현하기 위해선 HTML과 피드를 생성하는 웹 애플리케이션에서 ETag의 값을 계산할 필요가 있습니다. 
ETag 값의 계산은 리소스 내용의 해시를 계산하는 방법이 가장 간단하지만, 리소스의 내용을 모두 계산해야하기 때문에 사이즈가 큰 리소스나 데이텁이스에 대해 복잡한 쿼리를 발생시키는 리소스에는 현실적이지 않습니다. 이런 경우는 일반적으로, 리소스의 메타 데이터(갱신 일시, 사이즈 등)를 이용해 생성하거나, 리소스의 갱신 카운터를 준비해서 그것으로 대용하기도 합니다.


1-3. HTML


 
Atom : 목적 가운데 하나는 RSS의 스펙이 난립하여 혼란을 초래했기 떄문에 확장성이 있는 피드의 표준 포맷을 책정하려는 것이었습니다. RSS는 주로 블로그의 신착정보를 전달하는 피드의 목적으로 이용되었지만, Atom은 블로그뿐 아니라 검색엔진이나 사진관리 등 다양한 웹 서비스의 웹 API로 이용할 수 있습니다. 

멤버 리소스
블로그라면 하나하나의 기사가 멤버 리소스가 됩니다. 이미지 관리 서비스라면 하나하나의 이미지가 멤버 리소스가 됩니다.
멤버 리소스는 XML로 표현할 수 있는 엔트리 리소스와 그 밖의 미디어 리소스로 나눠집니다.

멤버리소스 <-------- 멤버를 복수 포함  컬렉션 리소스(피드로 표현)
엔트리 리소스(엔트리로 표현하는 멤버:text,html,xhtml,그 밖의 텍스트와 XML) , 미디어 리소스(엔트리 이외로 표현하는 멤버:텍스트 이외의 데이터, 멀티미디어 파일)
미디어링크 엔트리(엔트리 리소스 중, 미디어 리소스에 대한 링크를 가진 것 <content>요소의 src속성으로 외부 리소스를 참조한다.

Content-Type: application/atom+xml
Content-Type: application/atom+xml; type=entry
Content-Type: application/atom+xml; type=feed
Content-Type: application/atom+xml; type=feed; charset=utf-8

엔트리의 예
<entry xmlns="http://www.w3.org/2005/Atom">
<id>tag:example.com,2010-08-24:entry:1234</id>
<title>테스트 일기</title>
<updated>2010-08-24T13:11:54Z</updated>
<link href="http://example.com/1234" />
<content>테스트입니다.</content>
</entry>

tag스키마
tag:{DNS명 또는 메일주소},{일자}:{임의의 문자열}
DNS명은 자신이 권리를 가지고 있는 도메인의 호스트명입니다. 메일주소는 자신이 가지고 있는 임의의 메일주소입니다. 여기에 일자정보를 더해, 전 세계에서 고유하다는 것을 보증합니다.

<title><summary>
<author><contributor><name><uri><email>
<updated><published>
<category term="animals" label="동물" scheme="http://example.com/tags" />
<link rel="alternate" hreflang="ja" href="http://example.com/1234" />
<link rel="enclosure" type="audio/mpeg" length="489822" href="http://podcast.example.com/audio/123.mp3" title="Atom에 대한 강연"/>

Atom에서는 엔트리의 내용에 다양한 포맷을 포함할 수 있게 되어있습니다.
텍스트,HTML,XHTML,XML,이미지(바이너리 데이터,Base64 or src)

피드 - 엔트리의 집합
멤버 리소스를 여러 개 가지는 컬렉션 리소스의 표현

엔트리와 공통 메타 데이터 <id><title><author><updated>
피드의 독자적인 메타 데이터 <subtitle>생성프로그램<generator><icon><logo>

Atom의 확장
높은 확장성으로 블로그 이외의 다양한 시스템에서 응용되고 있습니다.

2. Atom Threading Extenstions - 스레드를 표현한다
피드 형식의 데이터는 블로그뿐 아니라 게시판이나 폼, 메일링 리스트 로그 같은 복수 투고자에 의한 콘텐츠에도 적합합니다.
어떤 사람이 투고한 콘텐츠에 다른 사람이 차례차례 답변을 하여 하나의 흐름을 만드는 이른바 스레드 기능입니다.
<thr:in-reply-to>
replies 링크 관계와 thr:count속성 / thr:updated 속성
부모 엔트리 쪽에서 자식 엔트리를 참조할 때 사용하는 것 .
예는 '최초의 블로그 포스팅'의 엔트리를 표현하고 있습니다. 이 엔트리는 replies 링크 관계로 답글에 대한 참조를 가집니다.
3.Atom License Extension - 라이선스 정보를 표현한다.
1. OpenSearch - 검색결과를 표현한다.
Description Document 검색엔진이 제공하는 검색기능을 프로그램이 이해할 수 있는 형식으로 기술하는 XML형식
URL Template Syntax 검색결과 리소스를 표현하는 URL의 검색 쿼리 부분을 파라미터화 하는 스펙
Query Element
Response Element

Atom은 타이틀, 저자, 갱신일시라는 기본적인 메타 데이터를 갖춘 리소스 표현을 위한 포맷입니다. 다양한 애플리케이션용 확장이 준비된 포맷이기도 합니다. 예를 들어 팟 캐스트에 의한 음악전송이나 사진관리, 검색엔진 등입니다.

 
Atom - 데이터 포맷의 규칙(피드, 엔트리)
AtomPub - Atom이 규정한 피드와 엔트리로 표현하는 리소스의 편집, 소위 말하는 CRUD조작을 실현하기 위한 프로토콜입니다.

REST는 시스템을 설계하기 위한 지침입니다.
AtomPub 의 설계는 REST 스타일에 기초한 프로토콜 스펙입니다.
REST는 아키텍처 스타일이기 때문에, 실제 리소스 설계나 링크 기능의 제공은 시스템 설계자의 손에 달려 있습니다. 여기에는 설계자의 자유도를 확보할 수 있다는 이점이 있는 반면에, REST를 바르게 이해하고 있지 않으면 제대로 설계할 수 없다는 결점도 있습니다.
AtomPub 스펙은 기본적인 리소스 모델과 링크 기능을 제공하므로 우리들이 독자적으로 설계해야 하는 부분이 많이 줄어듭니다.
또한, AtomPub 대응 프레임워크와 라이브러리를 이용하면 구현과정이 단축되고 나아가 표준화된 프로토콜을 이용함으로써 상호운용성도 높아집니다.

멤버 리소스의 조작
엔트리 단위에서의 조작
피드에 포함되어있는 각 엔트리는 고유의 URI를 가집니다. 
각각의 URI에 HTTP메서드를 적용하면 CRUD조작을 구현할 수 있습니다.
<link href="http://blog.example.com/entry/1234.atom" rel="edit"/>
이렇게 rel속성이 edit라는 값을 가진 <link>요소를 편집링크라고 부릅니다.

GET 엔트리 취득
PUT 엔트리 갱신 - 취득한 엔트리를 편집하고, 서버에 PUT하여 엔트리 정보를 갱신합니다.
DELETE-엔트리의 삭제
POST-엔트리의 작성

미디어 리소스의 조작
slug 헤더는 AtomPub 가 새로 정의한 헤더입니다. 투고할 미디어 리소스의 URI와 타이틀에 사용할 힌트가 되는 문자열을 %인코딩한 것입니다.

서비스 문서는 컬렉션 리소스의 리스트를 모은  홈페이지와 같은 것으로 생각하면 됩니다.
application/atomsvc+xml이라는 미디어 타입을 이용하고 있습니다. 
<service>요소를 루트로 가지는 XML문서입니다.
<service>요소는 자식요소로 반드시 하나 이상의 <workspace>요소를 가집니다. <workspace>는 몇 개의 컬렉션 리소스를 모으기 위한 것입니다.<categories>요소는 컬렉션 리소스에서 이용 가능한 카테고리를 나타냅니다. fixed속성으로 지정된 카테고리 이외의 엔트리를 추가할 것인지 안 할 것인지를 정할 수 있습니다.
AtomPub 의 카테고리는 소셜 북마크의 '태그'에 가깝다고 생각하면 됩니다. 

AtomPub 에 적합한 웹 API
-블로그 서비스의 API
-검색 기능을 가진 데이터 베이스의API
-멀티미디어 파일의 repository의API
-태그를 사용한 소셜 서비스의API

AtomPub 에 적합하지 않은 웹 API
-Comet을 이용하는 실시간성이 중요한API
-영상의 스트림 전송 등 HTTP이외의 프로토콜을 필요로 하는API
-데이터의 계층 구조가 중요한 API
-타이틀 작자 갱신일시 같은 Atom 포맷이 제공하는 메타 데이터가 불필요한 API



JSON
 
JavaScript Object Notation
데이터를 기술하기 위한 언어
JavaScript 기법으로 데이터를 기술할 수 있는 점이 특징입니다. 
심플함으로 인해 많은 언어에서 라이브러리를 제공하고 있으므로 프로그래밍 언어 간에 데이터를 주고받을 수 있습니다.
웹 서비스에서는 브라우저가 JavaScript를 실행할 수 있어 호환성이 좋고 XML과 비교하면 데이터 표현이 간결하다는 등이 이점이 있어 Ajax 통신에서 데이터 포맷으로 활용되고 있습니다.

자료형 6가지 (object, array, string, number, boolean, null)

1.오브젝트는 이름과 값의 집합입니다. 이름과 값의 세트를 오브젝트의 '멤버'라고 부릅니다. 자바스크립트에서는 멤버의 이름에 식별자와 수치도 가능하지만, JSON의 멤버의 이름은 항상 문자열입니다. 멤버의 값은 문자열과 수치는 물론 오브젝트나 배열 등 JSON의 자료형이라면 무엇이든 들어갈 수 있습니다.
{
"name":{
"first":"John",
"last":"Doe"
},
"blog":"http://blog.example.com",
"age":34,
"interests": ["Web","XML","REST"]
}
오브젝트는 {}로 감싸줍니다. 멤버는 ,으로 구분하고 멤버의 이름과 값은 :으로 구분합니다.


2.배열은 순서를 가진 값의 집합입니다. 0개 이상의 값을 가질 수 있습니다.
문자열의 배열  ["Web","XML","REST"]
오브젝트의 배열 [{"foo":"bar"},{"key":"value"}]
배열의 배열,빈 배열,복잡한 배열 등등

3.스트링(문자열) JSON의 문자열은 반드시 이중인용부호(")로 감싸줍니다. 에스케이프 표기도 사용할 수 있습니다.

4.number(수치) 수치에는 정수와 부동소수점이 모두 포함됩니다. 수치의 표기는 10진 표기로 한정합니다.

5.boolean(부울린) 참이냐 거짓인가를 취하는 부울린형은 true와 false와 같이 반드시 소문자로 기술해야합니다.

6. null

7. 일시 - 기본적으로 제공하는 자료형에 일시는 없습니다. 

8. 링크 

JSON에 의한 크로스 도메인 통신
JSONP가 왜 필요하게 되었는지의 배경 - Ajax에서 이용하는 XMLHttpRequest라는 JavaScript의 모듈은 보안상의 제한으로 인해, JavaScript파일을 가져왔던 동일한 서버하고만 통신할 수 있습니다. 자바스크립트가 있는 서버와 다른 서버가 통신할 수 있다면, 브라우저에서 입력한 정보를 사용자가 모르는 사이에 부정한 서버로 전송할 수 있게 되기 때문입니다. 이와 관련해 이렇게 불특정 다수의 도메인에 속하는 서버에 액세스하는 것을 '크로스 도메인 통신'이라고 부릅니다.
복수 도메인의 서버와 통신할 수 없고, 단일 도메인과만 통신해야 한다는 것은 커다란 제약입니다. 예를 들어, 자체 서비스에서는 지도 데이터와 우편번호 데이터를 가지지 않고, 그것들을 제공하고 있는 다른 웹 API로부터 원하는 대로 가져올 수 없기 때문입니다.


콜백 함수를 활용하는 JSONP
XMLHttpRequest에서는 크로스 도메인 통신을 할 수 없지만, HTML의 <script>요소를 이용하면 복수의 사이트에서 자바스크립트 파일을 읽을 수 있습니다. JSONP는 브라우저의 이런 성질을 이용해 크로스 도메인 통신을 구현하는 방법입니다.






2. REST는 웹의 아키텍처 스타일
REST는 네트워크 시스템의 아키텍처 스타일입니다. 네트워크 시스템의 아키텍처 스타일로서 가장 유명한 것은 클라이언트/서버입니다. 그리고 웹은 클라이언트/서버이기도 합니다. 순수한 클라이언트/서버 아키텍처 스타일에 몇 가지 제약을 더해가면, REST라는 아키텍처 스타일이 됩니다.

일반적으로 소프트웨어 아키텍처는 복수의 컴포넌트를 조합해 구현하는데, 각각의 컴포넌트가 따로따로 움직여서는 동작하지 않습니다. 그래서 각 컴포넌트에 제약을 부과해 갑니다. 그 결과 전체적으로 각 컴포넌트가 협력하면서 동작하게 되는 것이지요.



* 아키텍처 스타일 : '(매크로)아키텍처 패턴'이라고도 하며, 복수의 아키텍처의 공통된 성질, 양식, 규정 혹은 독특한 방식을 가리키는 말입니다.

아키텍처 스타일에는 MVC와 파이프 앤 필터, 이벤트 시스템 등이 있습니다.

실제 시스템은 구체적인 아키텍처를 가지고 있습니다. 그 아키텍처를 설계할 때, 그냥 마구잡이로 만들어 가는 것이 아니라 아키텍처 설계 지침, 규정, 방식 즉, 아키텍처 스타일을 적용합니다. 시스템의 아키텍처를 결정할 때 나침반이 되는 것이 아키텍처 스타일입니다.

* 아키텍처 : 구현에서 추상도를 한 단계 올린 것

* 아키텍처 스타일 : 아키텍처에서 추상도를 한 단계 더 올린 것

* 제약 : 조건을 붙여 내용을 제한함. 또는 그 조건.


2-1. REST의 등장 배경

폭발적으로 보급된 웹으로 인해 각 회사의 서버, 클라이언트 사이에서 이용되어야 하고 상호 운용성이 요구되었기 때문에 

웹을 구성하는 기술, 특히 HTTP와 URI와 HTML에 대한 표준화가 요구되었습니다.

웹 이전의 인터넷 표준은 IETF의 RFC로 정해져 왔지만 웹이 너무나 급속하게 보급되어 버렸기 떄문에 스펙 책정이 따라가지 못하고,

각 기업의 구현은 제각각이라 상호운용성이 결여되는 상태가 발생되어 버렸습니다.


필딩은 HTTP의 스펙을 책정하는 시기에 자신의 연구과제로 웹이 왜 이렇게 성공했는지, 왜 이 정도의 대규모 시스템이 성립된 것인지에 대해 소프트웨어 아키텍처의 관점에서 분석하고, 하나의 아키텍처 스타일로 정리했습니다. 

그는 이 아키텍처 스타일을 REST(Representational State Transfer)라 이름붙였습니다.

**리소스 상태의 표현???????


* SOAP : HTTP를 애플리케이션 프로토콜이 아닌 트랜스포트 프로토콜로 다루고, HTTP 상에서 독자적으로 메시지를 전송합니다. 

SOAP는 메시지 전송 방법만을 규정한 스펙이기 때문에 실제로 시스템을 구축할 때는 SOAP 상에 서비스 별로 프로토콜을 정의하지 않으면 안 됩니다.

각 벤더마다 제각기 정의하게 되면 이전 분산 시스템의 전철을 밟는 셈이었기 때문에 주변 스펙들이 제안되었습니다. 하지만 여러 비슷한 스펙들이 여러 개가 난립했기 때문에, 결국 이전과 마찬가지의 표준화 경쟁을 불러일으켰습니다.


SOAP와 WS-*의 패인

첫째는 기술적인 이유. RPC/분산 오브젝트가 가지고 있던 기술적인 문제점을 그대로 가지고 있는데다 스펙들마저 복잡해져 버렸습니다. 

예를 들어, 벤더 간 인터페이스 호환성의 결여, 복잡한 프로토콜 스택, 네트워크를 통한 인터페이스 호출에 의한 오버헤드 등입니다.

둘째는 정치적인 이유. 표준화 작업은 각 벤더가 드래프트를 가지고 오면, 그 차이를 조정하는 식으로 이루어졌습니다. 하지만 많은 벤더들이 SOAP 자체도 표준으로 확정되기도 전에 구현을 추진했기 때문에 동일한 SOAP와 WS-*라도 해석에 차이가 생겼고 호환성이 결여되었습니다.


2-2. REST는 복수의 아키텍처 스타일을 조합하여 구축한 복합 아키텍처 스타일


클라이언트/서버- 유저 인터페이스와 처리를 분리한다.

클라이언트/서버의 이점은 단일 컴퓨터 상에서 모든 것을 처리하는 것이 아니라, 클라이언트와 서버로 분리해서 처리할 수 있다는 점입니다.

유저 인터페이스는 클라이언트에서 담당하기 때문에 서버는 데이터 스토리지로서의 기능만을 제공하면 됩니다. 


스테이트리스 서버- 서버 측에서 애플리케이션의 상태를 가지지 않는다, 클라이언트는 요청마다 모든 정보를 송신한다.

*스테이트리스 : 클라이언트의 애플리케이션 상태를 서버에서 관리하지 않는다

서버가 애플리케이션의 상태를 가지지 않게 되면, 그만큼 서버 측의 구현을 간략화 할 수 있다는 장점이 있습니다. 간략하게 구현된 서버는 클라이언트로부터의 요청에 응답한 뒤 바로 서버의 자원을 해제할 수 있습니다.

- 스테이트리스가 아닌 스테이트풀한 서비스 :: Cookie를 사용한 사용자 세션 관리


* 캐시- 클라이언트와 서버의 통신횟수와 양을 감소시킨다, 캐시에 필요한 정보를 클라이언트에게 전달, 같은 요청의 결과를 재이용 : 리소스의 신선도에 기초해, 한번 가져온 리소스를 클라이언트 쪽에서 돌려쓰는 방식

캐시의 장점은 서버와 클라이언트 사이의 통신량을 줄여 네트워크 대역의 이용과 처리시간을 축소하고, 더욱 효율적으로 처리할 수 있다는 것입니다. 단, 오래된 캐시를

이용해 정보의 신뢰성이 떨어질 가능성도 있습니다.


* 유니폼 인터페이스- 인터페이스를 고정한다, 모든 서버가 같은 인터페이스를 채용한다.  URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일

예를 들어, HTTP 1.1에서는 GET과 POST 등 8개의 메서드만 정의되어 있고 확장할 수 없는 제약이 있다. 아주 엄격한 제약으로 느껴지지만, 인터페이스의 유연성에 제약을 가함으로써 전체적인 아키텍처가 간결해집니다. 또한 인터페이스를 통일함으로써 클라이언트와 서버 구현의 중립성이 향상됩니다.



* 계층화 시스템- 시스템을 계층별로 분리한다, 인터페이스가 다른 레거시 시스템에 접속할 수 있게 한다, 시스템을 복수의 계층으로 분할한다 : 시스템 전체를 계층화하기 쉽다. 예를 들면, 웹 서비스에서는 서버와 클라이언트간의 로드 밸런서를 설치해 부하를 분산시키거나, 프록시를 설치해 액세스를 제어합니다. 클라이언트 측에서 보면, 서버나 프록시 모두 동일한 인터페이스로 접속할 수 있기 떄문에 접속할 곳이 서버에서 프록시로 바뀐 것을 신경 쓸 필요가 없습니다. 이것은 서버와 프록시 등 각 컴포넌트 간의 인터페이스를 HTTP로 통일하고 있기에 실현될 수 있었습니다.

시스템을 몇 개의 계층으로 분리하는 아키텍처 스타일을 계층화 시스템이라고 합니다.


* 코드 온 디맨드- 프로그램을 클라이언트에 다운로드하여 실행한다, 인터페이스가 다른 레거시 시스템에 접속할 수 있게 한다 , 서버가 제공하는 코드를 클라이언트에서 실행 : 프로그램 코드를 서버에서 다운받아 클라이언트에서 실행하는 아키텍처 스타일입니다. 예를 들어, JavaScript나 Flash,Java 애플릿 등이 여기에 해당합니다. 장점은 클라이언트를 차후에 확장할 수 있다는 것입니다. 클라이언트 프로그램에 미리 준비해 둔 기능뿐만 아니라, 새로운 기능을 계속 추가할 수 있습니다. 


*P2P : 대표적인 REST 이외의 아키텍처 스타일 ; 서버를 거치지 않고, 피어(분산 네트워크상의 각 노드(컴퓨터))사이에서의 통신



3. 하이퍼미디어 시스템과 분산시스템
HTTP,URI,HTML이 지탱하고 있는 웹을 정보 시스템으로 본다면,
하이퍼미디어 시스템과 분산시스템이라는 2가지 측면으로 볼 수 있습니다.

웹은 전 세계에 배치된 서버에 전 세계의 브라우저가 액세스하는 분산 시스템
분산 시스템으로서의 웹의 특징은 프로토콜이 심플하다는 점.(클라이언트와 서버 간의 인터페이스를 HTTP라는 심플한 프로토콜로 고정함)

* 하이퍼미디어 : 텍스트와 이미지, 음성, 영상 등 다양한 미디어를 하이퍼링크로 연결해 구성한 시스템. 웹은 하이퍼미디어의 한 예

* 하이퍼링크 : 하이퍼미디어에 있어서 정보끼리 연결하는 구조

* 중앙 집중형 시스템 :  한 대의 중앙 컴퓨터가 모든 것을 처리하는 형식

* 분산 시스템 : 복수의 컴퓨터를 조합해 처리를 분산시키는 형식. 


3-1. 다양한 하이퍼미디어 포맷

* microformats : HTML의 구조는 그대로 유지한 채, HTML에 다양한 의미를 가지게 할 수 있는 기술

* RSS : 웹페이지의 새로운 정보를 서버에서 발송하고, 전용 프로그램으로 그것을 체크하기 위한 용도

* Atom : RSS가 복수의 버전이 난립해 혼란스러웠던 탓에 최종적으로는 IETF에서 Atom이 표준화되었습니다.

* JSON : RSS와 Atom이 XML을 베이스로 한 구조화 문서용 마크업 언어이기 때문에 단순한 데이터 포맷이 필요해서 제안된 데이터 포맷


3-2. REST와 하이퍼미디어& 분산시스템

REST와 하이퍼미디어 : 하이퍼미디어를 이용한 애플리케이션에는 리소스의 URI만 알면 어떤 애플리케이션이 제공하고 있는 리소스를 다른 애플리케이션에서도 간단히 재사용할 수 있다는 장점이 있다. 리소스를 링크로 연결하여 하나의 애플리케이션을 구성한다는 개념은 REST의 근간을 이루는 사상입니다. 이 개념은 '접속성'라고도 불립니다.


REST와 분산 시스템 : 분산 오브젝트에서는 함수나 메서드단위로 서버 쪽의 처리를 호출합니다. 네트워크를 통한 함수 호출을 하면 오버헤드가 심하기 때문에 시스템 전체 성능의 저하를 가져옵니다. 그에 비해 REST에 기초한 웹 서비스는 링크를 이용하여 애플리케이션을 실현합니다. 분산시스템에서는 기능을 추가해 버전 업 할 때마다 메서드가 늘어나거나 메서드의 인수와 반환값이 바뀌고, REST는 인터페이스가 고정되어 있기 때문에 호환성 문제는 발생하지 않는다. 리소스에 적용할 수 있는 HTTP메서드는 항상 고정되어 있어 HTTP를 구현한 클라이언트라면 동일하게 접속할 수 있습니다.




웹을지탱하는기술HTTPURIHTML그리고REST
카테고리 컴퓨터/IT > 웹사이트 > 웹서비스
지은이 야마모토 요헤이 (멘토르, 2011년)
상세보기


[ 1부 ] 웹 개론
Chapter 01_ 웹이란 무엇인가? 
Chapter 02_ 웹의 역사
Chapter 03_ REST-웹 아키텍처 스타일
[ 2부 ] URI
Chapter 04_ URI의 스펙
Chapter 05_ URI의 설계
[ 3부 ] HTTP
Chapter 06_ HTTP의 기본
Chapter 07_ HTTP 메서드
Chapter 08_ 스테이터스 코드
Chapter 09_ HTTP 헤더
[ 4부 ] 하이퍼미디어 포맷
Chapter 10_ HTML
Chapter 11_ microforms 
Chapter 12_ Atom
Chapter 13_ Atom Publishing Protocol
Chapter 14_ JSON
[ 5부 ] 웹 서비스의 설계
Chapter 15_ 읽기 전용 웹 서비스의 설계 
Chapter 16_ 쓰기 가능한 웹 서비스의 설계
Chapter 17_ 리소스의 설계




WRITTEN BY
뮤네

,


프로그래머의길멘토에게묻다
카테고리 컴퓨터/IT > 프로그래밍/언어 > 프로그래밍일반
지은이 데이브 후버 (인사이트, 2010년)
상세보기

여러번 생각한 적이 있었다. 
정말 구체적으로 어떤식으로 공부해야 하고, 어떤 식으로 사고해야 하고, 어떻게 배워야 하는 지를 분명하게 알려주는 그런 사람 혹은 책, 글이 있었으면 좋겠다고.. 이 책이 바로 그런 책인 것 같다. 
그래서 이 책을 보는 동안 난 너무 감사하고, 감탄하고, 너무 즐거웠던 것 같다.
이 책의 제일 좋은 점이라면 자신의 상황을 선택하고, 그 상황의 문제점과, 해결책을 제시하고, 구체적인 실천 방안까지 제시한다는 점일 것이다. 뭉뚱거려서 어떤 조언이나, 예문만 적혀있었다면 실망했을텐데 당장 할 수 있는 실천 방안을 볼 수 있어서 너무 좋았다. 
아래 목록은 내가 실천하고 싶은 항목들과 구체적인 실천방안만 요약한 부분이다.

1. 잔을 비우다.

구체적인 기술
: 자신이 원하는 역량들을 가진 사람의 이력서를 조사해서, 그 중에서 자신이 들어가고 싶은 팀이나 회사에 필요한 역량을 찾고, 그 역량을 보여줄 수 있는 프로젝트를 시작해라.
: 자신의 이력서를 정기적으로 검토하고 자신이 할 수 있는 기술들을 작성한 목록을 만들어라.

무지를 드러내라.
: 업무에 관해서 가장 자신이 이해하지 못하는 5가지를 적어놓아라. 그 목록을 다른 사람들이 볼 수 있는 곳에 두고 자신의 업무가 바뀔 때마다 그 목록을 갱신해라.

무지에 맞서라.
: 그 목록을 각각에 대해서 학습하고, 목록에서 지워라. 학습하면서 다시 드러난 무지,빈틈을 목록에서 추가한다.

2. 긴 여정을 걷다

지속적인 동기 부여
: 자신에게 동기 부여가 되는 일을 최소 15가지 이상 적어보고, 잠시 기다렸다가 5가지를 추가적으로 더 적어보라. 그 다음에 당신에게 가장 중요한 동기를 부여하는 역할을 골라보라. 그 목록을 힘든 시기에 볼 수 있도록 잘 보관해라.

자신만의 지도를 그려라.
: 지금 현재 일자리에서 이어질 것 같은 일자리를 3가지를 나열하고, 그 3가지에서 뻗어 나갈 수 있는 일자리를 3개, 그리고 또 3개 총 27가지 일자리 목록을 적는다. 그 목록을 보며 자신이 바라는 경력인지를 생각하고, 맘에 들지 않는다면 다른 일자리를 가지고 되풀이 해보자. 외국을 나간다거나, 새로운 자격증,새로운 외국어, 사업을 시작한다면이라는 물은표를 가지고도 고민해 봐도 좋다.

3. 정확한 자기 평가

가장 뒤떨어진 이가 되라.
: 주변을 당신보다 뛰어난 개발자들로 채워라.

멘토를 찾아라 + 마음 맞는 사람들 + 팔꿈치를 맞대고
: 커뮤니티를 찾아서, 그 모임들에 직접 참여하면서 가장 흥미로운 그룹을 찾아라. 오픈 소스 프로젝트에 관심있는 사람을 찾아서 그 프로젝트를 같이 일을 해 본다.

4. 끊임없는 학습

능력의 폭을 넓혀라 + 연습,연습, 또 연습 + 부숴도 괜찮은 장난감
: 구글리더, 소프트웨어 개발 관련 블로그 글을 구독해라.
: 책들 중에서 자신이 풀기엔 어려운 연습문제를 찾아서 4주동안 일주일에 한번씩 다시 풀어보고 그동안에 해법이 어떻게 발전해가는지 관찰해라.
:업무에 관련되지 않게, 좋아하는 도구들을 총 동원해서 간단한 위키나 게임을 만들어보라. 시간이 지나면서 기능도 더 추가하고, 여러가지 실험이나 학습을 할 수 있다.

소스를 활용하라.
: sourceforge.net, Github, Google Code 들을 잘 둘러본다.
복잡한 오픈 소스 프로젝트를 하나 골라서 그 소스들을 보고 생소한 알고리즘이나 설계, 자료구조 들을 기록해 두고 프로젝트의 구조와 새로운 아이디어에 대한 블로그 포스트를 써라.

배운것을 기록하라 + 배운것을 공유하라.
: 책이나 배운것에 대한 당신의 생각이나, 읽은 뒤에 떠오르는 아이디어를 메모한다.
: 가장 좋았던 배운 것에 대해 블로그 글을 써라. 그 블로그 글을 컨퍼런스에서 발표한다고 생각하고 그 발표의 개요를 구상해 보라.

5. 학습 과정의 구성

독서 목록 + 꾸준히 읽어라 + 고전을 공부하라
: 지금 현재 읽고 있는 모든 책의 목록을 타이핑해 넣어라
: 지금 읽고 있는 책을 읽은 다음에 무슨 책을 읽을 것인지 결정해라. 읽을 책의 우선순위를 정해라
: 책을 읽으면서 잘 모르겠는 개념이 어떤 뜻이며, 어떤 책에 있는지 알아보고 독서목록에 추가해라.


'Book' 카테고리의 다른 글

실용주의 프로그래머를 위한 단위테스트  (0) 2011.08.02
웹을 지탱하는 기술 책 내용 정리  (0) 2011.07.20
행복한 프로그래밍 _ 임백준  (0) 2010.06.17
2010 년도 읽은 책  (1) 2010.06.03
불평 없이 살아보기  (2) 2010.05.29

WRITTEN BY
뮤네

,

행복한 프로그래밍
카테고리 컴퓨터/IT
지은이 임백준 (한빛미디어, 2003년)
상세보기


p.50 : 프로그래밍을 배운지 얼마 되지 않은 사람들은 자신이 작성한 프로그램이 일단 돌아가기만 하면 감격한다. 나도 그랬다. 처음에는 프로그램이 돌아가도록 만드는 것말고 다른 것은 생각할 여유가 없다. 자신이 작성한 프로그램이 원하는 결과를 낳는 것을 눈으로 확인하는 것만으로도 가슴이 벅차고 심장이 두근거리기 때문이다.

p..52 : 대부분의 사람들은 여기에서 멈춘다. 이 정도면 크게 나쁘지 않다고 보고 더 이상 고민하지 않는 것이다. 이러한 프로그래머가 작성하는 알고리즘은 대개 주어진 일을 처리하는 데 있어서 크게 문제를 일으키지 않는다. 가끔 버그가 발견되거나 성능에서 문제가 나타나기도 하지만, 그 때마다 필요한 수정을 가해서 프로그램을 유지해나간다..... 이런 사람들은 실력이 부족하다기보다는 집중력이 부족한 것이다. 능력이 없는 것이 아니고 열정이 부족한 것이다. 하지만 프로그래밍을 삶을 (전체는 아니더라도 최소한 일부) '목적'으로 대하는 프로그래머들은 다른 사람이 19분보다 빠른 방법이 있다고 말해주지 않아도 스스로 고민을 시작한다. 더 빠른 방법이 있는지조차 확실하지 않지만 커피를 한잔 마시면서 새벽까지 고민한다. 이유는 없다. 그러한 고민을 하는 순간이 세상에서 두 번째로 행복한 순간이기 때문에 고민을 하지 않을 수가 없을 뿐이다. 그럼 세상에서 첫번째로 행복한 순간은? 당연히 고민하던 문제를 풀어서 심장에 전류가 흐르는 듯한 쾌감을 느끼게 되는 순간이다. 말하자면 프로그래머는 그 쾌감을 잊지 못해서 끊임없이 키보드를 두드리게 되는 일종의 '쾌감 중독자'인 셈이다.모든 일이 다 그렇지만 보통의 프로그래머와 뛰어난 프로그래머는 이렇게 열정이 있는가 없는가에서 판가름난다.

p. 121 : 오늘날에도 널리 사용되고 있는 C언어는 프로그래머들이 쉽게 이해할 수 있는 고급언어 문법 구조를 가지고 있으면서도 CPU와 메모리라고 하는 비트의 세계 깊숙한 곳까지 들어갈 수 있도록 해주는 기능을 가지고 있기 때문에 엄청난 주목과 찬사를 받으면서 단숨에 70년대와 80년대를 관통하는 최고의 프로그래밍 언어로 등극했다.

p.122 : 모든 프로그래밍에서 객체 지향 언어가 절차 중심의 언어보다 더 낫다고 볼 수는 없지만 절차 중심의 언어가 해결하기 어려운 문제를 객체 지향 언어로 풀 수 있다는 점에서 본다면 그 둘의 차이는 분명히 존재한다. 절차적인 언어의 핵심은 바로 특정한 알고리즘, 혹은 절차(procedure)를 중심으로 문제를 해결해나간다는 것이다. 알고리즘이나 절차는 특정한 함수안에 보관되는데, 누군가 그 함수를 호출하면 함수 내부에 저장되어있는 알고리즘이 실행된다. 다시 말해서, 절차적인 언어의 핵심은 내가 입력을 보내면 잠시 후에 출력 결과를 되돌려 주는 함수라고 볼 수 있다.

p.127 :  훌륭한 화가가 처음에는 다른 사람의 그림을 똑같이 그리는 연습을 하고 뛰어난 바둑 기사가 처음에는 고수들이 둔 바둑의 기보를 열심히 읽어보듯이, 수준 높은 프로그래머가 되기를 꿈꾸는 사람은 실력이 뛰어난 프로그래머가 작성한 프로그램을 많이 보고 똑같이 흉내를 내 볼 필요가 있다.......아무리 실력이 뛰어난 프로그래머가 작성한 코드라고 해도 개선의 여지는 항상 남아있기 마련이다. 따라서 남의 프로그램을 분석하거나 학습할 때 자기만의 주관과 철학을 가지고 비판적인 시각으로 바라보는 자세는 대단히 중요하다.

p.144 :  이러한 실천과 실험 속에는 새로운 기술적인 내용이나 변화를 학습하는 것이 포함되어 있지만 지나치게 새로운 것만을 좇아 다니는 것은 가볍고 무망하다. 진정한 힘은 인기를 끄는 프로그래밍 언어의 문법적인 측면이나 단편적인 기교를 습득하는 데서 나오는 것이 아니라 근본적이고 고전적인 내용을 학습하는 데서 더 많이 쌓이기 때문이다.

p.212 : 내게 영향을 주었던 프로그래밍에 대한 그의 철학은 너무나 뚜렷했기 때문에 한 마디로 압축될 수 있을 정도였다. '소설처럼 읽히는 프로그램' ..... 소설처럼 읽히는 프로그램이란 '보통 수준의 프로그래머'가 읽었을 때 의미가 한 눈에 이해되는 프로그램을 의미한다..... 나는 1밀리세컨드가 실질적인 차이를 불러일으킬 수 있는 소수의 특수한 프로그래밍을 제외한 모든 프로그래밍에서 '쉽게 읽히지만 조금 느린 프로그램'이 '복잡하지만 빠른 프로그램'보다 훌륭한 프로그램이라고 믿는다...... 사실 이해하기 어렵게 작성된 프로그램의 대다수는 구현하고 있는 논리가 실제로 복잡하기 때문에 그렇게 작성되기보다는 프로그래머 자신의 역량과 철학이 부재하기 때문에 그렇게 작성되는 경우가 많다. 한번 더 얘기하자. 쉬운 프로그램이 좋은 프로그램이다.

p.242 :  소프트웨어를 설계하는 일은 그 자체로 복잡한 법칙을 가지고 있기 때문에 특정한 알고리즘을 구현할 줄 아는 프로그래밍 능력만으로는 수행하기 어렵다. 설계자는 프로그래밍 능력 이외에도 복잡하게 얽히고 설킨 소프트웨어 콤포넌트나 객체들 사이의 관련성을 전체적으로 조망할 수 있는 힘이 있어야 한다. 그리고 아무 것도 없는 백지 상테에서 출발해서 살아서 퍼덕거리는 소프트웨어 덩어리를 조각할 수 있는 창조적인 능력도 있어야 한다. 그 뿐만이 아니다. 진정한 소프트웨어 설계자는 현재의 기술적인 흐름을 정확하게 읽고 있는 것은 물론 미래의 기술이 나아가는 방향도 직관적으로 감지할 수 있어야 한다.


알라딘 중고서적에서 4천원에 구입,
이번에 책 산게 많은 데, 얇고 읽기 편한책이라 제일 먼저 다 읽었음.


WRITTEN BY
뮤네

,

2010 년도 읽은 책

Book 2010. 6. 3. 23:38

프로그래밍 관련 책 (23)

액션스크립트 3.0 디자인 패턴
ACTIONSCRIPT 3.0 COOKBOOK 
액션스크립트 3.0 완벽 가이드
액션스크립트 3.0 핵심노트

프로페셔널 안드로이드애플리케이션 개발
알짜만 골라배우는 안드로이드 프로그래밍 
시작하세요! 안드로이드 프로그래밍 
UML, 실전에서는 이것만 쓴다.
성공과실패를결정하는 1% 객체지향원리
ADOBE FLEX 3 실전 트레이닝 북

flex3 예제 따라하기

자바 헤드 앤 퍼스트
액션스크립트 정석
애자일 프랙티스
조엘 온 소프트웨어
켄트벡의 구현패턴
프로그래밍 수련법
행복한 프로그래밍
패턴 그리고 객체지향적 코딩의 법칙

오픈 API를 활용한 매쉬업 가이드


Refactoring 리팩토링                  

클린코드                                    

실용주의 프로그래머   


자기 개발(35)

집중의 기술
시크릿 두번째 이야기
토니 부잔의 마인드맵 북
여자는 왜 다른 여자를 훔쳐볼까
국내파 100인의 해외취업 성공기
불평없이 살아보기
일하는여자 진짜재미있는 인생이시작된다
20대가 끝나기 전에 꼭 해야 할 21가지   
몰입
끌리는 사람은 1%가 다르다

생각 정리의 기술 
독한 것들의 진짜 다이어트
4개의 통장
대한민국 20대, 재테크에 미쳐라 시즌2
탁월함에 이르는 노트의 비밀
이인혜의 꿈이 무엇이든 공부가기본이다
행복한 이기주의자
공병호의 초콜릿
공병호의 내공
여자의 모든 인생은 20대에 결정된다

프레젠테이션 달인이 된 최 대리
프로페셔널의 조건
마법의 5년
목표에 집중하라
백만불짜리 습관
프린세스 마법의 주문

스위치

메모의 기술

앨리스의 비밀통장

여자를 바꾸는 5분 혁명


10가지 자연법칙 - 성공하는 시간관리와 인생관리를 위한                                          

성공하는 사람들의 7가지 습관

잠자기 30분

아침 30분

언제나 미루는 당신이 지금 당장 행동하게 되는 50가지 방법


소설 및 기타 (4)
블링블링
트위터 200%활용 7일만에 끝내기
파피용
나무



WRITTEN BY
뮤네

,

불평 없이 살아보기

Book 2010. 5. 29. 03:03


불평 없이 살아보기
카테고리 자기계발
지은이 윌 보웬 (세종서적, 2009년)
상세보기


  이번주 내내 작업했던 일은 3월달에 작업했던 이벤트를 리뉴얼 하는 작업이었다. 저번에 3월달에 작업할 때도 그냥 쉽게 생각하고 들어갔다가 만드는 데는 얼마 안걸렸는데 수정을 2,3주정도 했었었다. 작업기간을 다 합하면 한달 정도나 걸렸었던 이벤트였다. 툭하면 야근했고, 집에 돌아갔다가도 다시 돌아와서 작업해야되는 일도 많았었고, 이해할 수 없는 수정들을 계속해야 했던게 좀 힘들었었던 것 같다.  다른 동료들에게 그거 아직도 해? 라는 말을 엄청 들었었던 작업이다. 기간이 길고, 고충도 많았던 터라 3월 달에 이 일을 했던 기획자언니하고도 많이 친해졌었는데, 얼마전에 퇴사하고 다른데로 이직하면서 담당자가 바뀌었다. 이번엔 다른 기획자 언니인데, 역시 이 일하면서 꽤 친해졌다. (나만 그리 생각할지도..;)

  그런데 이번 작업을 진행하면서 느낀점이 좀 있었다. 얼마전에 집에 있길래 본 책이 있는데 그 책 제목이 "불평없이 살아가기"라는 책이었다. 책에서 보면 자기가 긍정적이고 불평을 많이 안하는 것 같은 사람도 보면 하루에 꽤 많은 불평을 하면서 살고 있다는 것이 나와있었는데, 나도 그렇게 생각했었다. 나는 꽤 긍정적이고 불평을 별로 하지 않는다고 생각했었다. 근데 그게 아니라는 것을 이번 작업에서 깨달았던 것이다. 사실 이번 작업도 수정이 굉장히(!!!) 많고, 고치고, 고치고 고쳐야 했지만 저번보다는 별로 힘들지 않았다. 중요한 작업은 다 개발한 상태였고, 저번에 구조 짠것중에 맘에 안드는 부분을 수정하고, 주석을 친절하게 다 달면서 꽤 괜찮은 코드인데 혼자 자화자찬하면서 짜느라 재미있기도 했다.

  문제는 기획자와의 친분(?)을 위해 어쩔수없는 불평을 해야만 했다는 것이다. 기획자와 공통적으로 통하는 부분일수 밖에 없는 클라이언트 욕하기를 엄청했었다. 솔직히 클라이언트 욕하기를 같이 하면서도 계속 머리속으로는 불평하고 싶지 않다를 외쳤던 것 같다. 그 책을 봤기 때문이기도 하고, 불평을 하면할수록 내가 피곤했기 때문이다. 별로 힘들지 않은 수정은 불평으로 인해 굉장히 짜증나는 일이 되었고, 인상을 쓰면서 수정을 하게 만들었다. 즐겁게 할 수 있는 일을 짜증내면서 하는 건 나에게 별로 좋지 않은 일이다. 

  그러고 보면 습관적으로 불평을 하는 일이 꽤 많다는 생각이 들었다. 특히 이번같이 친분을 위해 불평을 하는 일은 참 많다. 친구들을 만나면 경쟁이라도 하듯이 일이 힘들다를 외치고, 누군가를 욕하고, 나라를 불평하고, 그래야만 얘기를 할 수 있다는 듯이. 불평하는 것은 굉장히 쉽고, 내가 불평하면 주변사람들은 그 불평에 대해 맞장구를 쳐주며, 주위사람들의 친절을 받을 수 있다. 그 불평에 반대하더라도 말을 하지 말아야 한다. 그 분위기에 초를 치게 되는 것이니까. 그러나 그렇게 불평을 다하고 나면 기분은 좋을까. 좋지 않다 일이 해결되지도 않을 뿐더러 기분이 씁쓸하기만 하고 나를 더 불평의 구렁텅이에 빠지게 하는 일임을 알아야 한다.

 책에 보면 이런 내용이 있다.

  심리학자 로빈 코발스키 박사는 "불평은 대부분 다른 사람들로부터 동정이나 인정 같은 특별한 대인관계상의 반응을 얻어내려는 심리를 동반한다. 예를 들어 사람들이 자신의 건강에 대해 불평하는 것은 실제로 아파서가 아니라 아픈 사람이라는 역할이 그들로 하여금 동정이나 피하고 싶은 일을 안 해도 되는 것과 같은 부차적인 이득을 얻게 해주기 때문이다" 고 강조한다. 나는 뚱뚱하다는 사실에 대해 불평을 늘어놓음으로써, 즉 '뚱뚱하다'라는 카드를 사용함으로써, 동정과 인정을 받아냈고 여자아이들에게 말을 걸지 않아도 되는 핑계거리를 확보한 것이다.(67쪽)  
   21일 프로젝트에서 가장 중요한 것은 누군가가 불평하는 것을 듣게 되더라도 그러한 불평에 연루되어서는 안된다. 사람들은 자신들의 말로 당신의 동조를 끌어내고 당신 또한 그들의 동조를 끌어내려고 한다. 대화가 부정적인 방향으로 흘러가면 그저 묵묵히 지켜보라. 다른 사람을 변화시키려고 노력하지마라. 단지 불평없이 사는 사람이 되려고 노력하는 중이라고만 말하라.(100쪽)
   또한 우리 자신이 불평을 하는 것은 위험을 감수하지 않기 위해, 해야 할 일을 하지 않기 위한 것이다. 그 경우 불평하는 것이 정당한 것처럼 보이지만 실제로 이러한 불평은 얄팍한 변명에 지나지 않는다.(114쪽)


  나 같은 경우 친구들을 만나면 회사다니는 거 어때 하고 물어보면 항상 좋다고 그렇게 말한다. 일이 재미있다고, 회사도 좋고, 회사사람들도 재밌고, 회사다니는게 즐겁다고. 물론 그게 사실이기도 하다. 그러면 친구들은 하고 싶은 일을 하니까 좋겠다라던지 어떻게 일이 재밌다고 말할수 있냐고 신기하다고 말하곤 한다. 그래도 이런식으로 내가 먼저 긍정적인 얘기를 하게 되면 점점 대화는 생산적(?)인 대화가 많이 나오는 경우가 많았다. 자신이 하고 싶은 일이라든지, 목표라든지, 재태크에 관한거라든지, 요즘 열중하고 있는 일이라든지 그렇게 되면 친구들끼리 서로 정보도 공유하고 서로 격려하고 응원해주고 그랬던 것 같다. 물론 분이기가 항상 그렇지는 않고 나도 불평 많이 할 때는 많이 하긴 하지만 말이다.

  결국 스트레스를 받던 나는 그 기획자언니랑 많이 말을 하지 않는 방향으로 바꾸기로 했다. 아무리 봐도, 내가 클라이언트를 불평해서 이득보는 일은 없다. 피곤하기만 할뿐이다. 그런거에 에너지를 쓰지 말아야겠다고 생각했고, 어제,오늘은 기획자가 울상을 지으며 나에게 수정사항을 가져왔어도 그냥 받고 아무말도 안하고 속으로 아무것도 아니다, 수정사항은 당연하다를 외치며 작업했다. 그제서야 마음이 좀 편안했다. 길게도 썼지만, 뭐 불평하면서 살지 말자는 얘기 , 불평하면 할수록 손해보는건 나니까^^;

  글에는 친분을 위해 불평을 자주하게 된다는 얘기만 썼지만, 다른 좋은 얘기도 많은 책이다. 그냥 한번 보면 스스로 불평을 하면서 살지 말아야겠다는 생각을 심어주게 되는 꽤 괜찮은 책이다.





WRITTEN BY
뮤네

,