빠에야는 개발중
스프링 퀵 스타트 : chap 1-1 본문
프레임워크 소개
프레임워크는 개발자에게 간편하게 개발할 수 있도록 그 틀을 제공한다. 이렇게 함으로써 개발 컨벤션을 어느 정도 통일시켜 다른 개발자들간의 혼동을 줄이고, 전체적으로 유지보수 비용을 줄일 수 있다. 스프링에서는 스프링 컨테이너가 IoC를 담당하여 객체 생명주기 관리 등 번거로운 작업들을 대신 해주어(대신 해주는 것 뿐만 아니라 나같은 초보 개발자보다 훨씬 더 잘 관리해준다.) 개발자가 로직에만 집중할 수 있도록 도와준다. 결국 개발하기 편하라고 만들어진 물건인 것이다.
실습
이번 챕터에서는 차례차례 단계를 밟아가며 스프링에서 어떻게 IoC를 제공하고 있는지 경험해보고자 한다.
결합도가 높은 프로그램
다음과 같은 프로그램이 있다.
위 코드에서는 삼성tv와 엘지tv 간의 기능 변경을 하기가 굉장히 불편하다. 각자의 메소드 이름이 다르고, 변경 될 때마다 코드를 수정해야하기 때문이다. 결합도를 낮출 수 없을까?
먼저 생각해볼 수 있는 방법은 다형성를 이용하는 것이다. 각 tv 클래스에서 공통 인터페이스를 추출해내는 것이다. 이렇게 함으로써 각 클래스의 메소드 이름을 통일되도록 강제할 수 있다.
다음으로 팩토리 패턴을 이용하는 방법이 있다. 인터페이스를 추출해내는 것은 좋았지만 결국 객체를 생성하는 코드를 수정해야 함은 변함이 없다. 이 때 팩토리 메소드를 이용하여 객체를 넘겨 받으면 변경점이 있을 때 이름만 수정하면 되도록 하여 코드 수정 없이 느슨한 결합도를 가지도록 할 수 있다.
스프링에서는 어떻게 하는가?
스프링은 xml 설정 파일로 각종 설정들을 관리한다. applicationContext.xml 파일에 bean을 등록하여 해당 bean의 id로 클래스를 찾아가도록 할 수 있다. 이렇게 하면 코드 부분은 전혀 건드리지 않고 이 xml 파일의 내용만 수정하면 되기 때문에 유지보수가 한결 쉬워졌다고 할 수 있다.
또한 bean마다 속성을 설정해줄 수 있다. 보이는 바와 같이 init-method, destroy-method 속성을 사용하여 객체의 생성 직후, 소멸 직전에 특정 메소드를 통하여 작업을 지정해줄 수 있다.
메소드를 생성하여 속성으로 등록해주면
객체 생성 후, 객체 소멸 직전에 실행된다.
이 두 가지 속성 외에도 lazy-loading, scope 등의 속성들이 있다.
IoC를 해보자
스프링에서 IoC를 하는 방법은 두가지로 나뉜다.
생성자 인젝션
위에서 보았던 삼성 tv 클래스에 다음과 같은 의존 관계가 생겼다고 하자.
삼성 tv에 소니 스피커가 달렸다. 그래서 볼륨을 조절하려면 소니 스피커를 통해야만 하고, 위 코드에서는 볼륨 조절을 할 때마다 객체가 생성되어 자원이 낭비되고, 스피커 객체의 변경이 일어나면 코드를 일일히 수정해줘야한다. 매우 불편한 코드가 아닐 수 없다. 이를 생성자 인젝션으로 해결해보자.
매우 간단하다. 생성자 오버로딩을 한 후에 bean 내에 contructor-arg 속성을 추가해주면 된다. 이제 변경은 ref가 가리키는 bean의 id만 바꿔주면 된다.
더불어 자원을 singleton으로 관리해주기 때문에 객체 생성도 한번만 되는 모습을 볼 수 있다.
setter 인젝션
이번에는 setter 메소드를 통하여 인젝션을 해보자. 이것도 간단하다. setter 메소드를 만들고, 이번에는 constructor-arg 속성 대신 property 속성을 추가해주면 된다.
이전 프로젝트에서는 이런 식으로 사용해본 적이 없었는데, 그 대신 getter와 setter가 포함된 pojo 객체(dto, vo)와 annotation-driven을 사용했었다. 컨벤션 상으로도 그렇게 정해져 있었고 더 편하기도 했다. 하지만 기본적인 내용인만큼 알고 넘어가야겠다.
'공부 > 스프링' 카테고리의 다른 글
스프링 퀵 스타트 : chap 3-1 (379) | 2018.01.29 |
---|---|
스프링 퀵 스타트 : chap 2-2 (406) | 2018.01.27 |
스프링 퀵 스타트 : chap 2-1 (418) | 2018.01.26 |
스프링 퀵 스타트 : chap 1-2 (392) | 2018.01.23 |
잊고 있던 스프링 기억해내기 (402) | 2018.01.20 |