• 카테고리
    • 전체 글

    • 카테고리1
    • 카테고리2
    • 카테고리3
    • 카테고리4
  • 태그
  • 방명록

'분류 전체보기'에 해당되는 글 1246건

  • 2008.04.07 ASP.NET Postback에 대한 분석 (1) 3
  • 2008.04.07 페이지 보안 오류
  • 2008.03.26 스팸 트랙백 없애기! 6
  • 2008.03.26 SPList의 문건에 대한 읽기/쓰기에 관한 속성 처리. 4
  • 2008.03.24 SI에 대한 내 멋대로의 생각
  • 2008.03.10 공식적인 본사근무
  • 2008.03.10 점점.....빠져든다.
  • 2008.03.10 혼자 영화 보기. 2

ASP.NET Postback에 대한 분석 (1)

기술자료/.NET 2008. 4. 7. 20:16

ASP.NET에서 사용되는 각종 서버 기반의 Control ( Button, TextBox 등등 )이 동작하는 방법을 가만히 살펴보면, 일부 컨트롤에서는 화면 리프레쉬 없이 동작하곤 한다. 또, AJAX 기분을 내기 위해 특정 영역 부분의 데이터만 업데이트 할 때가 있다. 보통 이런 경우 ASP.NET에서 제공하는 Postback이라는 기능을 알게 모르게 사용하게 된다.

왜 이런 기묘한 구성요소를 만들었을까?
일단 왜 이런 것이 필요한지에 대해 살펴보면서 진행하도록 한다. 과거 ASP나 PHP로 웹 응용 프로그램을 짜게 되면, 이른바 Ghost 페이지라는 것을 만들어 사용한다. 화면에 사용자의 입력을 받는 Form을 만들고, 그 Form의 Action 부분에 Ghost 페이지의 URL을 적어 동작하게 한다. 그래서 사용자가 입력 후 Submit 이라는 Form 동작을 하면 자동으로  이 Ghost 페이지를 호출하게 한다.
호출 되는 이 Ghost 페이지는 앞서 있던 Form에 있는 사용자 입력 값들을 GET이든 POST으로든 값을 받아, 이 값을 이용하여 서버에서 처리해야 되는 작업( 데이터베이스 입/출력 또는 비지니스 로직 등등)을 수행하게 된다.
이에 반해 ASP.NET에서는 Ghost 페이지 역할을 없애고 대신 이 Postback이라는 기능으로 대처하게 되었다. 즉 Form에서 Submit을 할 때, 예전 처럼 Ghost 페이지를 부르는 것이 아닌 자기 자신의 페이지를 부르는 것이다. 만일 default.aspx 페이지에 사용자 입력용 Form이 있다면, 그 Form에서 Submit을 하면 default.aspx를 다시 부른다는 것이다. 그래서 사용자의 입력값들을 모두 default.aspx 페이지 내에서 처리해 줄 수 있게 되는 것이다. 한개의 페이지 내에서 다양한 사용자의 액션도 처리할 수 있고, 보다 서버와 유기적으로 동작할 수 있다는 것이다. 페이지 리다이렉트 로 인해 발생되는 보안적인 오류( 이 Ghost 페이지에 별도 추가 설정을 하지 않는 경우 몰래 이 Ghost 페이지만 접속하여 해킹을 할 수 있다. )도 해결할 수 있고, 구현 작업을 위한 각종 소스가 별도 페이지로 쪼개지지 않아 유지보수에도 우수하다. 그외에도 이런 저런 장점이 있지만, 자세한 내용은 ASP.NET 관련 책자나, 사이트를 참조하도록 한다.

이제 이 Postback의 동작 원리를 살펴보도록 하겠다.
이 Postback의 동작을 따라가기 위해서는 먼저 ASP.NET으로 된 Page의 Life cycle 파악이 필요하다. 영어로 Life Cycle이라고 적어 뭔가 고상해 보일지는 모르겠다. 간단히 말해서 서버 상에서 이 ASP.NET 페이지가 언제 메모리에 올라갔다가, 언제 내려가는지를 살펴 보는 것이다.
ASP.NET으로 만든 페이지 자체가 HTML을 의미하는 것이 아니기 때문에, 웹서버에서는 이 ASP.NET 페이지를 메모리에 올려 각종 로직들을 처리하고 그 결과 값에 해당하는 HTML을 생성해서 뿌려주는 것이다. 즉 이런 전체 흐름을 보고 바로 Life Cycle이라 표현 한 것 뿐이다.

즉 Postback이 동작할 때 저 Life Cycle 중 언제 동작하는지를 명확히 알기 위해서는 바로 이 ASP.NET 페이지의 Life Cycle에 대한 이해가 필요하기에 먼저 그 부분을 짚고 넘어가도록 한다.

맨처음 ASPX 페이지를 Web Browser를 이용하여 Load 하게 되면 바로 ASP.NET 페이지의 Life Cycle이 시작된다. 아래의 그림을 보면 Page Load, CreateChildControl, OnPreRender, SaveViewState, Render 이런 순으로 나열 되어 있는데, 이 나열들의 하나하나들은 System.Web.UI.Page 에 만들어져 있는 각각의 메소드들을 의미한다.
보통 ASPX 페이지를 만들게 되면 System.Web.UI.Page를 상속 받아 구성하게 되는데, 상속 받게 되면 그 안의 메소드들이 자동으로 ASPX 페이지에 있는 것 처럼 된다. 물론 자신의 ASPX 페이지 내에 아래와 같은 메소드가 없어도 되는 것 같다고 말씀하시는 분이 계실지 모르겠는데, 만일 ASPX 페이지내에 해당 메소드를 구현 하지 않았다면, System.Web.UI.Page 클래스 자체에 있는 각각의 메소드를 대신 호출 하게 된다. 사실 ASP.NET 페이지를 가지고 여러가지 작업을 하게 되면 보통 아래의 순서들에 제신된 메소드들을 override 해서 대부분 쓰게 된다.

다시 원점으로 돌아와서, ASPX 페이지가 맨처음 불리게 되면 웹서버의 메모리에 올라가게 된다. 그 시점에 실행되는 부분이 바로 Page Load 부분이다. 이 부분은 대개 초기화에 관련된 사항들을 많이 넣게 된다. 그리고 난 뒤 CreateChildControl 이다. 완전 처음 부터 ASP나 PHP 등의 순수 웹 응용프로그램 언어 부터 출발하신 분들 께서는 이 부분이 명확하지 않은들 싶은데, 이 개념은 어떻게 되면 Windows 응용 프로그램 개발 프로세스에서 돌출된 사항으로 생각된다.
즉 ASP.NET에서는 System.Web.UI.Page 라는 큰 틀 안에 Control들을 붙인다는 생각에서 출발한 것이다. 예전에는 사용자 입력하는 값들이나 보여주는 부분을 대부분 HTML 페이지 내에 Form을 만들어 구성했었다. 그렇게 되면 사실 서버와는 완전히 분리되어 Form에서 Submit을 할 때까지는 서버와의 데이터 통신이 불가능하다. 그래서 ASP.NET 에서는 Server Control 이라는 개념을 만들었다. 그래서 그 컨트롤들을 System.Web.UI.Page 내에 붙여서 마치 Window Form 프로그램에서 처럼 넓다란 Form 위에 컨트롤들을 얹어 얹어 만드는 것처럼 구성한 것이다.
보통 해당 객체 내에 있는 Controls 라는 콜랙션 내에 더해주는 것으로 처리하게 된다.
(예 : Button btnOK = new Button; this.Controls.Add(btnOK); )
이런 유형의 소스 구현을 바로 CreateChildControl에서 수행한다.
다음은 OnPreRender. 이를 설명하려면 Render라는 것을 먼저 언급해야 할 것 같다. Render라는 것은 현재 Page 클래스내에 있는 Control들을 모두 합쳐 만든 HTML을 생성해주는 부분이다. 즉 실제 그리기 부분으로 이 부분에 직접 HTML을 뿌려주게 할 수 도 있고, CreateChildControl 에서 Controls.Add(xxxxx)를 통해 조립한 뒤 그 조립한 그대로를 자동으로 HTML화 시켜주기도 한다. 그런데, 이렇게 Render 하기에 앞서, UI에 관련된 일부분의 데이터 조작이나 수정작업을 할 때, 여기서 처리하게 된다. 대개는 PageLoad나 CreateChildControl에서 해주기는 하지만, 가끔Control이 생성되고 Add 되고 난 뒤, 별도 조작을 해야 하는 경우 바로 이 OnPreRender에서 그 뒷처리를 하곤 한다. 그리고 SaveViewState. 페이지가 새로 고침을 하는 경우 보통 HTML로 만든 경우 Input 내에 있는 각종 값들은 날라가게 된다. 그에 반해 ASP.NET을 이용해 만든 TextBox의 경우에는 새로 고침을 해도 값이 안전하게 담겨 있는 경우가 있는데, 그게 바로 이 SaveViewStatus 단계 때, 어떤 값들을 어떤 순서로 저장되는지를 정의하는 부분이다. 사용자가 Button을 누르게 되면 화면이 자동으로 새로 고침하게 되는데, 이 경우 ASP.NET의 Life Cycle이 Redner를 실행한 뒤, 모든 데이터가 사라지게 된다. 즉 C#으로 Behind Code로 클래스를 만들었을 때, 클래스 내의 맴버 변수들의 값들도 모두 사라지게 된다. 이 값들을 임시라도 저장을 할 때 이 부분에 구현하게 된다. 값을 실제 저장하는 방법들은 ASP.NET에 관한 다른 책들이나 자료를 참고하도록 한다. 마지막으로 Render.드디어 각종 처리를 수행한 뒤, 실제 HTML을 찍는 부분이다. 여기서는 HttpTextWriter 라는 개체를 제공하는데, 그 안에 원하는 HTML을 쓰거나, 아니면 base.Render()를 실행해서 해당 Page에 딸린 각종 서버 기반 Control들을 HTML화하여 자동으로 써지게 하는 것이다.

자 위의 Render 까지 하게 되면 실제 웹서버 상에서 해당 페이지 HTML을 클라이언트에게 제공하고, Page 및 그에 딸린 Behind Code들은 메모리 밖으로 퇴출된다. 즉, 모든 데이터들이 사라지게 되는 것이다. ( 물론 SaveVIewState에 저장해 놓을  수 있다. )

위는 ASP.NET 페이지의 Life Cycle이였다면, 과연 이 Postback은 언제 동작하는 것일까?.
일단 위의 모든 Life Cycle이 끝나야 한다. 실제 Postback 처리는 사용자가 실제 수행하는 동작을 대처하기 위한 부분이기 때문에, 무엇보다 선결되야 하는 것인 사용자의 웹브라우저에 HTML로 그림이 확실히 그려져 있어야 한다는 것이다. 그러기에 위의 단계가 완전히 끝나야, 실제적인 Postback이 실행 될 수 있는 조건이 된다.

Postback을 부르기 위해서는 대부분 Javascript를 사용하게 된다. 만일 Button 이라는 서버 기반의 컨트롤이 있다면, C#에서는 Button btnOK = new Button(); btnOK.Text = "OK!"; this.Controls.Add(btnOK);와 같은 단 세줄의 코드로 끝내져도, 실제 HTML로 찍히게 되면, 실제 Javascript를 이용하여 실행될 수 있도록 한다. 즉 ASP.NET의 서버 컨트롤이 진짜 서버에서 실행 동작된다고 보면 안되고, 실제로는 서버 컨트롤의 HTML + Javscript가 바로 그 서버 컨트롤이 된다.
Button .... 이라는 소스는 <input type="button" ..... >이 되고, 저 <input 태그 내에 Javacript로 서버를 다시 부르게 끔 하는 것이다.

아래의 그림을 보면 Callback이라고 적힌 부분이 있는데, Postback으로 이해를 하도록 한다.
자 아래의 Run Callback이라는 부분이 있다. Button에 해당하는 HTML 소스를 끄집어 내 보면 그 안에 click="webform.doPostback(......."  뭐 대충 이런 느낌의 메소드가 들어 있다.
바로 그 부분이 javascript 부분이고, 그 자바 스크립트에서는 각종 필요한 정보를 서버에 보내기 쉽게 구성하는 것이다.

자 이 Postback이 실행되면 어떻게 동작하는 것일까?
아래의 그림을 보시면 대략적인 Postback이 동작하는 그 순서를 볼 수 있을 겁니다.

맨 위의 Run Callback 이라는 부분이 있는데, 그 부분이 바로 Javascript로 된 서버 호출 로직을 담고 있는 부분이다. 이 부분이 기본 ASP.NET 컨트롤이라면 저 Run Callback이 Form의 Submit 으로 동작하는 부분일 것이고, 별도 PostBack 기반의 Callback Interface를 만들어 구성한 경우라면 Javascript로 실행하게 될 것이다. 여기서는 Javascript로 구성한 사용자 정의 Postback을 기준으로 나열할 것이므로 위의 그림이 나오는 것이다.

자 그림을 보면 Postback을 실행하는 경우 LoadViewState를 한뒤 CreateChildControl을 하고 Page를 Load 한다. 그리고 난 뒤 실제 Callback을 실행한다.
아까 맨처음에 떳던 그림과는 순서가 조금 다르지 않은가?

일단 제일 큰 차이점은 바로 Render 부분이 없다는 것이다.
Postback이 발생하였을 때, 실제 페이지에 대한 그림 그리는 부분은 없고, 단지 서버 상에서 ViewState를 복구하고 서버 컨트롤들을 구성한 뒤, Page Load 부분을 수행한다. 그리고 난뒤 Callback에 대한 실제적인 처리를 시작하게 된다. 그림 없이 데이터만 복구 하고 데이터만 돌려주는 구조라는 것이다.

위의 Page LifeCycle을 보면서 Callback에서 처리해야 하는 데이터에 대해 어떻게 보존할 것인지, 그리고 어떻게 처리할 것인지를 판단하면서, 맞추는 것이 관건이다.
초기 ASPX 페이지가 Load되서 Render된 후 Page Unload 되는 순간 모든 데이터는 파괴된다. ( 특히 aspx.cs 파일 내에 정의한 각종 member 변수들 ) 만일 이런 값들을 Callback에서 사용을 한다면 반드시 SaveViewState에서 저장해 놓도록 한다.

그리고 실제 Callback이 처리되어야 하는 로직에서는 RaiseCallbackEvent 에서 처리하도록 한다.

각 상세 코드는 2편에서 계속하도록 한다.

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

페이지 보안 오류

기술자료/.NET 2008. 4. 7. 14:58

MOSS 관련 도구를 ASPX로 만들때 종종 아래와 같은 SPException에 빠져 작업을 할 수 없는 경우가 있다.

"이 페이지에 대한 보안 유효성 검사가 잘못되었습니다. 웹 브라우저에서 [뒤로] 단추를 클릭하고 페이지를 새로 고친 다음 작업을 다시 시도하십시오." [ The security validation for this page is invalid. Click Back in your Web browser ]

초기에는 해당 페이지의 보안 유효성의 문제에 대한 정확한 정의를 알지 못해 오로지 짐작으로만 대략 파악하고 있어, 이에 대한 대처 방안이 전혀 없었다.
혼자 만의 짐작으로는 한개의 ASPX 내에서 너무 다양한 일을 수행하여 Page 자체의 Time-Out 이 걸렸거나, 아니면 SPList를 수정하는 도중 SPListItem의 설정을 동시에 수정하려 하거나 해서 발생하는 것이라 판단했었다.

그러나 어느것 하나 명확치 않았고, 더욱이 해결 방법이 너무 모호해서 알수 없었다.
이 중 헤딩 끝에 간신히 나름 '이거다!' 라고 판단 된 부분만을 언급하도록 하겠다.

1. 위치가 다른 자원을 접근 시도 할 때.
보통 관리용 ASPX 페이지를 작성 한 뒤, 이 페이지를 접근할 때 http://hostname/_layouts/xxxxx.aspx 이런 식으로 하게 된다. 그런데, 만일 저 xxxxx.aspx 페이지 내에 다른 사이트의 SPSite를 열어서 그 안의 값을 수정하는 경우에 바로 페이지 보안 오류가 발생한다.

다시 정리하자면, http://hostname/_layouts/xxxxx.aspx 를 띄운 뒤,
내부 코드에서 SPSite site = new SPSite("http://hostname/sites/childsite") 라는 코드가 들어 있고, 저 site 라는 변수를 통해 web을 얻고(site.RootWeb) 그 web의 Title을 수정하는 경우다.

즉 xxxx.aspx 페이지는 hostname 이라는 Site에서 띄운 것인데, xxxx.aspx 페이지안에서 처리하는 사이트는 hostname/sites/childsite 인 것이다. MOSS 입장에서는 hostname에 소속된 xxxx.aspx 페이지 주제에 다른 site의 자원을 접근하여 처리하는 것을 용납하지 못한다는 의미로 판단하면 된다.

이 경우, 여러 사이트의 자원을 일괄적으로 변경할 필요가 있다면, 별도 Windows Application으로 만들거나, STSADM에 명령어를 추가 구성해서 STSADM을 이용하여 변경하도록 한다.
만일 굳이 ASPX로 하고 싶다면, 저 ASPX에서 해당 사이트로 Redirect 하여, xxxx.aspx를 다시 띄우도록 한다.
즉 this.Response.Redirect("http://hostname/sites/childsite/_layouts/xxxxx.aspx") 라고 해서 xxxx.aspx를 다시 실행하는 것이다.

 

2. 페이지에 대한 401에러 대처 기능 부재.
아마도 대부분이 이 경우에서 걸리는 경우로 들 수 있다.
보통 application.master나 default.master와 같은 MOSS 내에서 제공되는 Master 페이지를 이용하여 구성하는 경우 이 에러가 발생하지 않는데, 유독 독자적인 ASPX 페이지를 만드는 경우 발생하게 된다. 즉 빈 ASPX 페이지를 만든 뒤, 그 안에 자신이 만든 각종 코드를 넣어 실행하면 바로 페이지 보안 오류가 발생하게 된다.
그렇다고 default.master나 application.master 를 쓰자니 디자인 커스터마이징 할 때는 쥐약인 것이다.

그럼 왜 default.master와 application.master를 끼면 괜찮고, 빈 ASPX 페이지로 구성하면 이런 문제가 발생하는 것일까? 그 이유는 바로 401 에러를 의도적으로 내는 MOSS의 문제로 판단된다.

HttpWatcher 라는 HTTP 프로토콜 송수신 패킷을 확인해 보면, MOSS에서는 항상 ASPX 페이지를 띄울 때 의도적으로 401 에러를 유발하게 되는데, 애석하게도 이 경우 페이지 내 코드에서는 모든 경우에 SPException으로 떨어지게 된다.
그렇다면 우리가 만들 ASPX 페이지에서는 이 에러를 피해 갈 수 없을까?

의외로 간단하게 해결 될 수 있다.
일단 우리가 만드는 ASPX 페이지내에 <form runat="server" /> 가 필요하다. ASPX 페이지를 만들었다면 당연히 들어 있겠지만, 혹시나 해서 언급한다. 일단 Server 컨트롤 로써 동작하는 <form>을 만들어 주고, 그 안에 

  <SharePoint:FormDigest runat=server/>

를 넣어주도록 한다. 그러면 최소한 401 에러가 떨어지는 부분에 대해서는 페이지 처리 없이 넘어가고 그 뒤에 실제 코드를 실행해 주게 된다.

몇가지 더 확인해보고 검토해봐야 겠지만, 위의 2가지 경우가 현재로는 대부분 발생되는 문제로 생각되며, 그 이후에 추가적으로 발견되면 리포트 하도록 할 예정이다.

Technorati 태그: MOSS,페이지 보안 오류
728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

스팸 트랙백 없애기!

잡글 2008. 3. 26. 14:04
이 Blog라는 시스템은 다 좋은데, 문제가 트랙백이다.

사실 이 트랙백을 잘 쓰는 사람은 잘 쓰겠지만, 나 같은 무뇌한 같은 경우에는 잘 쓰지도 않는다.
그런데, 외국에서 이상한 사람들이 와서 영어로, 중국어로 된 미묘한 스팸성 트랙백을
잔뜩 걸어놓고 튄다.

한, 두개면 애교로 심심할 때 접속해서 모조리 지워라도 주겠는데,
이건 맨날 하루에 10~30건씩 등록해서, 어느날 들어와보면, 몇 페이지의 트랙백이 걸리곤 한다.
이건... 지대로 짜증이였다.

그래서 이런 저런 방법들을 찾다가 찾다가 겨우 발견한 사이트에서 그 방법을 발견했다.

http://blog.bagesoft.com/691

일단 트랙백 디비를 모조리 날리고, 다음에 각 글들에 딸린 트랙백 갯수를 초기화 한뒤,
기본적으로 올라오는 글들에 대해 트랙백 걸기를 Off 시켜주는 기능이였다.
사실 이거 Config 상에 있었으면 하지만.....
뭐 급한대로 저렇게 적용해야 겠다.

그런데, 지금 파견나온 곳에서는 telnet이 안되는 모냥;;;;;

현재까지 내 사이트에 등록된 불량 감자들!!!! ( 아래의 more... 클릭하믄 나옴 )

118.173.240.199 
12.172.207.3 
12.198.95.126 
12.201.131.66 
121.171.194.212 
122.162.42.88 
122.163.192.189 
122.163.47.112 
122.2.189.254 
122.53.107.148 
122.53.36.138 
123.195.96.225 
124.105.49.50 
124.109.33.248 
124.13.99.44 
124.171.246.229 
124.217.56.33 
124.81.178.123 
125.60.243.91 
134.241.194.28 
145.53.127.242 
158.75.249.211 
161.58.189.91 
164.83.111.254 
165.21.155.68 
167.7.9.163 
168.103.143.188 
168.187.160.146 
189.140.237.51 
189.158.93.171 
189.18.123.185 
189.18.144.227 
189.43.3.2 
189.71.137.147 
189.81.242.79 
190.136.94.209 
190.154.119.185 
190.157.184.163 
190.188.232.92 
190.22.14.1 
190.24.111.27 
190.51.187.15 
190.64.105.52 
190.64.34.143 
190.64.35.165 
190.73.52.95 
190.74.43.252 
190.86.12.206 
193.138.242.130 
194.108.126.35 
194.118.43.1 
194.145.161.21 
194.150.201.44 
194.27.90.141 
194.6.220.70 
194.85.135.245 
194.88.154.12 
195.101.158.220 
195.146.242.16 
195.172.166.226 
195.175.50.198 
195.225.178.29 
195.229.242.154 
195.5.149.89 
195.55.218.93 
195.56.81.143 
195.75.146.229 
196.209.251.3 
196.217.249.190 
198.145.182.32 
198.54.202.250 
199.217.156.114 
200.103.20.249 
200.107.35.34 
200.111.67.2 
200.121.144.240 
200.130.24.47 
200.138.148.154 
200.16.16.13 
200.218.241.34 
200.226.81.204 
200.25.235.90 
200.253.14.78 
200.31.42.3 
200.67.141.89 
200.68.73.193 
200.71.177.2 
201.194.234.254 
201.231.151.105 
201.29.16.153 
201.3.91.13 
201.35.159.224 
201.41.79.32 
201.6.130.225 
201.8.183.50 
201.8.34.106 
202.156.13.2 
202.75.52.93 
202.84.17.42 
203.144.160.250 
205.234.184.87 
206.212.242.138 
206.51.226.198 
206.51.226.243 
206.71.150.45 
207.44.147.170 
207.74.27.2 
208.109.254.156 
208.110.218.138 
208.113.170.9 
208.53.131.178 
208.53.138.54 
208.53.157.13 
208.53.170.146 
208.79.200.172 
209.17.190.78 
209.172.35.41 
209.200.16.180 
209.249.65.142 
209.250.226.82 
209.64.30.18 
210.187.27.194 
212.108.224.162 
212.122.206.52 
212.122.214.3 
212.15.182.79 
212.170.106.133 
212.183.65.187 
212.43.13.1 
213.131.75.140 
213.133.102.67 
213.148.16.237 
213.157.239.82 
213.158.196.105 
213.200.102.248 
213.229.62.177 
216.104.33.114 
216.130.161.111 
216.17.26.137 
216.246.29.104 
216.40.236.82 
216.85.19.10 
217.126.94.244 
217.160.142.111 
217.169.36.162 
217.18.135.36 
217.194.157.13 
217.197.113.46 
217.20.113.117 
217.98.12.2 
218.230.223.29 
219.147.217.91 
219.254.35.168 
220.236.82.18 
221.163.8.155 
222.127.223.71 
222.127.228.22 
222.127.228.5 
222.127.228.6 
24.184.94.239 
24.26.69.91 
24.36.95.49 
38.113.5.161 
41.250.211.28 
58.165.60.190 
59.182.247.38 
59.183.161.254 
59.52.254.223 
59.92.129.110 
60.191.220.45 
61.133.87.226 
61.247.18.7 
62.133.137.135 
62.143.142.153 
62.173.36.140 
62.21.80.24 
62.238.33.114 
62.244.71.214 
62.51.15.120 
63.249.103.120 
64.111.122.29 
64.129.209.226 
64.13.226.26 
64.131.67.150 
64.191.125.228 
64.191.71.149 
64.191.93.101 
64.20.53.18 
64.202.161.130 
64.231.238.114 
64.73.138.77 
64.79.208.243 
64.85.161.254 
65.255.133.156 
65.71.66.26 
65.98.120.201 
65.99.221.31 
66.11.229.146 
66.179.166.198 
66.197.220.230 
66.197.221.187 
66.202.56.11 
66.212.16.194 
66.212.23.141 
66.212.28.34 
66.226.79.116 
66.232.107.104 
66.232.113.128 
66.246.246.50 
66.41.135.212 
66.42.222.208 
66.6.122.148 
66.7.204.111 
66.79.163.86 
66.79.165.156 
66.79.167.222 
66.79.168.140 
66.79.171.94 
66.90.103.134 
66.90.104.149 
66.90.104.187 
66.90.118.87 
66.90.73.227 
66.90.77.2 
66.92.67.98 
67.159.41.87 
67.159.41.88 
67.159.44.136 
67.159.44.206 
67.159.44.55 
67.159.44.98 
67.159.45.22 
67.159.45.50 
67.189.192.99 
67.207.77.70 
67.66.188.91 
67.67.16.232 
67.93.33.130 
68.153.118.44 
68.162.176.39 
68.178.224.222 
68.178.28.38 
68.225.212.4 
68.30.170.114 
68.33.160.237 
68.96.129.134 
69.109.183.99 
69.158.55.18 
69.159.124.95 
69.159.193.21 
69.245.10.113 
69.49.75.63 
69.64.71.62 
69.64.76.82 
69.64.87.252 
69.65.126.37 
69.65.85.69 
69.72.153.218 
69.9.42.210 
70.114.52.245 
70.119.152.89 
70.154.87.223 
70.173.213.178 
70.247.37.246 
70.55.231.199 
70.86.151.66 
71.84.113.250 
71.85.9.43 
72.141.138.57 
72.147.245.81 
72.167.36.135 
72.167.36.70 
72.22.81.253 
72.220.139.132 
72.232.138.34 
72.249.44.148 
72.36.149.82 
72.46.130.106 
72.46.130.23 
72.46.157.18 
72.55.174.24 
72.65.104.218 
72.9.152.150 
72.9.153.233 
74.168.237.254 
74.182.128.19 
74.205.126.241 
74.208.16.140 
74.208.16.19 
74.208.16.26 
74.220.207.141 
74.52.104.116 
74.52.159.98 
74.53.109.226 
74.62.153.11 
74.62.153.19 
74.62.153.44 
74.9.32.178 
75.117.178.114 
75.82.29.91 
75.89.1.217 
76.114.178.135 
76.24.249.236 
76.254.249.97 
76.69.255.19 
76.76.13.95 
77.114.96.6 
77.130.181.30 
77.160.26.212 
77.188.126.106 
77.243.100.171 
77.61.20.41 
77.74.198.212 
77.81.22.143 
77.94.118.38 
78.102.77.2 
78.106.1.136 
78.106.236.145 
78.106.39.168 
78.150.159.7 
78.154.16.1 
78.163.99.132 
78.164.154.241 
78.179.135.27 
78.179.186.243 
78.179.33.125 
78.179.62.159 
78.3.105.235 
78.56.57.85 
79.112.101.108 
79.112.89.237 
79.116.204.43 
79.116.53.169 
79.120.55.250 
79.146.45.240 
79.163.85.45 
79.175.2.248 
79.184.35.43 
79.186.232.158 
79.211.227.105 
80.144.230.197 
80.217.149.96 
80.227.1.100 
80.227.1.101 
80.39.175.238 
80.48.73.214 
80.61.200.86 
80.78.109.217 
80.80.111.129 
80.80.140.15 
80.99.203.213 
81.137.90.113 
81.154.100.236 
81.169.239.129 
81.190.87.164 
81.213.90.81 
81.214.62.122 
81.215.241.205 
81.215.248.210 
81.240.165.229 
81.37.94.116 
81.88.49.21 
81.9.164.164 
81.9.164.193 
82.13.104.129 
82.137.255.221 
82.146.225.130 
82.162.13.58 
82.171.216.78 
82.177.175.18 
82.195.26.2 
82.202.90.4 
82.74.234.48 
82.79.248.213 
82.79.96.78 
82.83.113.58 
82.83.202.39 
83.10.12.183 
83.10.22.144 
83.11.153.243 
83.11.187.155 
83.11.208.57 
83.11.62.47 
83.12.192.202 
83.12.62.171 
83.12.80.194 
83.13.81.251 
83.145.186.153 
83.15.25.238 
83.167.100.101 
83.167.116.186 
83.167.116.188 
83.17.235.14 
83.19.196.3 
83.191.39.17 
83.2.97.197 
83.21.105.103 
83.21.252.19 
83.21.66.125 
83.22.33.247 
83.22.90.32 
83.228.37.120 
83.237.230.197 
83.238.240.24 
83.24.194.207 
83.25.0.41 
83.25.101.23 
83.26.139.5 
83.27.248.15 
83.28.219.86 
83.29.195.41 
83.3.189.211 
83.30.254.76 
83.32.142.211 
83.4.254.99 
83.6.112.48 
83.77.188.123 
83.8.215.153 
83.9.241.154 
84.1.245.36 
84.145.239.185 
84.168.109.106 
84.203.168.134 
84.238.206.102 
84.245.193.243 
84.3.156.178 
84.60.79.38 
84.66.182.246 
85.103.64.7 
85.140.105.61 
85.172.16.78 
85.172.60.22 
85.178.46.48 
85.179.101.214 
85.196.20.131 
85.198.214.182 
85.244.92.47 
85.68.226.215 
85.72.131.157 
85.89.162.137 
85.90.197.51 
85.98.39.137 
86.0.104.231 
86.101.34.236 
86.127.25.239 
86.164.249.56 
86.31.97.240 
86.72.125.61 
86.96.226.13 
87.101.244.6 
87.105.49.49 
87.156.79.194 
87.187.223.244 
87.188.253.115 
87.189.90.46 
87.207.163.63 
87.218.251.53 
87.65.6.166 
87.98.222.138 
88.101.232.244 
88.108.101.40 
88.156.168.216 
88.201.128.162 
88.205.133.232 
88.217.67.200 
88.226.204.126 
88.227.71.23 
88.228.85.185 
88.234.176.160 
88.244.236.215 
88.249.14.104 
88.254.36.50 
88.65.211.125 
88.7.188.103 
88.84.200.21 
89.110.9.237 
89.114.192.150 
89.123.139.10 
89.123.175.153 
89.133.116.140 
89.142.251.136 
89.15.88.63 
89.163.145.92 
89.171.106.130 
89.178.41.124 
89.229.218.199 
89.230.6.236 
89.249.117.246 
89.252.213.192 
89.58.4.155 
90.13.107.9 
90.9.76.59 
91.122.120.242 
91.186.11.213 
91.186.21.51 
91.76.3.140 
91.77.72.253 
92.36.43.34 
92.37.209.244 
92.80.138.149 
92.80.169.141 
92.81.228.202 
92.81.67.145 
92.83.117.174 
92.83.13.8 
96.232.233.37 
96.3.130.109 
98.206.53.4 
98.212.133.81 
98.26.203.118 
99.139.239.235 
99.161.121.192 
99.230.41.72 
99.238.40.191

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

SPList의 문건에 대한 읽기/쓰기에 관한 속성 처리.

기술자료/.NET 2008. 3. 26. 10:01

보통 일반적인 게시판에서는 올린 글에 대해서는 누구든지 보게 된다.
또한 특정 글의 수정 작업은 자신이 작성한 항목에 대해서만 수행할 수 있게 된다.

그런데, 혹시 아래와 같은 기능이 필요할 수 있다.
1. 하나의 게시판을 여러사람이서 공유하지만, 마치 자신만의 글만 보이도록 하고 싶다.
2. 어떠한 글이든, 권한만 있으면 편집이 가능하다.
3. 모든 사용자가 아이템 자체를 편집 못하게 한다. ( 마감 처리 )

사실 1번과 같은 사항은 대개 View를 수정해서 자신이 작성한 글만 보이게 처리할 수 있다.
하지만, 만일 View를 바꿔 보게 되면 전체가 다 보이므로 1번의 조건에 합당하게 처리되지 않는다.  2번 같은 경우에는 글이나 문서가 공유되는 것이라서 팀 사이트 의 경우 팀 구성원이 원하는데로 수정가능한 경우를 의미한다.
3번의 경우는 해당 게시판의 만료적인 의미로 두면 되며, 더 이상 누구도

이 처리를 위한 방법은 SPList의 속성 중 아래의 2개의 프로퍼티가 이런 기능을 제공하게 된다.

int SPList.ReadSecurity

 속성 내에 넣는 값
 1 - 모든 사용자가 모든 아이템을 읽을 수 있다.
 2 - 자신이 생성한 아이템에 대해서만 읽을 수 있다.

int SPList.WriteSecurity

 속성 내에 넣는 값
 1 - 모든 사용자가 모든 아이템을 권한만 있으면 편집 가능하다.
 2 - 사용자가 생성한 아이템만 편집 가능하다.
 4 - 누구도 아이템에 대해 편집이 불가능하다. ( 사이트 관리자만 가능 )


위의 속성만 세팅하게 되면, 각각의 기능을 수행할 수 있게 된다.

기본 값으로 ReadSecuriry는 1이, WriteSecuriy는 1로 설정되어 있다.

만일 위의 3가지 요구사항중 1번을 처리하려면,
ReadSecurity를 1, WriteSecurty는 1또는 3을 넣으면 된다.

2번을 처리하려면,
ReadSecurity를 1, WriteSecurty는 1로 넣으면 된다.

3번을 처리하려면,
ReadSecurty를 1, WriteSecurty를 4로 넣으면 된다.

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

SI에 대한 내 멋대로의 생각

잡글 2008. 3. 24. 12:01
프로젝트는 세가지의 구성원으로 구성된다.

발주자, 관리자, 개발자.

위의 세 구성원이 엮이고 엮여서 프로젝트가 시작되고, 개발되고, 완료되는 것이다.
물론 복잡하게 생각하면 한도 끝도 없겠지만, 간단하게 바라보면 저 세가지로 구성된다.

일단 위의 3각 관계에서 우리나라 형으로 변환하면 아래와 같이된다.

고객, 대형 SI 업체, 각각 특화된 소규모 개발 업체.
이른바, 갑과 을로 끝나는 형태가 아닌 갑, 을, 병 ( 필요시에는 정까지...)으로 맺어지는
관계로 이뤄진다. 이 때 역시 제일 중요한 위치는 대형 SI 업체의 활동인데,
사실 우리나라 실정 상 대형 SI 업체는 단순 발주 도우미 내지, 프로젝트 실패시, 그
뒤치닥 거리를 하는 일종의 보험이다. 물론 이 보험의 수혜주는 고객이지
소규모 개발 업체는 아니다.

그래서 고객은 대형 SI 업체에게 많은 돈을 주고 프로젝트를 발주하고,
그 돈의 일부를 받는 소형 개발 업체는 프로그래머를 쥐어 짜듯 개발하게 된다.
게다가, 근좌 프로세스들은 변화가 심하기 때문에, 2~3년 대규모 개발 따윈 하지 않는다.
2~3년 걸쳐 개발해봐야, 그 순간에만 쓰이는 프로세스 일 뿐, 세상이 변하면서,
다시 구성해야 되기 때문에 2~3년 씩이나 시간을 들이며 개발할 수는 없을 것이다.
(물론 기간계 시스템이나, 결제 시스템은 조금 다르겠지만....)

대개 프로젝트는 길어봐야 1년, 그 안짝으로 끝내야 하며, 결국 개발 업체는 자신의 개발력으로는 이를 해결 할 수 없어 다른 솔루션을 도입하고 그 솔루션의 기능을 활용하도록 하여,
기간을 단축하도록 한다.

그런데..... 보통 이런 솔루션은 내부 Business 로직이나 UI가 거의 Fix되어 있기 때문에,
그 안의 구조를 고치는 것은 참 많은 공수를 들이게 된다.
프로젝트 진행 단계에 있는 BPM(Business Process Management) 이라는 단계 처럼 현재 수행하는 각종 작업 단계들을 보다 전산 처리가 쉽도록 체계적으로 개편하고,
보다 빠르고 유연하게 될 수 있도록 하는 것이 있다.

그런데, 이 단계의 대부분은 고객의 요구사항과 해당 솔루션과의 차이점을 파악해, 솔루션을 어떻게 뜯어 고쳐야 될까를 고민한다. 결국 솔루션을 도입한 의미를 잃어버리고, 해당 고객만을 위한 특수 버전의 솔루션이 탄생한다. 그리고 그 차이점을 매우기 위한  프로그래머의 무한 헤딩(불가능을 가능하게 만드는 끊임 없는 시도)를 유도한다.

훌륭한 시스템이라고 해야 할까....
아마도 외국 유수 솔루션 업체들은 황당하기 그지 없는 행태일지도 모르겠다.
저런 상황이니, 해당 솔루션의 소스가 필요하게 되고, 소스를 제공하게 되는 국내 업체들은
자신들 만의 독특한 로직을 도리어 대형 SI 업체에 빼앗기고, 끝난다.
게다가, 그들만의 독특한 버전을 만들게 되었으니, 다른 곳에서 재활용은 절대 불가능하다.
어차피 원본 가져가봐야 다른 곳에서는 다른 버전을 만들어야 하니, 의미 제로일듯...

이런 이야기야, 헤딩을 하면서 흘리는 피와 눈물이 섞인 프로그래머들은 모두 공감하고 느끼고 다양한 매체를 통해 이야기 한다. 그리고 이런 모습을 보는 후배들은 자신이 제대로 직업을 선택한 것인지 의문을 갖고, 하나 둘 떠난다.
그런 후배를 보는 나 조차 그런 후배들의 선택에 찬성표 하나를 던져 준다.

언제 이런 흐름이 계속 될지는 모르겠지만, 대략 2~3년 후 즈음이면,
이제 더 이상 이런 형태의 개발을 하는 업체도 사람도 없을 것이다.
해달라고 돈 더 주면 할지는 모르겠지만....
BPM도 제대로 안하는 이런 일따위를 계속 할 바엔
외국으로 날라버리는 게... 더 나을 것 같다.

언제까지 가나 한번 보련다.
대형 SI 업체는 좀 시간이 갈지는 모르겠지만, 소형 개발 업체는 조만간 거의 다 무너질 것 같고, 그 끝이 보일 즈음에 아마도 고객 쪽에서 좀 변할라나....
내 나이 더 쳐 먹기 전에 슬금 슬금 도망이나 가볼까나....
728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

공식적인 본사근무

잡글 2008. 3. 10. 23:45
오늘부터 드디어 본사 근무가 시작되었다.
어제까지 장장 1여년동안 에스케이티에 인트라넷 시스템 구축 및 관리 하다
어제부로 끝을 냈다.

참 기나긴 프로젝트 였다, 물론 3,4년 동안 전체 시스템 구축을 위해
작업하는 분들에게는 콧방귀 나는 기간일지는 모르겠지만
빠르게 변화하는 지금에서는 진짜 긴 시간이다,

가끔은 중요 시스템 구축하는 데서는 긴 시간을 가지고 하겠지만..
대부분 1년 내에 시스템을 구축하고저 하고, 또한 그렇게 해야
경쟁에서도 이길 수 있을 것이다,

어찌되던간에 나에겐 긴 기간, 묻혀 산 기간 이였고
이제 다시 새로 시작해야 하지 않을 까 싶다,

지금은 물론 운영체제 재설치와 백업을 하고 있다,.
내일 새로운 곳으로 이동할 예정,

과연 나에게 무슨 문제가 기다리고 있을까?
728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

점점.....빠져든다.

잡글 2008. 3. 10. 16:05
친구들로 부터 고립되면서,
이젠 아래애들로 부터 고립되는 기분이다.
물론 그들도 그들 나름대로 사정이 있으리라 생각된다.
자신의 위치나, 자신의 체력이나, 자신의 피로 등등.

그런데 사실 그런 것 보다, 조금은 그 위의 사람을 위한 행동 포즈라도 취해주었으면 하는 바램이였는데, 애석하게도 아무도 그렇지 않은 것 같다. 단편적인 행동만 보고 생각한 편협한 생각인지는 모르겠지만, 아마도, 내 생각대로 움직이는 애들은 역시 바보, 병신 이지 않을까....

요즘같이 날렵하고 자신만을 위한 세상에서 저런 생각을 갖는 것 자체가 웃기는 것일지도..
그래도 난 조금이나마 Give & Take 정신과 함께, 배려와 협력이 있어야 된다고 생각했는데..
늘 내가 주변에게 이야기하는 60년대 출생 아저씨, 70년대 출생 아저씨, 80년대 출생 새내기, 그들 만의 특성과 문화가 있다고 하였는데, 점점 요즘의 일본 청년들이 되가는 느낌.
무한 도시화가 가져오는 폐단인지도 모르겠다.

정과 의리는 개나 줘버려가... 요즘 세상.

머리와 마음과 가슴을 씻기 위한 여행을 한번 모색해야 겠다.

힘들다.
728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

혼자 영화 보기.

잡글 2008. 3. 10. 09:23
근래, 묘하게 따되는 분위기에,
나 스스로도 고슴도치가 되는 기분에, 근래는 남에게 도움을 요청하기 보다는 혼자 하곤 한다.
어제도 아버지께서 방안의 물건 처분하라기에 싸우기는 싫고,
처분해야 되겠다는 생각에, 그나마 아는 친구들에게 연락했더니,
하나는 연락 두절, 하나는 버릴 물건 간보고 있었다.
뭐, 나름 쓸만한 물건들이지만, 받는 입장에선 쓰레기가 될 수도 있으니, 당연한 처사겠지만,

그 문제는 대충 다른 곳으로 보내는 것으로 일단락되었고,
점점 고립되는 기분에,
그냥 혼자 움직이기로 했다.

그 첫 일환이 역시 영화 보기.
처음에는 혼자 보는게 영 껄끄러웠는데, 나름 재미 있었다.
경제적인 부담도 덜하고, 좀더 몰입감이 강했고, 아무런 신경 안써도 되는..

차츰 홀로서기에 조금 더 익숙해져야 겠다.
할건 많은데, 자꾸 기대서야, 뭘 하리오..
728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

  • «
  • 1
  • ···
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • ···
  • 156
  • »
250x250

블로그 내에 소스 코드 삽입 이사온 기념 스킨도... RSS 전문 기능 비활성화 관련. 스킨 바꾸어 보았습니다. 서버 파일 정리 좀 했습니다.

«   2025/06   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

불만 MOSS 2007 블로그 Buscuit windows 것 moss 협업 2010 java Azure Tutorial SharePoint me2sms me2dayzm 개발환경 me2photo twi2me WSS 좀 Visual Studio e-book 지름신 비스킷 수 친구 매뉴얼 오류 인터파크 Google Apps Engine

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015-2025 Socialdev. All Rights Reserved.

Copyright © 2015-2025 Socialdev. All Rights Reserved.

티스토리툴바