스프링
스프링과 객체 지향의 관계
- 스프링은 다음 기술로 다형성, OCP, DIP를 가능하게 지원
- DI(Dependency Injection): 의존 관계, 의존성 주입
- DI 컨테이너 제공
- 자바 객체를 컨테이너에 넣고 안에서 의존 관계를 연결하고 주입하는 기능 제공
- 클라이언트 코드의 변경 없이 기능 확장
- 구현체를 쉽게 교체할 수 있다
스프링이 없을 때는
- OCP, DIP 원칙을 지키며 개발하다 보니 할 일이 많았다
- ⇒ 프레임워크로 만들어버림
- 순수하게 자바로 OCP, DIP 원칙을 지키면서 개발을 해 보면 DI 컨테이너 (스프링 프레임워크)를 만들게 된다
정리
- 모든 설계에 역할과 구현을 분리해야 한다
- 역할만 정의해 두고 구현체는 유연하게 변경할 수 있도록 만드는 것이 좋은 객체 지향 설계이다
- 다형성, OCP, DIP를 지켜야 함
- 스프링 컨테이너 필요
- 이상적으로는 모든 설계에 인터페이스를 부여하는 것이 좋다
- 구체적인 구현이 정해지지 않아도 먼저 개발할 수 있다. (DB의 종류 등)
- 하부 구현 기술 선택을 최대한 미룰 수 있는 장점이 있다
- 기획이 구체적으로 정해지지 않았을 때 인터페이스를 먼저 만들고, 간단한 구현체를 만들어서 개발
- 이후 기획이 정리되면 기능 확장
- 구현 기술이 바뀌더라도 나머지를 변경할 필요가 없고 변경의 범위가 작고 유연해지는 장점
실무 고민 (trade off)
- 인터페이스를 도입하면 추상화라는 비용이 발생한다
- 추상화가 되면 코드를 찾기 어려워짐
- 런타임에 어떤 구현 클래스를 선택하는 지 추적해야 함
- 장점이 단점을 넘어설 때 선택을 해야 한다
- 기능을 확장할 가능성이 없다면 구체 클래스를 쓴다
- 필요하다면 향후 리팩토링
- 미래에 필요하다고 예상되면 추상화 먼저
출처
'Spring Framework' 카테고리의 다른 글
[Spring] FK(id)만 이용해서 관계 있는 엔티티를 생성하는 법 - 프록시 객체 (0) | 2024.07.12 |
---|---|
[Spring] DTO의 사용 범위, 목적, Mapper (0) | 2024.07.12 |
좋은 객체 지향 프로그래밍이란? - 다형성 (0) | 2024.05.23 |
[Spring] 동시에 발생한 요청을 처리하는 방법 - Multithreading (0) | 2024.04.26 |
[Spring] Docker 환경에서 Prometheus, Grafana 설정하는 법 (Grafana No data 에러 해결) (0) | 2024.04.09 |