티스토리 뷰
개념 정리
오브젝트에 대한 설계와 구현한 코드는 변한다.
- 변화가 생길 때 수정할 코드의 양을 줄여야 한다.
- 분리와 확장을 고려한 설계가 필요하다.
- 관심이 같은 것끼리 하나의 객체로 모아 관심사의 분리해야 한다.
- 개방 폐쇄 원칙 : 확장에는 열려있어야 하고 변경에는 닫혀있어야 한다.
- 응집도는 높이고 결합도는 낮춰야 한다.
제어의 역전(Inversion Of Control)
- 오브젝트가 자신이 사용할 오브젝트를 생성하거나 선택하지 않는다. 다른 대상에게 위임한다.
- 스프링에서는 애플리케이션 컨텍스트를 이용해서 빈의 생성과 관계설정 등의 제어를 한다.
- 빈 : 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
- 라이브러리 ? 프레임워크 ? : 라이브러리는 애플리케이션의 흐름을 개발자가 직접 제어한다. 하지만 프레임워크는 프레임워크가 흐름을 주도하는 중에 개발자가 만든 코드 사용한다.(IoC)
의존 관계 주입(Dependency Injection)
- 의존관계 : A가 B에 의존하고 있다고 할 때, B에 변경이 생기면 A에 영향을 준다는 것이다.
- 오브젝트의 레퍼런스를 외부로부터 주입받고 이를 통해 여타 오브젝트와 관계가 만들어진다.
- 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다.
- 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 3의 존재가 결정한다.
- 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공해줌으로써 만들어진다.
의존관계 주입 방법
- 생성자를 이용한 의존관계 주입
- 수정자 메소드(setter)를 이용한 의존관계 주입
- 일반 메소드를 이용한 의존관계 주입
의존관계 검색(Dependency LookUp)
- 자신이 필요로하는 의존 오브젝트를 능동적으로 찾는다.
- 의존관계를 맺을 오브젝트를 스스로 컨테이너에 요청
- ex) getBean
DI와 DL의 차이
- 의존관계 검색 방식에서는 검색하는 오브젝트는 자신이 스프링 빈일 필요가 없다.
- 의존관계 주입에서는 의존성이 주입되는 객체와 의존성을 주입받는 객체 둘 다 빈이어야한다. (인터페이스 타입의 파라미터)
싱글톤
- 애플리케이션 컨텍스트는 싱글톤을 저장하고 관리하는 싱글톤 레지스트리다.
- 스프링은 기본적으로 내부에서 생성하는 빈 오브젝트를 싱글톤으로 만듣다.
- 멀티스레드 환경에서 싱글톤을 사용하면 오브젝트는 상태정보를 내부에 갖고 있지 않는 무상태 방식으로 만들어져야 한다.
UserDao 예제
UserDao의 관심사
- DB 연결을 위한 Connection 가져오기 (DB 연결)
- Statement를 만들고 실행하기
- Statement와 Connection을 닫아 리소스를 돌려주기
복잡한 코드를 정리해보자
중복 코드를 메소드로 분리한다. (메소드 추출 기법)
- db 연결을 할때마다 Connection을 생성하는 코드는 중복된다.
- Connection 생성하는 코드를 getConntection 메소드로 분리
상속을 통한 확장
- 위에서 분리하 getConntection 메소드를 추상 메소드로 만든다.
- 추상 메소드가 있는 클래스를 상속하는 클래스를 만들고 추상 메소드를 구현한다.
- 템플릿 메소드 패턴 : 슈퍼클래스에 기본적인 로직의 흐름을 만들고 그 기능의 일부를 추상 메소드나 protected 메소드 등으로 만들어 서브클레스에서 필요에 맞게 구현해서 사용하는 방법
- 팩토리 메소드 패턴 : 서브클레스에서 구체적인 오브젝트 생성 방법을 결정하게 하는 방법. 어떤 Connection을 return할지 getConnection 메소드에서 결정
하지만 상속을 통한 확장을 하면
- 다중상속이 불가하다.
- 상속은 부모와 자식이 연결되어있다. (Tight Coupling)
- 다른 클래스에 적용하기 어렵다.
Connection을 가져오는 부분을 클래스로 분리
- UserDao는 커넥션 클래스의 메소드를 알고 있어야한다.
- UserDao가 커넥션 클래스를 알아야한다.
Connection을 가져오는 클래스를 인터페이스로 바꾼다.
- 인터페이스를 통해 접근하게하면 실제 구현 클래스르 바꿔도 신경쓰지 않아도 된다.
- 하지만 커넥션을 가져오는 것을 인터페이스로 분리해도 처음 한번은 new로 인터페이스를 구현한 클래스를 생성해야하기 떄문에 실제 구현 클래스를 알아야 한다.
실제 클래스를 구현하고 관계를 연결해주는 제 3의 클래스 생성 (Factory)
- Factory 클래스에서 Connection의 구현 객체를 만든 뒤 이를 UserDao를 new할 때 생성자 파라미터로 전달.
Reference
책 : 토비의 스프링 3.1 Vol.1 스프링의 이해와 원리 (저 이일민)
'book_note > 토비의 스프링' 카테고리의 다른 글
토비의 스프링 VOL.1 CH6(1) (0) | 2021.07.10 |
---|---|
토비의 스프링 VOL.1 CH5 (0) | 2021.07.10 |
토비의 스프링 VOL.1 CH4 (0) | 2021.07.10 |
토비의 스프링 VOL.1 CH3 (0) | 2021.07.10 |
토비의 스프링 VOL.1 CH2 (0) | 2021.07.10 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 스프링
- ASP.NET
- spring boot
- Nullable
- MSSQL
- OWIN
- uploadfive
- JavaScript
- Effective Java
- 빌더 패턴
- 준영속
- jQuery
- 영속성
- orphanRemoval
- DataAnnotation
- 스프링 부트 테스트
- 스프링MVC
- 자바의 정석
- Spring
- 토비의 스프링
- c#
- C# 문법
- 고아 객체
- JPA
- @Modifying
- Java
- SpringBoot
- default interface
- 다이내믹 프록시
- JpaRepository
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함