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 기억속의먼그대에게