티스토리 뷰
스프링의 핵심 철학
- 자바 엔터프라이즈 기술의 혼란 속에서 잃어버렸던 객체지향 기술의 진정한 가치를 회복
- 객체 지향 프로그래밍이 제공하는 폭 넓은 혜택을 누릴 수 있도록 기본으로 돌아가는 것
관심사의 분리
- 변경이 일어날 때 필요한 작업을 최소화 하기 위해서는 분리와 확장을 고려한 설계가 필요하다
- 관심사의 분리는 친한 객체는 모이게하고, 관심이 다른 객체는 떨어져 서로 영향을 주지 않도록 하는 것이다
템플릿 메소드 패턴
- 상속을 통해 슈퍼 클래스의 기능을 확장할 때 사용하는 대표적인 방법
- 변하지 않는 기능은 추상클래스에 만들어두고
- 자주 변하며 확장할 기능은 서브 클래스에 만들어 둔다
- 슈퍼 클래스에서는 추상 메소드 혹은 오버라이드 가능한 메소드를 정의해둔다
- 서브 클래스에서 선택적으로 오버라이드할 수 있도록 만든 메소드(protected)를 훅 메소드라 한다
팩토리 메소드 패턴
- 템플릿 메소드 패턴과 비슷하게 상속을 통해 기능을 확장하는 패턴
- 슈퍼 클래스 코드에서는 서브 클래스에서 구현할 메소드를 호출해서 필요한 타입의 오브젝트를 가져와 사용한다
- 보통 인터페이스 타입으로 오브젝트를 리턴한다
인터페이스
- 추상화는 어떤 것들의 공통적인 성격을 뽑아내 느슨한 연결고리를 만드는 것 이다.
- 자바가 제공하는 추상화의 가장 유용한 도구가 인터페이스이다.
- 접근하는 쪽에서는 추상화 해놓은 최소한의 통로(타입)를 통해 오브젝트에 접근해 구체적으로 어떤 구현 클래스를 사용할지 몰라도 된다.
- 접근하는 쪽에서 구현 클래스를 직접 생성한다면, 여전히 코드를 수정해야하는 일이 발생한다. 따라서 이러한 관계를 외부에서 설정한다
원칙과 패턴
개방 폐쇄 원칙(OCP)
- 클래스나 모듈은 확장에는 열려있으나, 수정에는 닫혀있어야한다.
- 구체적은 클래스에 의존하는 것이 아니라 추상에만 의존해야한다
높은 응집도
- 응집도가 높다는 것은 변화가 일어날 때 해당 모듈에서 변하는 부분이 크다는 것이다.
- 하나의 모듈, 클래스가 하나의 책임 또는 관심사에만 집중되어 있다는 뜻이다.
낮은 결합도
- 느슨한 연결은 관계를 유지하는 데 꼭 필요한 최소한의 방법만 간접적인 형태로 제공하고, 나머지는 서로 독립적이고 알 필요도 없게 만드는 것이다.
- 결합도가 낮아지면 변화에 대응하는 속도가 높아지고, 구성이 깔끔해진다
- 결합도는 하나의 오브젝트가 변경이 일어날 때에 관계를 맺고 있는 다른 오브젝트에게 변화를 요구하는 정도
응집도는 관심사가 분리되어 있는 정도, 결합도는 한 오브젝트의 변경이 다른 오브젝트에 영향을 미치는 정도이다.
전략 패턴
- 자신의 기능 맥락에서 필요에 따라 변경이 필요한 알고리즘을 인터페이스를 통해 통째로 외부로 분리시키고, 구현 클래스를 필요에 따라 바꿔서 사용할 수 있게 하는 패턴
- OCP에도 가장 잘 들어 맞는 패턴이다.
제어의 역전(IoC)
팩토리
- 한 클래스가 구현체를 직접 선택하고 있을 때, 관심사를 분리하여 객체의 생성 방법을 결정하고 만들어진 오브젝트를 전달하는 클래스를 팩토리라고한다.
- 추상 팩토리 패턴이나 팩토리 메서드 패턴과는 다르다.
제어관계 역전
- 제어의 역전은 제어 흐름의 개념을 거꾸로 뒤집는 것이다.
main()
메소드에서 사용할 오브젝트를 결정하고, 그 오브젝트의 메소드를 호출하고, 메소드 내부에서는 또 다른 오브젝트 생성을 결정하며 로직을 수행한다. IoC에서는 오브젝트가 자신이 사용할 다른 오브젝트를 직접 선택하지 않는다. 자신도 어디서에 생성되고 사용되는 지 알 수 없다. 모든 제어권한을 자신이 아닌 다른 객체에게 위임하기 때문이다.
프레임워크와 라이브러리
- 라이브러리를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접 제어한다
- 프레임워크는 거꾸로 애플리케이션 코드가 프레임워크에 의해 사용된다
- 프레임워크 위에 개발자가 작성한 클래스를 두고, 그 코드가 프레임 워크에 의해 실행된다.
- 프레임워크가 흐름을 주도하는 중에 개발자가 만든 애플리케이션 코드를 사용하도록 만드는 방식이다.
스프링의 IoC
애플리케이션 컨텍스트
- 빈 팩토리는 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트
- 애플리케이션 컨텍스트는 빈 팩토리를 확장한 것이다
- 빈 팩토리는 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 맞춘것
- 애플리케이션 컨텍스트는 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는데 초점을 맞춘 것
- 애플리케이션 컨텍스트는 직접 오브젝트를 생성하고 관계를 맺어주는 것이 아니라 별도의 설정 정보를 통해 얻는다.
애플리케이션 컨텍스트의 장점
- 클라이언트는 구체적인 팩토리 클래스를 알 필요 없다.
- IoC 클래스를 직접 생성하지 않고, 일관된 방식으로 원하는 오브젝트를 가져올 수 있다.
- 애플리케이션 컨텍스트는 종합 IoC 서비스를 제공해준다.
- 빈의 생성과 관계 설정 뿐 아니라 다양한 기능을 제공한다
- 빈을 검색하는 다양한 방법을 제공한다
getBean()
메소드는 빈의 이름을 통해 빈을 찾아준다- 타입이나 애노테이션으로 빈을 검색할 수도 있다.
싱글톤 레지스트리
동일성과 동등성
- 두 오브젝트가 동일하다면 하나의 오브젝트만 존재하고, 두 개의 참조 변수를 가지고 있는 것
- 두 오브젝트가 동등하다면 두 개의 각기 다른 오브젝트가 메모리 상에 존재하는 것. 오브젝트의 동등성 기준에 따라 정보가 동등하다고 판단하는 것일 뿐이다.
애플리케이션 컨텍스트는 싱글톤 레지스트리
- 애플리케이션 컨택스트는 싱글톤을 관리하고 저장하는 싱글톤 레지스트리이다.
- 서버 환경에서 매 요청마다 서비스 오브젝트를 생성하면 부하가 커지기 때문에 싱글톤으로 객체를 관리한다
싱글톤의 한계
private
생성자로 인해 상속할 수 없다- 테스트하기가 힘들다
- 생성 방식으로 인해 테스트에서 목 오브젝트 등으로 대체하기 힘들다
- 서버 환경에서는 싱글톤이 하나만 만들어지는 것을 보장하지 못한다
- JVM에 따라 싱글톤 패턴이 보장되지 않을 수 있다
- 싱글톤은 전역 상태를 만들 수 있기 때문에 바람직하지 못하다
스프링은 서버환경에서 싱글톤을 서비스 오브젝트 방식으로 사용하는 것을 적극권장한다. 스프링 컨테이너는 평범한 자바 클래스를 싱글톤으로 사용할 수 있게하여, 싱글톤 패턴이 가지고있는 단점을 전부 상쇄해준다.
의존관계 주입(DI)
- A 클래스가 B 클래스의 메소드를 사용하면, A는 B에게 의존하고 있다
- 의존이라는 것은 B가 변하면 A까지 변하는 것을 의미한다
- DI는 오브젝트 레퍼런스를 외부로 부터 주입받고 이를 통해 여타 오브젝트와 다이내믹하게 의존관계가 만들어지는 것이 가장 큰 특징이다
런타임 의존관계
- 설계 시점의 의존관계가 실체화된 것이다.
- 설계 시점의 느슨한 의존 관계와는 다른 것이다
- 실제 사용 대상 오브젝트를 의존 오브젝트라고한다
- 런타임에 의존 오브젝트와 그것을 사용할 주체(클라이언트)를 연결해주는 작업을 DI라고한다
의존관계 주입(DI)를 사용해 런타임 클래스에 의존하지 않고 인터페이스에 의존하여 결합도를 느슨하게 만들어 준다. 느슨한 결합도를 통해 의존 관계에 있는 대상이 바뀌더라도 자신은 영향을 받지 않으며, 변경을 통한 다양한 확장 방법에 자유로워진다.
728x90
'Backend' 카테고리의 다른 글
[Spring] Spring MVC - HTTP, Web Server, WAS, Servlet (0) | 2021.09.02 |
---|---|
[토비의 스프링 3.1] 4장 예외 (0) | 2021.08.31 |
[토비의 스프링 3.1] 3장 템플릿 (0) | 2021.08.29 |
[토비의 스프링 3.1] 2장 테스트 (0) | 2021.08.23 |
[Spring Boot] Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. (0) | 2021.07.11 |