컴퓨터공부

스프링이란?

achivenKakao 2013. 7. 29. 17:32

안녕하세요. IT여행자입니다.


스프링이 무엇인가에 대한 시비를 걸도록 하겠습니다.(이하 평어)


스프링 프레임워크처럼 양면성을 갖고 있는 프레임워크도 드물다.혹자는 “배울 필요도 없이 간단해...원리만알면 누구나 할 수 있어” 라고 평가하고 누구는 “봐도봐도 알 수 없어” 라고 평가 하기도 한다.


이는 스프링의 가장큰 특징 2가지가 겹쳐진 현상 때문일지도 모른다.첫번째와 같은 평가자라면 스프링은 자바의기본기에 매우 충실하다 하는 사실을 봤을 것이고,두번째 평가자는 스프링의 확장성과 유연성을봤기 때문일 것이다본 필자도스프링을 쳐다볼 때마다 “아무것도 아닌것이 봐도봐도 모르겠네” 라는 생각이 든다.혹 아직 내공이 부족함의 소치는 아닐까!!!


스프링을 이해 하려면 크게 두가지 요소에 대한 이해로 부터 시작해야 한다. 바로 DI와 AOP라는 개념이다.


둘 모두 한마디로 정의한다는것은 불가능하다. 하나 하나 샘플 코드를 만들어 가면서 "바로 이거군" 하고 느끼는 것이 더 좋을 듯하다. 하지만 그 불가능하다는 정의를 한번 해 보자.


DI(Dependency Injection) 의존성 주입


참 어렵게 해석되어 있다. 그러나 탁히 다른 말로 표현 할 수 도 없고. 그러나 궂이 다른 형태로 설명하려 한다. DI란 다른 클래스를 가져다 쓸 때 내가 직접 생성해서 사용하는 것이 아니라 다른 어떤 곳에서 생성해 준 것을 그냥 필요할 때 가져다 쓰는 것을 의미 한다. 내 클래스안에 다른 클래스가 있다는 것은 다른 클래스에 대해 의존성이 있다고 표현한다. 당연히 내가 사용하고 있는 다른 클래스가 변경 된다면 나도 그 영향을 받는것이 아닌가...그러니 의존성이 있다고 표현하는 것이다.


이런 의존성을 최소화 시키는 작업을 DI 라는 기법을 통해서 설정한다.


간단한 예를 들어 보자. DI기법 없이 아래와 같이 클래스를 구현했다 하자.


class MyDependency extends Depen{ ... }


class MainClass{

    MyDependency m = new MyDependency(); //(1)

}


위의 (1)과 같이 MainClass에서 MyDependency 클래스를 사용 했다면 이 두 클래스는 의존성이 100%로, 빼도 박도 못하는 상황에 처하게 된다. 만약 잘 사용하던 MyDependency 클래스를 사용하지 않고 새롭게 구성된 MeDenpendency 클래스를 사용해야 한다면 어찌할 것인가???


부랴 부랴 MyDependency 클래스를 사용하고 있는 모든 클래스를 찾아서 수정해 주어야 하지 않을까??? 소스가 한 두개라면야 그게 더 효율적이겠지만 스프링을 적용하겠다고 한다는 프로젝트의 볼륨이 그 정도는 아닐것이다. 수십, 수백군데는 되지 않겠는가...


위의 MainClass의 내용을 아래와 같이 수정해 보자.


class MainClass{

    Depen d = null;

    public MainClass(Depen d){

        this.d = d;

    }

}


단순히 생성자의 매개변수를 통해 전달 받는 것으로 바꾼것 처럼 보이지만 이것이 어이없게도 DI의 핵심이다. 즉 MainClass에서 객체를 생성해서 사용하는것이 아니라 외부의 어떤 곳에서 객체를 생성하여 생성자나 특정 매서드를 통해 전달해 주는 것이다.


그렇게 된다면 MyDenpendency 클래스를 전달하던 MeDependency를 만들어 전달하든 MyClass에서는 Depen 타입으로 전달 받아 사용하면 된다.


이 때 "외부의 어떤 곳" 을 스프링에서는 외부 조립기라 부르며 외부 조립기는 일반적으로 xml 타입으로 정의하여 사용한다.


AOP(Aspect Oriented Programming)


AOP라는 개념 또한 DI와 같이 한마디로 정의하기란 쉽지 않다. 그러나 저를 포함한 대부분의 사람들은 한마디로 뭐??? 를 듣고 싶어 한다. 억지로 한마디로 정의해 보자. AOP란 "어떤 프로그램들안에서 공통적으로 처리되어야 할 사항을, 적용하려는 코드없이 적용될 수 있게 하는것" 이라 할 수 있다.


예를 들어서 좀더 풀어서 설명하면 로그인을 처리하는 프로그램이 있다치자. 로그인 이라는 주된 처리 내용이 있지만 실제로 로그인을 처리하기 위해 사전에 필요한 내용은 로그인을 하기 위해 아이디나 암호를 입력했느냐를 검증해야 한다. 이를 로그인을 처리하는 프로그램에서 입력했는지를 검증하는 코딩을 넣지 않고도 자동으로 입력했는가를 검증해 주는 요소를 만들어 내는 것을 AOP라 생각하면 된다. 


또한 AOP란 로그인이 처리된 후 사용한 데이터베이스의 커넥션 처리를 로그인 프로그램에서 커넥션 처리에 관한 어떠한 코딩의 흔적없이, 역시 커넥션 처리가 자동으로 실행되도록 하는것이다. 


이러한 모습 때문에 "봐도 봐도 모르겠다" 하는 것이요, 이에 대한 이해가 된 사람들은 "아무것도 아니다" 라고 하는 것이다.


이상 스프링을 이해 하기 위해 꼭 필요한 두 가지 용어에 대한 풀이를 해 봤습니다. 그러나 개념이란 것은 "차표" 이상의 의미는 없습니다. 차표가 있다고 해서 자동으로 부산에 갈 수는 없겠죠. 차표를 갖고 버스를 타든, 기차를 타든, 비행기를 타든 하여튼 움직여야 부산에 갈 수 있답니다.


어서 어서 승차하세요. ^_____^


출처 : http://cafe.naver.com/itdocument/2507