IT/면접 대비2016. 8. 16. 09:04

-출처 [게시판 검색]

http://www.hoons.net/






1. 


(기간 : 2010 ~ 2011)

- 자기소개 해보라

- 언어 뭐 할줄 아냐? 

- 파견근무 인데 가능하겠냐? (지방파견)

- 주력으로 사용하는 언어에 대한 지식이 어느정도인지?

- 프로젝트 해본게 뭐 있나?

- 부당한 대우를 하는 상사가 있다면 어떻게 하겠는가? 

- 내 공로를 뻇아가는 상사가 있다면 어떻게 하겠는가?

- 야근이 많이 있을수 있다 괜찮냐? <--- 거의 단골 질문입니다. 

- 교회다니네? (종교활동관련해서 수요일이나 토요일 이런날 열심히 교회 나가는지 여부 확인) 일요일날 일할수도 있는데... ? 

- 회사에서 주력언어가 아닌 다른 언어의 프로젝트만 계속 주면 하겠는가? 

- 노조에 대해서 어떻게 생각하는가?

- 기존 회사에서 노조활동을 한 적이 있는가?

- 기존 회사의 규모는 ?

- 기존 회사에서 맡았던 일과 업무는?

- 자신의 성격을 말해보라

- 꿈과 비전이 무엇이냐?

- 출근이후에 원래 생각하던 업무와 다른 업무가 주어진다면?

- 좋아하는 취미가 무엇이냐? 우리회사는 주말마다 사장님과 등산을 한다..

- 좋아하는 운동은 무엇이냐?

- 이전 직장 퇴직 사유는?

- 학교생활에 대해서 설명해 보라.

- 영어는 어느정도 할줄 아는가?

- 술 담배는 하는가?

- 여자친구는 있는가? 혹은 남자친구가 있는가?

- 결혼했는가? 


작은 소규모 회사인 경우 검증절차를 갖추기 보다 인력수급이 문제가 많아 어느정도 능력이 있다 싶으면 바로 뽑는 경향이 크구요. 어느정도 50명이상의 사업장의 경우에는 면접시 기술이나 언어에 대한 면접질문이 많았습니다. 100명이 넘어가는 사업장의 경우에는 인성이나 가족사, 학업에 대한 질문 등 기술적인 것 이외의 질문이 많았습니다. 압박하는 면접을 진행하기도하고 PT를 시키거나, 각오를 말하게 하는 등의 다른 부분도 보는 것 같았습니다. 그리고 보통 일정규모 이상의 회사의 경우엔 언어나 기본적인 전공지식에 대해서 거의 100% 물어본다고 보시면 됩니다. 면접시에 인사팀장이나 인사과장이신 분만 계시면 보통은 전공지식보다 인성에 대해서 많이 물어보시고, 실무자라면 전공지식에 대해서 많이 물어봅니다. 그리고 이직이 잦은 특성상 이전직장의 이직사유에 관심이 많고, 끈기있게 책임감 있게 일을 할수 있는지에 대해서 많이 물어봅니다. 




2.


상속, override, overload, 다형성과 같은 OOP 개념과 힙, 스택과 같은 자료구조, 정렬과 같은 기초 알고리즘, DB 쪽은 query 작성 또는 동작원리


일주일만에 만들 수 있는 프로그램으로는 웹이면 게시판, 응용이면 회원관리


Posted by 기억속의먼그대에게
IT/면접 대비2016. 8. 16. 08:58

- 출처

http://www.hoons.net/Board/cshaptip/Content/50598


[2009-02-18]





[C# 언어 부분]


1. string과 StringBuild의 차이점에 대해서 설명해주세요. 난이도 ★☆☆☆☆

기본적인 차이는 String은 immutable(불변함), StringBuffer는 mutable(변함,변하기쉬움)


string 타입은 불변 객체이기 때문에 string에 대한 모든 변환은 새로운 메모리 할당을 발생시킨다.

가장 큰 문제는 문자열을 더할 때다. 


예) 비효율적인 문자열 연산

string txt = "hello world";


for(int i=0; i<300000; i++)

{

txt= txt + "1";

}


1. 힙에 "hello world" 문자열을 담은 공간을 할당한다.

2. 스택에 있는 txt 변수에 1번 과정에서 할당된 힙의 주소를 저장한다.

3. txt+ "1" 동작을 수행하기 위해 text.length + "1".length에 해당하는 크기의 메모리를 힙에 할당한다. 그메모리에 txt변수가 가리키는 힙의 문자열과 "1" 문자열을 복사한다.

4. 다시 스택에 있는 txt변수에 3번 과정에서 새롭게 할당된 힙의 주소를 저장한다.

5. 3번과 4번의 과정을 30만 번 반복한다.


문제는 3번 과정에 있다. 끊임없이 메모리를 할당하고 이전의 문자열을 다시 복사하는 과정을 거치기 때문이다.


바로 이러한 문제를 해결하기 위해 BCL에 추가된 클래스가 StringBuilder 다.


1. Stringbuilder 는 내부적으로 일정한 양의 메모리를 미리 할당한다.

2. Append 메서드에 들어온 인자를 미리 할당한 메모리에 복사한다. 

3. 2번 과정을 30만 번 반복한다. Append로 추가된 문자열이 미리 할당한 메모리보다 많아지면 새롭게 여유분의 메모리를 할당한다.

4. ToString 메서드를 호출하면 연속적으로 연결된 하나의 문자열을 반환한다.


즉, 작은 메모리 할당과 복사가 없어졌기 때문에 그만큼 성능이 향상된 것 이다. 


이 때문에 문자열을 연결하는 작업이 많을 때는 반드시 StringBuilder를 사용하는 것을 권장한다.

 


2. using 이라는 키워드는 네임스페이스를 링크하기 위해서 사용하기도 하지만 객체를 생성할 때 또한 사용되기도 합니다. 이때 using을 이용하는 목적에 대해서 설명해주세요. 난이도 ★★☆☆☆

try/finally를 대신하는 using 예약어를 제공한다.


using (FileLogger Log = new FileLogger("sample.log"))

{

log.Write("Start");

log.Write("End");

}

 

using은 괄호 안에서 생성된 객체의 Dispose 메서드를 블록이 끝나는 시점에 자동으로 호출하는 역할을 한다.


즉, using 예약어는 try/finaly/Dispose 에 대한 간편 표기법에 해당된다.


3. C# 2.0에서는 델리게이트를 쉽게 등록하는 문법적 편의를 위해서 익명 메서드라는 문법을 제공했습니다. 그리고 C#3.0에는 이 익명 메서드를 더 쉽게 사용할 수 있게 하기 위해서 람다식이라는 문법이 등장하게 됩니다. 그렇다면 익명메서드와 람다식 구문을 사용하는 코드를 작성해주세요. 난이도 ★★★☆☆

익명 메서드(anonymous method)란 단어 그대로 이름이 없는 메서드로서 델리게이트에 전달되는 메서드가 일회성으로만 필요할 때 편의상 사용한다.


예) 익명 메서드 사용

static void main(string[ ] args)

{

Thread thread = new Thread(

delegate(object obj)

{

Console.WriteLine('익명 메서드 호출");

});

thread.Start();

thread.Join();

}

 

Thread 생성자에 직접 delegate 예약어를 사용해 메서드의 코드를 전달한다. 이떄 delegate 예약어의 괄호에는 원래의 델리게이트 형식에서 필요로 했던 매개변수를 전달해야한다.


예) 람다식 구문 사용

Thread thread = new Thread(

(obj) =>

{

Console.WriteLine('익명 메서드 호출");

}


delegate 예약어를 생략하는 동시에 인자의 타입을 굳이 개발자가 명시하지 않아도 되게 만들었다.


4. 닷넷에서의 데이터 타입은 값 타입과 참조 타입으로 구분되어 힙영역과 스택영역에 데이터를 나누어서 저장하게 됩니다. 때문에 빈번하게 박싱/언박싱이 일어나게 됩니다. 그렇다면 박싱 언박싱은 무엇인지 그리고 성능에 있어서 어떤 영향을 미치는지 설명해주세요. 난이도 ★★★☆☆

박싱(Boxing) : 값 형식을 참조 형식으로 변환

스택에 있는 데이터가 힙으로 복사

암시적 형변환 가능


언박싱(unboxing) : 참조 형식을 값 형식으로 변환

힙에 있는 데이터가 스택으로 복사

명시적 형변환 필요

박싱한 객체에 대해서만 언박싱이 가능

박싱할 때의 값 형식의 타입을 준수

예)

short i= 123; // 값 형식

object o = i; //박싱

int j = (int) o; //int 로 언박싱 불가능



언박싱은 반드시 명시적으로 이루어지며, 박싱된 변수의 공간과는 별도 메모리 공간에 값이 저장 된다.


이러한 변환 과정은 object 타입과 System.ValueType 을 상속받은 값 형식의 인스턴스를 섞어 쓰는 경우에 발생한다.


예)

static void Main(string[ ] args)

{

int a = 5;


object obj = a; // 박싱: 값 형식인 int를 참조 형식인 object에 대입


int b = (int)obj; // 언박싱: 참조 형식인 object를 값 형식인 int에 대입

}

박싱으로 인해 관리 힙을 사용하게 됐고, 이는 GC에게 일을 시키게 만든다. 즉, 박싱이 빈번할수록 GC는 바빠지고 프로그램의 수행 성능은 그만큼 떨어진다.


따라서 박싱을 과다하게 발생할 수 있는 코드는 최대한 줄이는 것을 권장한다.



값 형식 <-> 참조 형식, 스택과 힙 영역을 오가는 박싱/언박싱은 아래와 같은 문제가 있다.

MSDN 에서는 이 과정에 대한 비용을 다음과 같이 설명하고 있습니다

boxing  unboxing 과정에는 많은 처리 작업이 필요합니다값 형식을 boxing할 때는 완전히 새로운 개체가 
만들어져야 하며이러한 작업에는 할당 작업보다 최대 20배의 시간이 걸립니다. unboxing을 할 때는 캐스팅 
과정에 할당 작업보다 4배의 시간이 걸릴 수 있습니다


그럼 언제 그리고 왜 사용하는가?

이처럼 비용이 많이 들고 성능에 악영향을 끼치는 박싱/언박싱은 왜 지원하는 걸까요?

이유야 찾아 보면 여러 가지 있겠습니다만대표적으로 사용상의 편의성이라 말하고 싶네요

 

C#의 모든 자료형은 System.Object 로부터 상속을 받게 됩니다

즉 System.Object 로 데이터를 처리할 경우 특정 타입으로 인한 제약사항에서 자유로워 지게 됩니다

이것은 배열과 같은 복합자료를 다룰 경우 유용한데요.

 

닷넷 프레임워크에서 제공하는 System.Collections.ArrayList 클래스는 대표적인 복합자료형 입니다

 

ArrayList에 저장할 수 있는 요소의 타입은 어떤 형식이라도 상관이 없는데요아래 코드를 보면

ArrayList에 정수문자객체 등을 그 타입을 가리지 않고 마구(?) 추가할 수 있습니다

 

System.Collections.ArrayList al = new System.Collections.ArrayList();

al.Add(123);                       //정수 추가

al.Add("안녕하세요");           //문자열 추가

al.Add(new Program());       //객체 추가

 

이것은 ArrayListy의 Add 메서드가 object 타입의 매개변수를 취하고 있기 때문입니다

 object 타입이면 모두 가능하며 이 말은 곧 C#의 모든 자료형을 저장할 수 있다는 의미입니다

 

이와 같이 특정 자료형에 구애 받지 않고 복합 자료를 다룰 경우 편리성을 제공하게 되는 것입니다

(배열과 같이 동일한 타입의 자료만 저장할 수 있는 것과는 대조됩니다)

 

그러나 결국 al.Add(123) 과 같은 명령은 123이라는 정수형 자료가 object 타입으로 박싱이 일어나게 되며

데이터를 가져올 때에 해당 타입으로 언박싱을 해줘야 합니다

 

object o = al[0];

int j = (int) o;

 

즉 편리하기는 하지만 그 만큼의 비용은 지불해야 하는 것입니다

 

또한 위와 같이 ArrayList에 여러 타입의 자료를 저장하게 되면 값을 가져올 때 박싱 되기 전 자료형으로

명확히 캐스팅을 해줘야 하기 때문에 형식에 대한 불안정성도 증가하게 됩니다

(참고로 닷넷 2.0 부터는 이러한 ArrayList 의 단점인 고비용과 형식 불안정성을 개선하기 위해

지네릭 버전의 컬렉션을 제공하게 됩니다)



- 부분 출처

http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=671



5. 객체를 만들 때 메모리 해제를 위해서 일반적으로 IDisposable 인터페이스를 상속받아서 처리하게 되는 경우가 많습니다. 닷넷에서의 소멸자는 Dispose(), Finalize()가 존재하는데 이 두 가지의 차이점은 무엇인지 기술해주세요. 난이도 ★★★★☆


마이크로소프트는 자원 해제가 필요하다고 판단되는 모든 객체는 개발자로 하여금 IDisposable 인터페이스를 상속받도록 권장하고 있다.


IDisposable 인터페이스가 구현돼 있다면 해당 객체의 사용이 끝나면 Dispose 메서드를 호출해야 한다는 것을 직관적으로 알 수 있다.


Dispose하기 전에 예외가 발생한다면 Dispose메서드가 호출되지 않으므로 정상적으로 자원 회수가 안된다. 

따라서 보통 try/finally를 이용해 Dispose를 호출하는 것이 관례다.



- 하기 내용 출처 

http://hongjinhyeon.tistory.com/95


1.차이점



클래스 인스턴스에서 관리되지 않는(unmannaged resource) 리소스들(DB 접속, 파일관리등)을 캡슐화할 때가 존재합니다.

해당 인스터스가 종료될 때 이 리소스를 해제하는 명시적인 방법(Dispose)과 암시적인 방법(Finalize)을 모두 제공되어야 합니다.


보통은 해당인스턴스가 더이상 참조 되지 않을때 GC가 자동적으로 Finalize를 호출해서 리소스를 해제합니다.

하지만 GC에 인스턴스가 수집되기전에 프로그래머가 해제할 수도 있습니다. 이런 경우는 해당 리소스가 드물거나

비싼경우에 명시적으로 Dispose를 호출해서 해제하면 성능이 향상될 수 있습니다.


Dispose를 사용해서 명시적 제어 기능을 제공하더라도 Finalize 을 사용한 암시적으로 정리하는 기능을 제공해야합니다.

프로그래머가 Dispose를 호출하지 못했을때 리소스 누수가 발생하지 않도록 백업하는 기능을 합니다.


2.예제소스


01.//base class
02.public class Base: IDisposable
03.{
04.private bool disposed = false;
05. 
06.//IDisposable 인터페이스 구현
07.public void Dispose()
08.{
09.Dispose(true);
10.GC.SuppressFinalize(this); //Finalize()
11.}
12. 
13.protected virtual void Dispose(bool disposing)
14.{
15.if (!disposed)
16.{
17.if (disposing)
18.{
19.//관리되는 자원을 해제
20.}
21.//관리되지 않는 자원을 해제
22.//큰 변수들을 null로 설정한다.
23.disposed = true;
24.}
25.}
26. 
27.// 소멸자 구현
28.~Base()
29.{
30.// Simply call Dispose(false).
31.Dispose (false);
32.}
33.}
34. 
35.// base class를 상속받는 클래스에서의 dispose 구현
36.public class Derived: Base
37.{
38.private bool disposed = false;
39. 
40.protected override void Dispose(bool disposing)
41.{
42.if (!disposed)
43.{
44.if (disposing)
45.{
46.//관리되는 자원 해제
47.}
48.//관리되지 않는 자원해제
49.//큰 변수들을 null로 설정한다.
50.disposed = true;
51.}
52.//기본클래스의 dispose 호출
53.base.Dispose(disposing);
54.}
55. 
56.//위의 Derived클래스에서는 Finalize와 Dispose()가 구현이 안되어 있는데
57.//이것은 base클래스에서상속받는다.
58.}



3.소스분석

base class에서는 IDisposable 인터페이스를 구현해서 dispose를 구현합니다.

CASE 1 - 프로그래머가 명시적으로 Dispose를 호출해서 자원을 해제한다고 한다면, 우선 Derived 클래스의 인스턴스에서
Dispose()를 호출하게 됩니다. 이때 상속받은 base클래스의 메서드가 실행되면서 Dispose(true) 로 관리되는 자원과 관리되지 않는
자원이 모두 해제가 되며  GC.SuppressFinalize(this); 이 구문으로 가비지컬렉터에서 Finalize가 호출되지 않게 처리합니다.

CASE 2 - 프로그래머가 명시적으로 Dispose를 호출하지 못한다면, base클래스의 소멸자가 호출이되고  Dispose (false); 구문에서
관리되지 않는 자원만 해제가 됩니다.





[닷넷 아키텍처 부분]


1. 3-Tier 기반의 프로젝트는 무엇인지 그리고 3-Tier기반의 시스템이 가지는 장점은 무엇인가요? 난이도 ★☆☆☆☆


2. SQL 서버에서는 다양한 곳으로 데이터를 서비스 하게 됩니다. 이때 멀티 사용자들이 한 테이블에 접속하기 때문에 Lock을 걸게 됩니다. 그렇다면 NoLock과 DeadLock의 개념에 대해서 기술해주세요. 난이도 ★★☆☆☆


3. 닷넷이 등장하면서 기존의 COM과 MTS의 기능을 동시에 지원하는 COM+ 즉, 엔터프라이즈 서비스가 등장하였습니다. 많은 대형 프로젝트에서 엔터프라이즈 서비스를 기반으로 시스템을 설계하여 사용하고 있는데 이 때 COM+의 장점은 무엇인가요? 난이도 ★★★☆☆


4. 닷넷 웹 서비스는 w3c에서 정의한 표준 기술입니다. HTTP 통신을 기반으로 하는 이기종 통신 기술인 만큼 많은 한계들이 있었습니다. 그래서 흔히 ws-* 로 부르는 다양한 스펙들이 추가되게 됩니다. 이 중에 WS-Security, WS-Address, WS-ReliableMessage 라는 스펙들이 존재하는데 이 스펙들 중 한가지를 선택해서 어떤 한계로 등장하여 어떤 역할을 하게 되는지 설명해주세요. 난이도 ★★★★☆


5. 애자일 개발 방법론에 대해서 설명하고 닷넷에서 애자일 기반의 프로젝트를 진행하고자 할 때 이용할 수 있는 적합한 도구는 무엇인지 설명해주세요.

난이도 ★★★★☆

보너스 - (애자일 기반의 개발을 해본 경우)

애자일 방법론을 실제로 적용한 이후 팀이나 프로세스 개선효과가 가장 적은 결과를 나타내는 곳의 공통적인 문제를 해결하는 가장 좋은 방법은 무엇인가요?


[IT트랜드 및 닷넷교양 부분]



1. IT 개발트랜드는 OOP에서 CBD로 그리고 2000년도에는 다시 SOA로 발전해 왔습니다. 그리고 최근에 Open API와 같은 서비스가 등장하면서 SOA보다는 WOA기반의 서비스가 트랜드화 되어 가고 있습니다. 흔히 WOA기반의 서비스를 Restful 서비스라고 부르는데 Restful 서비스의 개념을 설명해주세요. 난이도 ★☆☆☆☆


2. 최근에는 웹에서의 사용자의 경험을 상승시키고 UI를 화려하게 보여주기 위한 RIA기술이 화두가 되고 있습니다. 다음 아래의 기술 중에 웹 브라우저에서 가장 가볍게(Thin) 동작할 수 있다고 생각되는 순서대로 뽑아서 나열해주세요. 난이도 ★★☆☆☆

보기: 실버라이트(Flex), 일반웹(Classic웹), Ajax기반의 웹페이지, XBAP, SmartClient)


3. SaaS(Software as a Service)나 Software+Service의 개념에 대해서 설명해주세요. 난이도 ★★★☆☆


4. SOA가 화두가 되었을 때 다양한 타입의 데이터를 여러 기종에 전달할 수 있는 허브 역할을 하는 ESB 개념의 제품을 판매하게 되었습니다. 그렇다면 마이크로소프트에서 이 ESB와 같은 개념을 도입할 수 있는 제품의 이름은 무엇인가요? 난이도 ★★★★☆


5. Spring 같은 경우 자바에서 상당히 많이 이용되는 오픈 소스 프레임워크 입니다.

닷넷에서 또한 엔터프라이즈 라이브러리, IBATIS.NET, Spring .NET, Nhibernate와 같은 다양한 프레임워크가 존재합니다. 이 중 사용해 본 프레임워크 있으신가요? 사용해본 느낌과 함께 기술해주세요. 난이도 ☆☆☆☆☆ (경험에 대한이야기)












Posted by 기억속의먼그대에게
IT/면접 대비2016. 8. 16. 08:55

- 출처

http://hoonsbara.tistory.com/68

[2014.02.13]





C# 파트에서는


- 1. Access Modifier가 무엇이냐?


- 2. boxing/unboxing이 무엇이냐?


- 3. Threading Locking이 무엇이냐? 언제 사용하냐?


- 4. switch 가 빠르냐 if else가 빠르냐


- 5. readonly와 const의 차이가 무엇이냐?


- 6. interface와 abstract 클래스의 차이는 무엇이냐?


http://marobiana.tistory.com/58 


http://fantasic.tistory.com/entry/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-%ED%81%B4%EB%9E%98%EC%8A%A4


출처 - http://hongjinhyeon.tistory.com/93

OOP개념에서 상속을 이야기할 때 Virtual이나 Abstract 한정자가 사용이됩니다.

두개를 사용하면서 헷갈리는 점을 정리했습니다. 또한 Interface와 비슷한 기능을 제공하는데

같이 비교해보겠습니다.


1.Virtual ( 가상 키워드 )


virtual 키워드는 메서드,속성, 인덱서 또는 이벤트 선언을 한정하는데 사용됩니다.

파생 클래스에서 필요에 따라서 재정의(override) 할 수 있지만  필수적으로 재정의 할 필요는 없습니다.

Virtual 한정자를 사용한 클래스는 완벽한 기능을 제공할 수 있습니다.


public class Animal

{

   public virtual void Speak()

   {

        Console.WriteLine("Nothing!");

   }

} 

public class Dog : Animal

{

    public override void Speak()

    {

        Console.WriteLine("멍멍!");

    }

} 

Dog temp = new Dog();

temp.Speak();//멍멍!



2.abstract (추상 키워드 )


abstract 키워드를 사용하면 불완전하여 파생 클래스에서 구현해야하는 클래스 및 클래스 멤버를 만들수 있습니다.
추상클래스의 사용 목적은 여러개의 파생 클래스에서 공유할 기본 클래스의 공통적인 정의를 제공하는 것입니다. 
추상 클래스는 인스턴스화할 수 없습니다.

public class Animal

{

   public virtual void Speak()

   {

        Console.WriteLine("Nothing!");

   }

}

 

public class Dog : Animal

{

    public override void Speak()

    {

        Console.WriteLine("멍멍!");

    }

}

 

Dog temp = new Dog();

temp.Speak();//멍멍!



3.Interface (인터페이스)

 

인터페이스는 abstract와 비슷하지만 멤버필드(변수)를 사용할 수 없습니다. 대신에 프로퍼티는 사용이 가능합니다.

인터페이스는 보통 여러클래스에 공통적인 기능을 추가하기 위해서 사용합니다.


public interface Animal

{

    void Speak();

 

    string Name

    {

        get;

        set;

    }

  

}

 

class Dog : Animal

{

    private string name;

 

    public void Speak()

    {

        Console.WriteLine(name + "->멍멍!");

    }

 

    public string Name

    {

        get

        {

            return name;

        }

        set

        {

            name = value;

        }

    }

}

 

Dog temp = new Dog();

temp.Name = "흰둥이";

temp.Speak(); //흰둥이->멍멍!



4.결론


-Vritual은 하나의 기능을 하는 완전한 클래스이며, 파생클래스에서 상속해서 추가적인 기능추가 및 virtual 한정자가 달린 것을 재정의해서

 사용가능합니다.


-Abstract는 여러개의 파생 클래스에서 공유할 기본 클래스의 공통적인 정의만 하고 ,파생클래스에서 abstract 한정자가 달린 것을

 모두 재정의(필수)해야 합니다.


-Interface에서도 abstract와 비슷하지만 멤버변수를 사용할 수 없습니다. 

 보통 abstract는 개념적으로 계층적인 구조에서 사용이 되며(동물이나 어떤 사물의 계층적인 구조가있을때) Interface는 서로다른 계층이나

 타입이라도 같은기능을 추가하고 싶을때 사용합니다.(사람이나 기계가 말을하게(speak)하는 인터페이스를 추가할때)




- 7. 오버로딩과 오버라이드의 차이는 무엇이냐?


출처 - http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=675


오버로딩(Overloading)

일반적으로 하나의 클래스 안에 정의된 메서드들의 이름은 중복될 수 없습니다

그러나 오버로딩 기법을 이용하면 하나의 클래스에 같은 이름을 가진 메서드를 여러 개 정의할 수 있습니다

 

다만 메서드의 이름은 같되 매개변수의 정보(개수 및 타입)는 달라야 합니다

메서드의 이름과 입력 매개변수의 정보(개수 및 타입)를 메서드의 시그너처라고 합니다

 

: 메서드 시그너처(Signature): 메서드 이름 + 매개변수 정보(개수 및 타입 정보)

 

한 클래스에 정의된 메서드들은 모두 시그너처 정보가 유일해야 합니다

즉 메서드의 시그너처를 유일하게 한다면 메서드의 이름은 얼마든지 같을 수 있는 것입니다

결국 오버로딩 기법은 이미 정의된 메서드와 이름은 같지만 시그너처는 다르기 때문에 가능한 것입니다

 

다음 코드는 하나의 클래스의 동일한 이름의 메서드(그러나 시그너처는 다른)가 정의된 모습입니다

 

public class MyClass{

   public int MyMethod(){

       return 0;

   }

   public int MyMethod(int i){

       return i;

   }

}

 

 

오버로딩은 왜 사용하나?

오버로딩 기법을 사용하지 않고도 프로그램을 완성할 수 있습니다

 

오버로딩이 유용한 경우는 경험에 의해 그리고 감각적으로 알 수 있어 여러 사례가 있겠습니다만,

저는 이런 경우를 생각해 보았습니다

 

동일하거나 유사한 일을 수행하는 메서드가전달 받는 매개변수에 따라 조금씩 다른 연산을 해야 하는 경우에

모든 상황에 따라 메서드 이름을 각각 정의 하는 것보다 매개변수 정보만 달리하여 동일한 이름으로 정의한다면

코드를 작성하는 입장에서나 사용하는 입장에서 모두 보다 직관적이고 편리하게 사용할 수 있을 것입니다.

 

닷넷 프레임워크의 라이브러리에서도 이러한 필요성에 의한 메서드 오버로딩 예를 쉽게 찾아 볼 수 있습니다.

예를 들어 FileInfo 클래스에 Open 메서드는 다음과 같이 3개로 오버로딩 되어 있습니다

 

- FileInfo.Open(FileMode)

- FileInfo.Open(FileModeFileAccess)

- FileInfo.Open(FileModeFileAccessFileShare)

 

즉 파일 열기를 할 때 모드만 지정하거나 읽기/쓰기 권한을 같이 지정하거나 공유 권한을 모두 지정할 수 있도록 
하는 것입니다만일 FileMode만 지정한다면 나머지 값들은 미리 정의된 기본 값으로 지정됩니다

 

대체로 이 기본 값은 일반적으로 가장 많이 쓰이는 값이기 때문에 개발자는

모든 상황을 고려할 필요 없이 필요한 정보만 전달하면 되는 것입니다.

 

물론 상세한 설정을 원하면 얼마든지 가능하구요

마치 프로그램 설치 시 기본 설정과 상세(사용자 정의설정이 있는 것과 유사해 보입니다

 

메서드 오버로딩이 지원되지 않는다면 아마도 아래와 같이 메서드 이름을 각기 달리하여 구현해야 할 것입니다.

아래는 제가 임의로 명명한 예입니다

 

- FileInfo.Open(FileMode)

- FileInfo.OpenWithFileAccess(FileMode, FileAccess)

- FileInfo.OpenWithFileAccessAndFileShare(FileMode, FileAccess, FileShare)

 

매개변수가 더 많을 경우에는 더 복잡해 지겠죠

 

아래의 예는 큰 수를 반환하는 메서드를 전달받는 매개변수의 수에 따라 오버로딩 한 예시입니다

 

public class MyClass{

   public static int Max(int i, int j){

       return i > j ? i : j;     //둘 중 큰수를 반환한다

   }

   public static int Max(int i, int j, int k){

       return Max(Max(i, j), k); //Max(int, int) 를 호출한다

   }

   public static int Max(int i, int j, int k, int l){

       return Max(Max(i, j, k), l); //Max(int, int, int) 를 호출한다

   }

   public static int Max(int[] arrays){

       int maxValue = 0;

       foreach (int i in arrays){

           maxValue = Max(maxValue, i); //Max(int,int) 를 호출한다

       }

       return maxValue;

   }

}

 

  

오버라이딩(Overriding)

앞서 살펴본 오버로딩(Overloading)은 한 클래스 내에서 동일한 이름의 메서드를 추가 정의하는 것인 반면,

오버라이딩(Overriding)은 클래스간 상속 관계에서 메서드를 재 정의하는 기법입니다

 

두 클래스가 상속 관계에 있으면 부모 클래스의 public, protected 으로 선언된 메서드는 자식 클래스로 그대로 상속되어 자식클래스에서 사용이 가능하게 됩니다즉 이미 정의된 메서드를 재 사용하게 되는 것이죠

 

이 때 단순히 재 사용을 하지 않고 자식 클래스에서 상속 받은 메서드를 재 정의하여 다른 연산을 수행하도록 
하는 것이 오버라이딩 입니다
즉 자식 클래스에서 부모 클래스의 특정 메서드를 다시 정의하게 됩니다

 

오버라이딩은 오버로딩과는 달리 메서드의 이름이 동일해야 합니다

그리고 virtual 과 override 키워드를 사용하여 오버라이딩을 구현하게 됩니다

 

 

virtual 과 override 키워드

메서드를 오버라이딩 할 때 부모 클래스에서는 virtual 로 자식 클래스에서는 override 키워드로 메서드를 정의해야 합니다즉 부모 클래스에서는 자식 클래스에서 오버라이딩이 가능하도록 가상(virtual) 메서드로 정의해야 하고 자식 클래스에서는 이 가상메서드를 override 키워드로 재정의 하게 됩니다

 

다음과 같이 Parent 클래스를 상속받는 Child 클래스가 있을 경우, public 메서드는 자동으로 상속 됩니다

 

class Parent{

    public virtual void ParentMethod(){

       Console.WriteLine("부모 메서드");

    }

}

 

class Child : Parent{}

 

Child 클래스에는 ParentMethod 가 정의되어 있지 않지만 부모로부터 상속받아서 사용 가능하죠

Child child = new Child();

child.ParentMethod(); //"부모메서드가 출력 됨

 

이때 부모 클래스의 ParentMethod를 자식 클래스에서는 다르게 구현 하고 싶을 경우 오버라이딩 하면 됩니다

class Child : Parent{

   public override void ParentMethod(){

       Console.WriteLine("자식메서드(오버라이드 됨)");

   }

}

 

오버라이딩 된 상태에서 자식 객체로 해당 메서드를 호출하면 재 정의한 메서드가 호출되는 것입니다

Child child = new Child();

child.ParentMethod();//"자식메서드가 출력 됨

 

자바와는 달리 부모 클래스에서 virtual로 선언하지 않으면 오버라이딩을 할 수 없다는 것에 주의하세요

(자바는 모든 메서드가 기본적으로 virtual 이죠?)

 

참고로 virtual 이외에 abstract (추상 메서드로 정의되어 있는 메서드 역시 오버라이딩 가능합니다

 

 

오버라이딩의 핵심은 다형성(Polymorphism)

객체 지향의 중요한 개념 중에 하나가 바로 다형성 입니다

다형성은 같은 메시지에 다른 동작이 가능하게 하는 객체 지향의 특성인데요

이러한 다형적인 동작을 가능토록 구현하기 위해 오버라이딩 기법을 사용하게 됩니다

 

예를 하나 들어 보죠

전 국민의 게임인 스타크래프트(StarCraft)를 개발한다고 가정해 봅니다

게임에는 많은 유닛이 존재하고 이 유닛들의 공격 형태를 서로 다릅니다

 

예를 들어 무대포 질럿은 양 팔에 달린 칼로 공격하고 우직한 드래곤은 꽁알탄 같은 총알을 쏘면서 공격합니다.

이외 다른 유닛들도 공격의 형태가 조금씩 다릅니다

 

그리고 공격을 할 때 개별 유닛에게 명령을 내릴 수도 있지만 전체를 모아서 한 번에 공격 명령을 내릴 수도 있습니다즉 마우스로 쭈~욱 끌어서 많은 유닛을 선택해서 공격하는 것입니다

물론 이 때 선택된 유닛들은 공격형태가 서로 다른 것끼리 짬뽕되어 있습니다

 

이 경우 부모 클래스에 Attack 라는 메서드를 정의 하고 각 유닛 클래스에서는 이 메서드를 오버라이딩 하여

같은 명령에 서로 다른 동작을 하도록 구현하고 싶습니다.

 

즉 모든 유닛에 한번의 Attack 명령으로 다형적인 동작이 가능토록 하는 것입니다코드를 보겠습니다

 

abstract class Unit //모든 유닛이 상속받게 되는 부모 클래스

{

   public abstract void Attack();

}

 

class Zelot : Unit{

   public override void Attack(){

       Console.WriteLine("사시미 찔러 대기");

   }

}

 

class Dragon : Unit{

   public override void Attack(){

       Console.WriteLine("꽁알탄 쏘아 대기");

   }

}

 

이렇게 클래스를 구현하고 이제 공격 명령을 내려 보도록 하겠습니다

질럿 두 마리와 드래곤 한 마리가 선택되었다고 가정하고 한번에 공격 명령을 내립니다

 

 

static void Main(string[] args){

       //그룹 공격(질럿 두마리드래곤 한 마리)

       Unit[] unitArray = new Unit[] { new Zelot(), new Zelot(), new Dragon() };

 

       foreach (Unit unit in unitArray){

          //모든 유닛에 Attack라는 같은 메시지를 호출하여 다른 행위를 하도록 한다

           unit.Attack();

       }        

}

 

그리고 결과는 다음과 같습니다

모든 유닛에 Attack라는 동일한 메서드를 호출하지만 각 유닛의 공격 행동은 서로 다릅니다

이렇듯 오버라이딩은 객체의 다형적인 동작을 가능토록 하는 객체 지향 기법입니다

 

물론 오버라이딩을 다형성만을 위해서 사용하지는 않습니다

어떤 경우든 부모 클래스의 virtual 메서드를 재 정의 하고 싶을 경우 사용하면 되는 것입니다

 

참고로 오버라이딩은 많은 객체 지향 디자인 패턴에 단골로 사용되는 기법이라 하겠습니다

대부분의 디자인패턴에서 오버라이딩의 사례를 쉽게 찾아 볼 수 있는 만큼 중요하고도 실용적인 기법이니

개념을 정확히 알고 있으시길 바랍니다

 

 

new

마지막으로 new 를 통한 메서드 재 정의 하는 것을 알아 보겠습니다

new 역시 오버라이딩처럼 상속과 연관이 있습니다.

 

다만 new 를 통해 메서드를 재 정의하게 되면 부모 클래스의 원 메서드는 숨기게(가려지게되는 차이가 있습니다.

말 그대로 메서드를 새로(new) 정의하는 기법입니다부모 클래스의 메서드를 사용하지 않고 새로 정의하는 것이죠.

코드를 보겠습니다

 

public class Parent{

   public void ParentMethod(){

       Console.WriteLine("부모 메서드");

   }

}

 

public class Child : Parent{

   public new void ParentMethod(){

       Console.WriteLine("자식메서드(새로 정의됨)");

   }

}

 

new 는 부모 메서드가 virtual 이거나 아니거나 상관이 없습니다

 

 

new 와 오버라이딩의 차이점

언뜻 보면 오버라이딩과 별반 달라 보이지 않습니다그러나 이 둘은 엄연히 다른 기법입니다.

오버라이딩과는 달리 new 를 통한 메서드 재정의는 다형성과 아무런 연관이 없습니다

 

C#에서 상속 관계인 두 클래스에서 상위 타입으로의 형 변환은 묵시적으로 이루어 지기 때문에

다음과 같은 코드 작성이 가능합니다

 

Parent myObject = new Child();

myObject.ParentMethod();

 

이 때 출력 결과는 어떻게 될까요?

오버라이딩을 했을 경우에는 자식 클래스(Child)의 오버라이드 된 메서드가 실행되는 반면,

new 로 재정의 할 경우에는 부모 클래스(Parent)의 원 메서드가 실행됩니다

 

new 는 다형성과는 아무런 연관이 없이 단순히 자식 클래스에서 새로이 정의한다는 것입니다

 

다시 말해 오버라이딩은 부모 타입으로 메서드를 호출하더라도 객체로 생성된 자식 타입의 메서드가 호출되도록 하여 객체의 다형성이 가능해 지는 것입니다

 

이것으로 메서드 재 정의 3형제에 대한 소개를 마치도록 하겠습니다

오버라이딩과 오버로딩은 실무에서 굉장히 많이 사용되는 기법입니다

수 많은 코드에서 관련 예를 쉽게 찾아 볼 수 있을 것입니다그런 만큼 정확한 개념을 숙지하시기를 바랍니다.


- 8. virtual 메서드는 뭐하는 것이냐?


메서드 재정의(virtual, override)


virtual

부모 클래스/함수 앞에 붙는 예약어

자식 클래스에 의해서 재정의 될 수 있다는 의미를 가지고 있다.

컴파일러는 이 지정자가 붙은 함수를 비가상함수와 다르게 컴파일함으로써 재정의 될 준비를 한다.


override

자식 클래스/함수 앞에 붙는 예약어

부모로부터 상속받은 함수와는 다르게 구현한다는 의미를 가지고 있다.

재정의 되는 함수는 부모의 함수와 이름, 시그니처도 일치해야함.

재정의 된 함수는 부모의 함수에 의존적인 경우가 많은데 이 때 base 키워드로 부모의 원래함수를 호출 할 수 있다.


- 9. SOLID 디자인 개념이 무엇이냐?




ASP.NET MVC 파트에서는


- 1. HTTPS가 무엇이냐?


출처 - http://sonim1.tistory.com/99

HTTPS란?

HTTP 프로토콜은 위장이나 도난등의 보안문제가 발생할 수 있습니다.
이런 문제를 방지해주는 HTTPS에 대해 알아봅시다.

HTTP의 약점

HTTP는 주로 다음과 같은 약점을 가지고 있습니다.

평문(암호화 하지 않은) 통신이기 때문에 도청이 가능하다.
통신 상대를 확인하지 않기 때문에 위장이 가능하다
완전성을 증명할 수 없기 때문에 변조가 가능하다

이 약점은 다른 암호화 하지 않는 프로토콜에도 공통되는 문제입니다.

변조를 방지하려면?

HTTP를 사용하여 안전성을 확인하는 방법은 있으나 확실하거나 편리한 방법이 현재 존재하지 않습니다.
그중에도 자주 사용되는 방법으로는 MD5나 SHA-1 등의 해시 값을 이용하는 방법과 파일의 디지털 서명을 확인하는 방법이 있습니다.
허나 MD5 등이 적절하게 수정되어 있으면 유저로써 알 수가 없기 때문에 확실히 방지하기 위하여 HTTPS를 사용할 필요가 있습니다.

HTTP에 암호화와 인증과 안전성 보호를 더한 HTTPS

위에 열거한 약점을 보완하기 위하여 HTTP에 암호화나 인증 등의 구조를 더한 것을 HTTPS(HTTP Secure)라고 부릅니다.
HTTPS는 웹페지이의 로그인이나 쇼핑의 결제화면 등에서 사용되고 있습니다.
HTTPS를 사용할 경우 http://가 아닌 https://를 사용합니다.
브라우저에서도 HTTPS가 유효한 웹 사잍트에 액세스할 경우 자물쇠 마크가 표시되는 등 HTTP와 다르게 표시되는 경우가 있습니다.

HTTP에 SSL의 껍질을 씌우다

HTTPS는 새로운 애플리케이션 계층의 프로토콜이 아닙니다.
HTTP 통신을 하는 소켓 부분을 SSL(Secure Socket Layer)이나 TLS(Transport Layer SEcurity)이라는 프로토콜로 대체하고 있을 뿐 입니다.
무슨소리냐! HTTPS는 직접 TCP와 통신하지 않고 SSL과 통신을 하게 됩니다.
SSL을 사용함으로써 암호화, 증명서, 완전성 보호를 이용할 수 있게 됩니다.

SSL?

SSL은 HTTP와 독립된 프로토콜입니다.
애플리케이션 계층에서 동작하는 SMTP나 Telnet 등에서도 이용될 수 있습니다.
SSL은 HTTP뿐만 아니라 세계 어느 곳에서도 널리 사용할 수 있는 네트워크 보안기술입니다.

HTTPS는 하이브리드 암호 시스템

하이브리드 암호 시스템?
HTTPS는 공통키 암호와 공개키 암호의 양쪽 성질을 가진 하이브리드 암호 시스템입니다.
두가지 방식을 조합해서 장점을 살립니다.
키를 교환하는 곳에서는 공개키 암호를 사용하고 그 후의 통신에서 메시지를 교환하는 곳에서는 공통키 암호를 사용합니다.
그렇다면 공통키 암호와 공개키 암호는 무었일까요? 아래 간단히게 정리해보았습니다.

공통키 암호

상호간에 키를 교환하는 암호화 방식을 공개키 암호화 방식이라고 합니다.
SSL에서는 공개키 암호화 방식을 채용하고 있습니다.
암호화, 복호화에 하나의 키를 같이 사용하는 방식입니다.

하지만 키를 누군가 손에 넣으면 누구라도 암호를 해독할 수 있는 문제가 있습니다.

공개키 암호

공개키 암호는 공통키 암호의 문제를 해결하기 위해 등장한 방식입니다.
공개키 암호에서는 서로 다른 두 개의 키 페어(쌍)를 사용합니다.
비밀키(private key)와 공개키(public key)가 그것입니다.
비밀키는 알려지면 안되는 키이며, 공개키는 누구에게나 알려져도 괜찮은 키입니다.

1. 암호를 보내는 측(클라이언트)이 상대의 공개키를 사용해 암호화를 합니다.
2. 암호화된 정보를 받아들인 상대(서버)는 자신의 비밀키를 사용해 복호화를 실시합니다.

이 방식은 암호를 푸는 비밀키를 통신으로 보낼 필요가 없으며 도청에 의해서 키를 빼앗길 걱정이 없습니다.

하지만 공개키가 진짜인지 아닌지를 서버에서 증명할 수가 없습니다.
이 문제를 해결하는 데는 인증기관(CA : Certificate Authority)과 그 기관이 발행하는 공개키 증명서가 이용되고 있습니다.
인증 기관이란 클라이언트와 서버 모두 신뢰하는 제 3자 기관입니다.
공개키를 인증 기관에 제출하면 인증 기관은 제출된 공개키에 디지털 서명을 하고 서명이 끝난 공개키를 만듭니다.
그리고 공개키 인증서에 서명이 끝난 공개키를 담습니다.

이런 인증 기관의 공개키는 안전하게 클라이언트에 전달되어야 합니다.
하지만 어떤 방법을 사용하더라도 100% 안전이 보장되지 않기 때문에 많은 브라우저가 인증기관의 공개키를 사전에 내장한 상태로 제품을 내놓고 있습니다.

단점

HTTPS를 사용 시 증명서를 구입하여아 합니다. 증명서의 구입 비용이 부담되는 서비스나 개인 웹사이트의 경우 HTTP만 선택하기도 합니다.
그리고 HTTPS를 사용할 경우 처리가 늦어지게 되는 단점이 있습니다. 그 이유는 아래와 같습니다.

1. 클라이언트 요청 시, SSL에 필요한 통신이 추가됩니다
2. 암호화 복호화 계산을 하기 때문에 서버나 클라이언트의 리소스를 추가적으로 소비합니다.

위와 같은 이유로 항상 HTTPS를 사용하지 않습니다.


- 2. 크로스 사이트 스크립트가 무엇이냐?


- 3. TDD가 무엇이냐?


TDD : 테스트 주도 개발(Test-Driven Development, TDD)


테스트 주도 개발 방식에서는 단위 테스트를 이용해서 코드를 설계한다. 


핵심개념은 실패-성공-리팩터(Red-Green-Refactor) 작업 방식에 따른 개발이다. 


1. 응용프로그램에 추가할 새로운 기능이나 메서드를 결정한다.

2. 새로운 기능의 동작을 검증할 테스트부터 먼저 작성하고, 작성이 완료되면

3. 테스트를 수행해서 빨간 불을 얻는다(즉 일부러 테스트를 실패한다).

4. 새로운 기능을 구현하기 위한 코드를 작성한다.

5. 녹색 불을 얻을 때까지(즉 테스트가 성공할 때까지)다시 테스트 수행과 코드 수정을 반복한다.

6. 필요한 경우, 코드를 리팩터한다. 가령 구문을 재구성하거나 변수명을 변경하는 등의 작업을 수행한다.

7. 테스트를 수행해서 변경사항이 추가한 기능의 동작에 영향을 주지 않았는지 확인한다.


기능이 추가될 때마다 이 과정이 반복된다. TDD는 전통적인 개발 절차를 뒤집어버린다.

즉 먼저 완벽하게 구현된 기능에 대한 테스트부터 작성하는데, 당연히 이 테스트들은 실패하게 된다.

그런 다음 실제로 기능을 구현하고 여러 측면의 동작들을 구현해서 하나 이상의 테스트들을 통과 시킨다.


바로 이 일련의 과정들이 TDD의 본질이다.


TDD는 전반적으로 수준 높은 기술을 보유하고 있는 잘 훈련된 개발팀이나, 시간적인 제약에 직면하더라도 올바른 방식을 집핼할 수 있는 팀 리더가 존재하는 노련하고 성숙한 개발팀에 의해 사용되어야 한다.



- 4. TDD에서 Mocking이 무엇인지 알고 있느냐? 


- 5. 어떤 Mocking 프레임워크를 사용하느냐?


- 6. ORM의 장점은 무엇이냐? 


- 7. DI를 사용해본 적이 있느냐?



















- 그 외 별도


출처 - http://sonim1.tistory.com/

HTTP 인증

컴퓨터는 모니터 앞에 사람이 누구인지 알 수가 없습니다.
그렇기 때문에 아래의 요소들을 이용하여 인증을 사용하고 있습니다

패스워드 : 본인만이 알고 있는 문자열
원타임 토큰 : 본인만이 가지고 있는 기기 등에 표시되는 한 번 쓰고 버리는 패스워드 등의 정보
전자 증명서 : 본인(단말기)이 가지고 있는 정보
바이오 매트릭스 : 지문이나 홍채 등 본인의 신체정보
IC 카드 등 : 본인만이 가지고 있는 정보

HTTP에서 사용하는 인증 방법

HTTP/1.1에서 이용할 수 있는 인증방식은 아래와 같습니다.

익명

익명 요청은 인증정보를 포함하지 않는 요청을 말합니다. 리소스에 대한 모든 액세스 권한을 부여하는 것과 같습니다.

BASIC 인증

기본 인증은 클라이언트에 대한 사용자 이름과 암호를 Base64로 인코딩 된 문자열을 보냅니다.
간편하며 널리 쓰이나 패킷 도청에 취약합니다.
리소스 보안을 강하게 해야 할 경우 다른 인증방식을 사용하는 것이 좋습니다.

DIGEST 인증

사용자명, 패스워드 등을 조합하여 MD5 값으로 인증합니다. 기본 인증보다 보안이 강화된 인증방식입니다.

1. 클라이언트 - 페이지 요청
2. 서버 - digest 인증 필요하다고 통보
3. 클라이언트 - 사용자가 아이디/패스워드 입력하면, 서버정보+클라이언트 정보 병합 후 MD5로 암호화 하여 전송

Digest 인증방식에서 서버는 클라이언트로 단순히 패스워드를 받는것이 아니고 조합된 MD5로 해시된 값을 받습니다.

MD5란?

Message-Digest algorithm 5

  • 128비트 암호화 해시함수
  • 암호화, 체크섬 무결성 검사 등에 사용된다.
  • 임의의 길이 문자열 입력 -> 128비트 문자열 출력
[root@zetawiki ~]# echo -n 'hello world' | md5sum
5eb63bbbe01eeed093cb22bb8f5acdc3 -

-> 16진수 문자열로는 32자

SSL 클라이언트 인증

유저 ID와 패스워드를 사용한 인증방식은 이 두가지 정보가 정확하다면 본인으로서 인증할 수 있습니다.
그러나 이 정보가 도난됐을 때 제 3자가 접근을 할 수 있습니다.
이를 방지하기 위한 대책중의 하나가 바로 이 SSL 클라이언트 인증입니다.
HTTPS의 클라이언트 인증서를 사용하여 인증하는 방식입니다.

SSL클라이언트 인증의 경우 단독으로 사용되지 않고 아래 다룰 폼베이스 인증과 합쳐져서 이용되고 있습니다.

단점으로 클라이언트 증명서 구입비용 혹은 서버의 운영자 자신이 인증 기관을 만들어서 안전하게 운영하기 위해 들어가는 비용 등이 매우 많이 필요합니다.

폼 베이스 인증

인증의 대부분은 폼 베이스 인증입니다.
HTTP가 표준으로 제공하는 BASIC, DIGEST인증은 사용상의 문제, 보안적인 문제로 거의 사용되고 있지 않습니다.
SSL클라이언트 인증도 도입 비용이나 운용비용의 문제로 거의 사용하고 있지 않습니다.

폼 베이스 인증은 HTTP 프로토콜로서 사양이 정의되어 있는 인증 방식이 아닙니다.
클라이언트가 자격 정보를 송신하여 검증 결과에 따라 인증을 하는 방식입니다. 그래서 웹 애플리케이션 마다 제공되는 인터페이스나 인증의 방법이 다양합니다.


로그인 필드폼 베이스 로그인필드


하지만

폼 베이스 인증의 경우 기능 구현에 대한 표준적인 문서 등이 존재하지 않기 때문에 웹 애플리케이션에서 제각각 구현하는 폼 베이스 인증을 사용해야 합니다.
공통 사양이 없기 때문에 웹 사이트별로 다르게 구현하고 있으며, 안전한 방법으로 구현 시 높은 보안 등급을 유지할 수 있지만 문제있는 구조를 사용하고있는 웹사이트도 종종 발견할 수 있습니다.

표준적인 사양이 없으나 일반적으로 세션관리를 위해 쿠키를 사용하고 있습니다.
HTTP는 스테이트리스 프로토콜이기 때문에 방금 전 인증성공 유저라는 상태를 프로토콜 레벨에서는 유지할 수 없습니다.
즉 상태관리가 안되기 때문에 유저 구분을 위해서 세션 관리와 쿠키를 사용하고 있습니다.




Posted by 기억속의먼그대에게
IT/Powershell2014. 7. 11. 10:54

 

간략한 PowerShell 설명

Windows PowerShell은 시스템 관리 전용으로 설계된 작업 기반 명령 셸 및 스크립팅 언어입니다.

.NET Framework에 기반하여 개발된 Windows PowerShell은 IT 전문가와 고급 사용자가 Windows 운영 체제 시스템

및 Windows에서 실행되는 응용 프로그램의 관리를 제어하고 자동화할 수 있도록 해줍니다.

 

 

 

PowerShell 사용용도 예시 ( 실 프로젝트 사용 )

Microsoft 제품 군 중에 Virtual Machine Manager 라는 서버 가상화를 관리하는 제품이 있습니다. 물론 서버 엔지니어가 아니라 개발자이다 보니

MS에서 제공하는 cmdlet 을 사용하여 C# 코드 상에서 Virtual Machine Manager 명령 셸 을 실행하였습니다.

 

Windows PowerShell 에서 Virtual Machine Manager 명령 셸 을 사용하여 또는 작업 기반 스크립트를 사용하여 모든 시스템 센터 가상 머신 매니저 (VMM) 관리 기능을 수행 할 수 있습니다. 그리고 VMM은 간단한 관리 작업을 수행하기 위해 개별적으로 사용할 수있는 cmdlet을 제공합니다. ( 제공 cmdlet 개수 : 615개 가량 )

이러한 형식으로 MS 에서 제공하는 cmdlet 을 통하여 명령을 날릴수는 있지만 어느정도의 구문은 알아야 합니다. @_@ (예를 들어 if 문 , for 문 , 변수 선언 등)

 

위 글에 보면 Cmdlet 이란 표현이 있습니다. Cmdlet 이란 아래와 같습니다.

 

 

 

이번 포스팅은 간략하게 PowerShell에 대해 소개를 해봤습니다.

제가 MS 관련 솔루션에 대해 개발을 하다보니 MS 교육을 많이 듣는데요.

최근에 한 교육에서 강사가 그러더라구요.

앞으로 MS에서 GUI 적인 관리보다 PowerShell을 통한 관리에 대해 포인트를 맞춰 개발한다고..

그래서 PowerShell 공부를 하라네요.. 하..하..하 ^^:

 

물론 PowerShell 알아두면 좋겠지요..@_@

 

이상 포스팅을 마치겠습니다.

오늘 하루도 힘찬 하루 되세요~ ^^

'IT > Powershell' 카테고리의 다른 글

Powershell 그나마 조금 쉽게 쓰는 방법  (0) 2014.07.03
Posted by 기억속의먼그대에게
IT/IIS2014. 7. 11. 10:44

 

 

Http 500.19 에러 코드에 여러 변수가 있는데

 

서버 기준으로 내가 경험한 케이스는 2가지 이다

 

1. 폴더 권한 문제

    - 확실한 것은 아니지만 내가 해결했던 방법은 관리자 계정으로 해당 웹 소스를 경로를 다시 잡아주거나 웹 서버에 파일 복사를 다시 해주고 웹 사이트를

      재 구축하여 해결 했다. 

 

2. Framework 문제

    - 이러할 경우 커맨드로 .net framework asp.net 을 재설치하여 해결하였다.

     

 

 

여러 경험상 뭐라할까 웹 페이지에서 보여주는 오류 코드와 내용은 잘 맞지 않을때가 있다.

 

진짜 권한 문제는 -_-^

 

 

그 외 참고할 만한 것은 아래와 같이 MS에서 제공하는 내용이다. ( IIS 7 기준 )

 

·         500.19 - 구성 데이터가 잘못되었습니다. HTTP 상태 코드 관련된 Applicationhost.config 파일 또는 Web.config 파일에 연결된 문제로 인해 발생합니다. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오:

942055  (http://support.microsoft.com/kb/942055/ ) IIS 7 .0에서 호스트되는 웹 사이트를 방문할 때 오류 메시지: "HTTP 오류 500.19-내부 서버 오류"

 

 

 

 

Posted by 기억속의먼그대에게
IT/Windows2012 R22014. 7. 9. 10:48

이번에는 간단하고 알고 있으면 유익한 정보를 포스팅 하려 합니다.

Windows Server 2012 R2 기준으로 내가 사용하던 세션 찾기 또는 다른 사용자 세션으로 접속 및 로그오프 시키기 입니다.

물론 제가 알려드리는 것은 기초적인 것이라.. 가볍게 보시면 감사하겠습니다. ^_^

 

작업 관리자를 실행 시킵니다.

 

사용자 탭을 선택 합니다.

아래 그림과 같이 사용자 세션들이 보여지게 됩니다

자기가 접속 했던 세션을 찾는 팁은 미리 세션에 대한 ID 값을 알고 있거나 계정을 선택하고 아래 그림과 같이 프로세스 목록을 확인합니다.

 

찾는 세션을 찾았다면 선택하고 우 클릭 후에 연결을 선택 하면 그 세션으로 접속이 됩니다.

그리고 로그오프를 실행 시키면 해당 세션이 로그오프 되어 사라지게 됩니다.

다른 사용자 세션으로 접속하는 방법은 해당 계정의 패스워드를 알고 있어야 가능 합니다. ~_~;

Posted by 기억속의먼그대에게
IT/Windows2012 R22014. 7. 8. 15:09

 

하나의 administrator 계정 또는 하나의 User 계정을 가지고

두 개 이상의 세션을 통해 작업 또는 서비스를 하려면

계정에 대한 세션이 기본적으로 제한이 걸려 있어 풀어줘야 한다.

세션에 대해 착오가 있을 만한 사항은

  1. 터미널 서비스에 대한 라이선스 문제가 있기 때문에 연결 개수 제한을 푼다고 하더라도

    기본적으로 2개의 계정만 동시에 접속이 가능하다

     

  2. A라는 사용자가 test란 계정으로 원격을 접속했는데 B라는 사용자가 test 계정으로 접속하면

    A 사용자의 세션은 끊기고 B 사용자는 A사용자의 세션으로 접속이 되어버린다. 이러한 경우

    난감할 수 있기에 세션을 나눠 사용하고 싶으면 아래 글을 참조 하면 된다.

 

실행 -> gpedit.msc(로컬 그룹 정책 편집기)를 실행

컴퓨터 구성 -> 관리 템플릿 -> Windows 구성 요소

터미널 서비스 -> 원격 데스크톱 세션 호스트 -> 연결

우측 기능 목록 -> 원격 데스크톱 서비스 사용자를 하나의 원격 데스크톱 서비스 세션으로 제한

 

사용 안 함 선택 -> 적용

 

위 와 같이 정책을 변경 하였다면 하나의 계정으로 여러 세션을 가지는 것을 확인 할 수 있을 것이다.

하지만 아직 확인 하지 못한 부분은 그 외 계정으로 접속하면 기존 세션이 밀려 없어 질 수 도 있으니 유의.. ^^;

아 그리고 추가적으로 여러 세션을 가지고 사용시에는 서버 리소스가 좋아야 함. 나중에 리소스 문제가 큼. ~_~

정책은 까다롭고 라이선스 문제에 확인 할게 많다..ㅜ

 

다음 포스팅 글은 Windows Server 2012 R2 기준으로 내가 사용하던 세션 찾기 또는 다른 사용자 세션으로 접속 및 로그오프 시키기

 

 

Posted by 기억속의먼그대에게
IT/WAS2014. 7. 8. 14:09

 

오라클사 에서 IIS 8.5에 대한 웹로직 플러그인을 지원 한다네요. ^^

 

지원 내용 확인 아래 URL 참조

http://docs.oracle.com/middleware/1213/webtier/PLGWL/overview.htm#PLGWL391

 

 

다운로드는 아래 URL 참조

http://www.oracle.com/technetwork/middleware/webtier/downloads/index.html

 

 

'IT > WAS' 카테고리의 다른 글

Tomcat 에러코드  (0) 2014.07.03
Posted by 기억속의먼그대에게
IT/C#2014. 7. 3. 16:31


확장자가 없는 iso 나 exe 파일 같은 경우에는 미디어 파일 변환 해주는 툴 가지고 iso 인지 exe 파일인지
알 수 있었는데 문서쪽은 제공을 안해 줌..


열심히 구글링을 해봐도 안나오고..  중요 포인트를 못잡고 검색을 해서 그런지.. ㅜ

훈스닷넷 Q&A를 올림.

 

답변 글 :

 

Win32API에서 제공하는 FindMimeFromData를 이용해서 파일의 MIME TYPE를 알아낸 후 ,
MIME TYPE에 해당되는 확장자를 구해오는 방법도 있습니다~

http://stackoverflow.com/questions/58510/using-net-how-can-you-find-the-mime-type-of-a-file-based-on-the-file-signature 참고하세요~~

 

 

'IT > C#' 카테고리의 다른 글

System.Timers.Timer 문제  (0) 2014.07.03
WCF 에서 PowerShell 을 실행 시킬때 계정 문제  (0) 2014.07.03
C# Powershell 코딩  (0) 2014.07.03
Posted by 기억속의먼그대에게
IT/C#2014. 7. 3. 16:25

interval 을 1초로 주고 테스트 진행

매 초 마다 잘 실행되는 것 같았는데 보니까
중간에 불규칙하게 1초 정도가 빔

11
12
    <--- 13이 찍혀야하는데 건너뜀
14
15

어떤 문제 때문에 이런 현상이 나타나는 걸까... 고민
매 초 마다 해야하는 동작이 있는데 중간마다 1초씩 비니까 난감...

 

열심히 구글링 하고 테스트 한 결과

 

타이머의 Interval은 정확하지가 않고 환경에 따라 오차범위가 있으며
무튼.. 정확한 interval 로 구현하기는 매우 까다롭다는 걸 오늘 테스트 하다보니 알게 됨..

아 그리구 이것저것 찾다가 코드프로젝트에서 진짜 거의 정확도 99퍼센트에 근접한 타이머 샘플 획득

http://www.sysnet.pe.kr/3/0/956 <- 알게 된 경로
http://www.codeproject.com/Articles/5501/The-Multimedia-Timer-for-the-NET-Framework <-다운 받는 URL

정보 공유합니다. ^^

 

참고로 제가 쓴 글이 100퍼센트 맞지는 않습니다.

훈스닷넷에 Q&A를 올려서 몇분의 고수분들한테 도움을 받았는데

음.. 제가 초중급이라 이해를 잘 못했던 것 같네요. 그래도 보시고 도움 될까하여 아래 Q&A 링크 기재합니다.

 

http://www.hoons.net/Board/qacshap/Content/61924?Key=Name&Value=%ec%9d%b4%ec%b9%98%ea%b3%a0%ec%9d%b4%ec%b9%98%ec%97%90


 

 

Posted by 기억속의먼그대에게