스프링, 객체지향 프로그래밍
스프링이란?
객체 지향 프로그래밍을 잘 할 수 있도록 도와주는 프레임워크
객체 지향 프로그래밍
객체 지향 프로그래밍이란?
컴퓨터 프로그램을 명령어의 목록으로 보지 않고 여러개의 객체들의 모임으로 파악하고자 하는 것. 하나의 통으로된 프로그램이 아니라 여러개의 독립된 단위로.
→ 프로그램을 유연하고 변경이 용이하게 만든다.
→ 레고 블럭 조립하듯이
→ 컴퓨터 부품을 갈아 끼우듯이
참고)
컴퓨터는 0, 1로 이루어진 명령어와 데이터를 이해할 수 있는데 개발자가 프로그래밍 언어로 프로그램을 개발하면 소스코드를 컴퓨터가 이해할 수 있는 저급언어로 변환 한다.
-> 여러개의 명령어들로 이루어짐. 그러면 이 프로그램을 명령어 목록으로 보면 통으로 되어 있어서 일부분이 다음 부분에 영향을 주게 됨.
객체지향 프로그래밍을 하면 통으로된 부분을 쪼개서 여러개의 독립된 단위로 보기 때문에 조립하는 것처럼 프로그램을 유연하게 만든다.
객체 지향 특징
- 추상화
- 캡슐화
- 상속
- 다형성
좋은 객체 지향 설계의 5가지 원칙 (SOLID)
SRP 단일 책임 원칙 (Single responsibility principle)
하나의 클래스는 하나의 책임만 가져야 한다.
중요한 기준은 변경. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것
OCP 개방-폐쇄 원칙 (Open/colsed principle)
소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀 있어야 한다.
이게 가장 중요한 원칙!
다형성을 활용?
하지만 인터페이스를 사용하여 구현객체를 통해 새로운 기능을 구현해도 구현체가 변경되면 기존 코드를 변경해야 됨.
-> 해결을 위해 별도의 뭔가가 있어야 하는데 이것을 스프링이 해주는 것.
LSP 리스코프 치환 원칙 (Liskov subsitution principle)
프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
컴파일 성공을 넘어서는 이야기. 기능적으로 보장되야 한다는 것
ISP 인터페이스 분리 원칙 (Interface segregation principle)
특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
DIP 의존관계 역전 원칙 (Dependency inversion principle)
프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.
클라이언트가 인터페이스에 의존해야 유연하게 구현체를 변경할 수 있다.
service에서 구현체를 new를 통해 사용하면 OCP, DIP 둘 다 위반.
MemberRepository mr = new MemoryMemberRepository();
-> 인터페이스에도 의존하고 구현 클래스에도 동시에 의존(OCP 위반), 클라이언트(service)가 구현 클래스를 직접 선택(DIP 위반)
정리
- 객체 지향의 핵심은 다형성
- 다형성 만으로는 쉽게 부품을 갈아 끼우듯이 개발할 수 없다.
- 다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 함께 변경된다.
- 다형성 만으로는 OCP, DIP를 지킬 수 없다.
DIP만 지키면 어떻게 되나? 인터페이스에만 의존하면 구현체가 없는데 어떻게 기능이 동작하겠나. 코드가 안돌아감 nullpointException 터진다. 그래서 뭔가가 더 필요하다.
=> 이 문제를 스프링이 해결해준다.
참고) 인터페이스
인터페이스를 구현하면 클래스들이 필수로 구현해야 하는 자료형 역할을 하며 추상메서드와 상수로만 이루어져 있고 소스코드가 없기 때문에 인스턴스로 사용이 불가 하다
나만의 정리
객체지향 프로그래밍의 특징은 부품을 조립하고 갈아끼우듯이 개발을 하는 것인데 다형성 특징을 통해 인터페이스로 부품들을 만들고 갈아 끼울 수 있음.
하지만 다형성 만으로는 구현 객체를 변경할 때 소스가 변경됨. 객체지향 원칙인 OCP, DIP를 지킬 수 없다.
-> 스프링이 이것을 해결해준다.
객체 지향 설계와 스프링
스프링은 DI로 다형성 + OCP, DIP를 가능하게 지원
DI (Dependency Injection) : 의존관계, 의존성 주입.
DI 컨테이너 - 자바 객체들을 컨테이너 안에 넣어놓고 이 안에서 의존관계를 서로 연결해주고 주입해주는 기능들을 제공해주는 것.
순수하게 자바로 OCP, DIP 원칙들을 지키면서 개발을 해보면 결국 스프링 프레임워크를 만들게 된다. ( 더 정확히는 DI 컨테이너)
출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard
스프링 핵심 원리 - 기본편 강의 - 인프런
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢
www.inflearn.com