본문 바로가기

JAVA/Spring

스프링3 개론

반응형

스프링

스프링이 자바에서 가장 중요하게 가치를 두는 것이 객체지향 프로그래밍이 가능한 언어라는 점

스프링이 가장 관심을 많이 두는 대상은 오브젝트.

스프링을 이해하려면 오브젝트에 깊은 관심을 가져야한다.

오브젝트에 대한 관심은 오브젝트의 기술적인 특징과 사용방법을 넘어서 오브젝트의 설계로 발전하게 된다.

객체지향 설계의 기초와 원칙을 비롯해서,

다양한 목적을 위해 재활용 가능한 설계방법인 디자인 패턴

좀 더 깔끔한 구조가 되도록 지속적으로 개선해나가는 작업 리팩토링

오브젝트가 기대한 대로 동작하고 있는지 효과적으로 검증하는 데 쓰이는 단위 테스트 등

오브젝트 설계와 구현에 관한 여러가지 응용 기술과 지식이 요구된다.


관심사의 분리

소프트웨어 개발에서 끝이란 개념은 없다.

사용자의 비즈니스 프로세스와 그에 따른 요구사항은 끊임없이 바뀌고 발전한다.

애플리케이션이 기반을 두고 있는 기술도 시간이 지남에 따라 바뀌고, 운영되는 환경도 변화한다.

개발자가 객체를 설계할 때 가장 염두에 둬야 할 사항은 미래의 변화를 어떻게 대비할 것인가이다.


객체지향 설계와 프로그래밍이 이전의 절차적 프로그래밍 패러다임에 비해 초기에 좀 더 많은, 번거로운 작업을 요구하는 이유는 객체지향 기술 자체가 지니는, 변화에 효과적으로 대체할 수 있다는 기술적인 특징 때문이다.

객체지향 기술은 흔히 실세계를 최대한 가깝게 모델링해 낼 수 있기 때문에 의미가 있다고 여겨진다. 하지만 그 보다는 객체지향 기술이 만들어내는 가상의 추상세계를 효과적으로 구성할 수 있고, 이를 자유롭고 편리하게 변경, 발전, 확정시킬수 있다는데 더 의미가 있다.


프로그래밍의 기초 개념중에 관심사의분리(Separation of Concerns)가 있다.

관심이 같은 것 끼리는 하나의 객체 안으로 또는 친한 객체로 모이게하고, 관심이 다른 것은 가능한 한 따로 떨어져서 서로 영향을 주지 않도록 분리하는 것


1. 중복코드의 메소드 추출

중복된 코드를 분리하는 것

- 기능에는 영향을 주지 않으면서 코드의 구조만 변경


2. 상속을 통한 확장

- 클래스 계층 구조를 통해 두 개의 관심이 독립적으로 분리되면서 변경 작업은 한층 용이해짐

-슈퍼클래스에 기본적인 로직 흐름을 만들고, 그 기능의 일부를 추상 메소드나 오버라이딩이 가능한 protected 메소드 등으로 만든 뒤, 서브클래스에서 이런 메소드를 필요에 맞게 구현해서 사용하는 방법을 디자인패턴에서 템플릿 메소드 패턴 (template method pattern)

-서브 클래스에서 구체적인 오브젝트 생성 방법을 결정하게 하는 것을 팩토리 메소드 패턴(factory method pattern)


중요한건 상속 구조를 통해 성격이 다른 관심사항을 분리한 코드를 만들어내고, 서로 영향을 덜 주도록 했는지 이해하는 것이다.


단점-상속자체는 간단해 보이고 사용하기도 편리하게 느껴지지만 사실 많은 한계점이 있다.

1) 자바는 클래스의 다중 상속을 허용하지 않는다.

2) 상속을 통한 상하위 클래스의 관계는 생각보다 밀접하다.

상속을 통해 관심이 다른 기능을 분리하고, 필요에 따라 다양한 변신이 가능하도록 확장성도 줬지만 여전히 상속관계는 두 가지 다른 관심사에 대한 긴밀한 결합을 허용한다.

서브클래스는 슈퍼클래스의 기능을 직접 사용할 수 있다.

그래서 슈퍼클래스 내부의 변경이 있을 때 모든 서브 클래스를 함께 수정하거나 다시 개발할 수 도 있다.


3. 클래스의 분리

독립된 메서드를 만들어서 분리했고, 상하위 클래스로 분리했다.

완전히 독립적인 클랙스로 만들어서 분리


단점-특정 클래스에 중속되어있기 때문에 상속을 사용했을 때 처럼 코드의 수정없이 기능을 변경할 방법이 없다.


4. 인터페이스의 도입

두 개의 클래스가 서로 긴밀하게 연결되어 있지 않도록 중간에 추상적인 느스한 연결고리를 만들어주는 것이다.

추상화란 어떤 것들의 공통적인 성격을 뽑아내어 이를 따로 분리해내는 작업이다.

자바가 추상화를 위해 제공하는 가장 유용한 도구는 바로 인터페이스이다.

인터페이스는 자신을 구현한 클래스에 대한 구체적인 정보는 모두 감춰버린다.

인터페이스를 통해 접근하게 하면 실제 구현 클래스를 바꿔도 신경 쓸 일이 없다.


5. 관계설정 책임의 분리

오브젝트 사이의 관계가 만들어지려면 일단 만들어진 오브젝트가 있어야 하는데, 직접 생성자를 호출해서 직접 오브젝트를 만드는 방법도 있지만 외부에서 만들어 준 것을 가져오는 방법도 있다.

외부에서 만든 오브젝트를 전달받을려면 메서드 파라미터나 생성자 파라미터를 이용하면된다.


코드에서는 특정 클래스를 전혀 알지 못하더라도 해당 클래스가 구현한 인터페이스를 사용했다면, 그 클래스의 오브젝트를 인터페이스 타입으로 받아서 사용할 수 있다.

바고 객체지향 프로그램에는 다형성이라는 특징이 있는 덕분이다.


오브젝트 사이에 런타임 사용관계 또는 링크, 또는 의존관계라는 불리는 관계를 맺어주면된다.

모델링 시에는 없었던 보이지 않던 관계가 오브젝트로 만들어진 후에 생성되는 것.

런타임 오브젝트 관계를 갖는 구조로 만들어주는게 바로 클라이언트의 책임이다.


인터페이스를 도입하고 클라이언트의 도움을 얻는 방법은 상속을 사용해 비슷한 시도를 했을 경우에 비해서 훨씬 유연하다.


원칙과 패턴

개방폐쇄원칙 OCP(open closed principle) - 클래스나 모듈은 확장에 열려 있어야 하고 변경에는 닫혀 있어야 한다.


높은 응집도와 낮은 결합도

높은 응집도

변화가 일어날 때 해당 모듈에 변하는 부분이 크다는 것으로 설명한다.

즉 변경이 일어 날때 모듈의 많은 부분이 함께 바뀐다면 응집도가 높다고 말할 수 있다.

만약, 모듈의 일부분에만 변경이 일어나도 된다면, 모듈 전체에 어떤 부분이 바뀌어야하는지 파악해야 하고, 또 그 변경으로 인해 바뀌지 않는 부분에는 다른 영향을 미치지 않는지 확인해야 하는 이중의 부담이 생긴다.



낮은 결합도

낮은 결합도는 높은 응집도보다 더 민감한 원칙이다.

책임과 관심사가 다른 오브젝트 또는 모듈과는 낮은 결합도, 즉 느슨하게 연결된 형태를 유지하는 것이 바람직하다.

느스한 연결은 관계를 유지하는데 꼭 필요한 최소한의 방법만 간접적인 형태로 제공하고, 나머지는 서로 독립적이고 알 필요도 없게 만들어주는 것이다.

결합도가 낮아지면 변화에 대응하는 속도가 높아지고, 구성이 깔끔해진다.

또한 확장하기에도 매우 편리하다.

결합도란 '하나의 오브젝트가 변경이 일어날 때에 관계를 맺고 있는 다른 오브젝트에게 변화를 요구하는 정도'

낮은 결합도란 결국, 하나의 변경이 발생할 때 마치 파문이 이는 것처럼 여타 모듈과 객체로 변경에 대한 요구가 전파되지 않는 상태를 말한다.

결합도가 높아지면 변경에 따르는 작업량이 많아지고, 변경으로 인해 버그가 발생할 가능성이 높아진다.


전략패턴

전략패턴은 디자인 패턴의 꽃이라고 불릴 만큼 다양하게 자주 사용되는 패턴이다.

개방폐쇄원칙의 실현에도 가장 잘 들어맞는 패턴이라고 볼수 있다.

전략 패턴은 자신의 기능맥락(context)에서, 필요에 따라 변경이 필요한 알고리즘을 인터페이스를 통해 통째로 외부에 분리시키고, 이를 구현한 구체적인 알고리즘 클래스를 필요에 따라 바꿔서 사용할 수 있게 하는 디자인 패턴이다.

여기서 알고리즘이란 독립적인 책임으로 분리가 가능한 기능을 뜻한다.

이를 대체 가능한 전략이라고 보기 때문에 패턴의 이름이 전략 패턴이다.


예) 

UserDao는 전략 패턴의 컨텍스트에 해당

컨텍스트는 자신의 기능을 수행하는데 필요한 기능 중에서 변경 가능한, DB 연결방식이라는 알고리즘을 ConnectionMaker라는 인터페이스로 정의하고, 이를 구현한 클래스, 즉 전략을 바꿔가면서 사용할수 있게 분리했다.

전략 패턴은 UserDaoTest와 같은 클라이언트의 필요성에 대해서도 잘 설명하고있다.

전략 패턴의 적용방법을 보면 클라이언트의 역할이 잘 설명되어있다.

컨텍스트(UserDao)를 사용하는 클라이언트(UserDaoTest)는 컨텍스트가 사용할 전략(ConnectionMaker를 구현한 클래스 DConnectionMaker)을 컨텍스트의 생성자를 통해 제공해주는게 일반적이다.


UserDao 는 개방폐쇄원칙을 잘 따르고 있으며, 응집력이 높고 결합도는 낮으며, 전략 패턴을 적용했음을 알수 있다.


스프링이란 객체지향적 설계원칙과 디자인 패턴에 나타난 장점을 자연스럽게 개발자들이 활용할 수 있게 해주는 프레임워크다.






반응형

'JAVA > Spring' 카테고리의 다른 글

스프링3 싱글톤 레지스트리와 오브젝트 스코프  (0) 2018.03.09
스프링3 제어의 역전(IoC)  (0) 2018.03.07
Spring Boot  (0) 2017.12.19
MyBatis Mapper  (0) 2017.12.18
Spring login with cookie  (0) 2017.12.14