스프링 핵심 컨셉이 뭘까?
- 스프링은 자바 언어 기반의 프레임워크이고 기반 언어인 자바는 객체지향이라는 특징을 가진다. 즉 스프링은 자바 언어를 이용해서 객체지향적으로 개발할 수 있게 틀을 제공해주는 도구다.
객체 지향 프로그래밍
- 객체들의 모임
- 메시지를 주고받는다.
- 협력
- 유연하고 변경이 용이
- 역할과 구현으로 분리
- 클라이언트는 인터페이스인 역할만 알면 되고, 내부구조가 변경되든 알 필요도 없다.
- 역할: 인터페이스
- 구현: 인터페이스를 구현한 클래스, 구현 객체
- 클라이언트가 인터페이스의 역할을 알기 때문에 그 인터페이스가 변하면 코드 변경이 많이 발생한다.
- 따라서 인터페이스를 잘 설계하는 것이 정말 중요하다.
스프링에서 제어의 역전(IOC), 의존관계주입(DI)의 개념은 대체 왜 있을까?
- 다형성 을 활용하기 위해서다.
- 다형성을 활용해서 위에서 말한 역할과 구현을 쉽게 다루기 위해서!
SOLID: 객체지향 설계의 5가지 원칙
SRP
- single responsibility priciple
- 1클래스 1책임
OCP
- open/closed priciple
- (새로운 클래스로 기능 구현해서)확장에는 열려 있고 (기존 코드)변경에는 닫혀 있어야해!
- 다형성 활용
- 인터페이스를 구현한 새로운 클래스로 새로운 기능 구현
- 애플리케이션을 사용 영역과 구성 영역으로 나눴을 때 소프트웨어 표소를 새롭게 확장해도 사용 영역의 변경은 닫혀 있다!
LSP
- liskov substitution priciple
- 부모 객체 메소드를 오버라이딩할 때 기존 의도를 지킬 수 있을 때만 상속받아야 해
ISP
- interface segregation priciple
- 커다란 크기의 범용 인터페이스말고 덩어리가 작고 특정 지을 수 있는 인터페이스가 낫다.
DIP
- dependency inversion priciple
- 추상화 의존 YES, 구체화 의존 NO
- 구현 클래스에 의존하는 건 좋지 않다. 인테페이스에 의존해!
- 의존한다는 건 내부 코드를 안다는 것
- 청소기 power 버튼을 누르면 모터가 돌아가면서 청소기를 돌릴 수 있게 되는데 내부적으로 어떻게 동작하는지는 청소기를 사용하는 사용자는 알 필요가 없다. "power 버튼을 누르면 청소기를 쓸 수 있다."만 알면 된다.
그런데 다형성만으로는 클라이언트 코드의 변경을 막을 수 없다?
- 스프링에서 DI로 가능하게 만든다.
- DI(Dipendency Injection)
- DI 컨테이너 제공
회고