카테고리 없음2017. 5. 12. 01:06


Posted by 기억속의먼그대에게
소소한 Everyday Life/책2016. 8. 18. 17:03



아침 1시간 노트



출간일: 2015년 09월 10일

저자: 야마모토 노리아키

역자: 서수지




독서 후기는 


나중에...

Posted by 기억속의먼그대에게
소소한 Everyday Life/책2016. 8. 18. 16:59



내일이 내 생애 마지막 날이라면



출간일: 2013년 05월 08일

저자: 히스이 코타로

역자: 은영미




독서 후기는 


나중에...

Posted by 기억속의먼그대에게
소소한 Everyday Life/책2016. 8. 18. 16:58




나는 한 번 읽은 책은 절대 잊어버리지 않는다 : 10년이 지나도 잊어버리지 않는 독서법



출간일: 2016년 01월 20일

저자: 카바사와 시온

역자: 은영미




독서 후기는 


나중에...

'소소한 Everyday Life > ' 카테고리의 다른 글

아침 1시간 노트  (3) 2016.08.18
내일이 내 생애 마지막 날이라면  (0) 2016.08.18
Posted by 기억속의먼그대에게
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 기억속의먼그대에게

 

10월 오사카 여행을 떠나기 전에

운동화 하나를 구입하기로 결정!

 

직접 매장 방문하여 사는 게 좋지만은

평일에 퇴근하고 어디 들릴 힘도 없거니와

밖에 돌아다니는 게 귀찮기도 하고 하여

인터넷으로 구입하기로 결정!

 

운동화 뭐 살까 검색 하다가

뉴발 880 레이싱이 눈에 들어와서 +_+

 

 

 

자주 애용하는 SSG.COM 에서 검색하고

바로 결제

완전 속전속결이었다는!

 

2일 후

두둥!

옆에 사은품 양말이 ^^

 

 

개봉!

 

직접 보니까 확실히 이쁘다^^

무게도 가볍고

무엇보다 신고 살짝 걸어 봤는데

발이 진짜 편함!!!

 

앞으로 잘 부탁합니당

나의 새 신발님

 

 

Posted by 기억속의먼그대에게

RFP

제안요청서(RFP, request for proposal)는 발주자가 특정 과제의 수행에 필요한 요구사항을 체계적으로 정리하여 제시함으로써 제안자가 제안서를 작성하는데 도움을 주기 위한 문서이다. 제안요청서에는 해당 과제의 제목, 수행기간, 금액, 참가자격, 제출서류 목록, 요구사항, 제안서 목차, 평가 기준 등의 내용이 포함된다.

제안요청서는 시스템 설계에 사용자의 요구사항을 반영해 나중에 사용자의 제안이 잘 실행되고 있는지 판단하기 쉽게 만든다. 제안요청서를 만드려면 현재 판매 회사의 상황을 잘 이해하고 있어야 한다.

 

RFI - request for information 자료 의뢰서.

 

 

Posted by 기억속의먼그대에게
ETC/음악2014. 7. 21. 12:52

 

 

 

씨스타 - Touch my body

 

여름하면 씨스타~ 하트3

 

 

 

 

 

 

 Touch my body Body
Touch my body Body
Touch my body Body
Touch my body

 

I know you want it 넌 내 곁으로 와
내가 준비한 wine 달콤한 chocolate chocolate
좀 부드럽고 때론 뜨거워지는 너만을 위한 my pool
na na na na na na

 

빨개진 너의 두 눈에 비친 내 모습
운전은 니가 해 그저 내 두 손은 하늘위로
Yeh baby dancing with me you're my star

 

Touch my body 우린 조금씩 빠르게
Oh everybody 푸른 하늘 보다 높이
지금 이 리듬이 좋아 뜨거운 태양아래 너와나
My body body Touch ma body
Baby so good 지금 기분은 paradise
Baby so nice 우리 둘만의 summer night
조금씩 one step two step 달빛 아래 너와나
My body body Touch ma body

 

Touch my body Body
Touch my body Body
Touch my body Body
Touch my body

 

하나 둘씩 밝혀지는 니 맘 속안에 촛불
힘이 들 땐 조금 쉬었다가요 여기 red pool
내 입술이 좋아 아님 내 body가 좋아
솔직히 말해 여기 여기 여기 아님 저기 저기 저기

 

나밖에 없다고 지금 내게 말해줘
부끄럽게 자꾸 보지 말고 계속 날 안아줘
날 사랑한다 말해줘

 

너와 함께 있는 지금 Tonight
둘이 함께 보는 저 별들
어느 누구보다 행복해

 

 

 

 

 

Posted by 기억속의먼그대에게