객체 지향 설계와 스프링
2024. 11. 28. 15:51ㆍBack/Spring
객체 지향 설계와 스프링
1. 스프링이란?
- 로드존슨이 EJB 컨테이너의 문제점을 지적하며 새롭게 등장한 기술
- 스프링은 여러 핵심기술, 웹기술, 데이터접근기술, 기술통합, 테스트 등을 제공
- 스프링이라는 단어는 문맥에 따라 다르게 사용된다
- 스프링 DI 컨테이너 기술
- 스프링 프레임워크
- 스프링 생태계 (스프링, 스프링 부트 등등 모두 포함)
2. 스프링의 핵심개념 (왜 만들어졌나?)
- 스프링은 자바 언어 기반의 프레임워크
- 자바 언어의 가장 큰 특징은 객체 지향 언어
- 스프링은 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크
- 즉, 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
3. 객체 지향 프로그래밍
- 객체 지향 프로그래밍은 컴퓨터 프로그램을 '객체'들의 모임으로 파악하고자 하는 것이다.
- 각각의 객체는 메시지를 주고받고 데이터를 처리할 수 있다 (협력)
- 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만든다 (부품 갈아끼듯)
- 특징: 추상화, 캡슐화, 상속, 다형성
4. 다형성
- 다형성은 같은 타입으로 다양한 객체를 다룰 수 있게 해주는 객체지향의 핵심 개념
- 모든 설계에 역할과 구현을 분리하자
- 역할: 자동차 / 구현: 소나타, K3, 산타페 등등
- 역할: 로미오-줄리엣 / 구현: 현빈-송혜교 등등
- 애플리케이션 설계에서는 역할: 인터페이스 / 구현: 클래스, 객체
- 다형성의 본질: 역할과 구현을 구분하면 세상이 단순해지고, 유연해지며, 변경도 편리해진다. 즉 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다!
- 클라이언트는 대상의 역할(인터페이스)만 알면된다
- 클라이언트는 구현대상의 내부구조를 몰라도되고
- 내부구조가 변경되어도 영향받지 않는다.
- 구현 대상 자체를 변경해도 영향받지 않는다.
- 이상적으로는 모든 설계에 인터페이스를 부여하자
- 인터페이스를 먼저 설계하고 구현을 나중에 정하게되면 구현기술이 바뀌더라도 나머지를 변경할 필요가 없고 그래서 변경의 범위가 되게 작고 유연해진다는 장점
- 인터페이스를 도입하면 추상화라는 비용이 발생한다. (인터페이스, 구현 클래스 2번 확인해야함)
- 따라서 기능을 확장할 가능성이 없다면, 구체 클래스를 직접 사용하고, 향후 꼭 필요할 때 리팩터링해서 인터페이스를 도입하는 것도 방법이다.
- 스프링은 다형성을 극대화해서 이용할 수 있도록 도와준다.
5. 좋은 객체지향 설계의 5가지 원칙 (SOLID)
- 단일 책임 원칙 (SRP: Single Responsibility Principle): 클래스는 단 하나의 책임만 가져야 한다.
- 개방-폐쇄 원칙 (OCP: Open-Closed Principle): 소프트웨어는 확장에 열려 있고, 수정에는 닫혀 있어야 한다. 다형성 활용
- 리스코프 치환 원칙 (LSP: Liskov Substitution Principle): 서브클래스는 언제나 부모 클래스를 대체할 수 있어야 한다. 하위 클래스는 인터페이스 규약을 모두 지켜야한다.
- 인터페이스 분리 원칙 (ISP: Interface Segregation Principle): 인터페이스는 특정 클라이언트에 필요한 기능만 포함해야 한다. 자동사 인터페이스 -> 운전, 정비 인터페이스로 분리
- 의존 역전 원칙 (DIP: Dependency Inversion Principle): 고수준 모듈은 저수준 모듈에 의존하지 말고, 둘 다 추상화에 의존해야 한다. “추상화(인터페이스)에 의존해야지, 구체화(클래스)에 의존하면 안된다”
6. 객체 지향 설계와 스프링
- 객체지향의 핵심은 다형성인데, 다형성만으로는 OCP, DIP를 지킬수 없다 (클라이언트 코드도 수정해줘야함)
- 스프링은 다음 기술로 다형성 + OCP, DIP 원칙을 가능하게 지원해주는 기술이다
- DI (Dependency Injection): 의존관계, 의존성 주입
- DI 컨데이터 제공
- 클라이언트 코드의 변경없이 기능 확장
- 쉽게 부품을 교체하듯이 개발