스프링의 핵심컨셉. 스프링이란?
스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크. 객체 지향 언어인 자바가 가진 강력한 특징을 살려내주는 프레임워크이다. 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
좋은 객체 지향 프로그래밍
유연하고, 변경이 용이하게 코드를 작성하는 것.
다형성(Polymorphism)이란?
하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.
역할과 구현을 분리함으로써 우리는 다형성을 만족하는 코드를 작성할 수 있다.

쉽게 말하자면,
자동차를 운전하는 입장인 사용자는 자동차 조작법(역할)만 알고 있으면 되고
사실 자동차 엔진이 어떻게 돌아가는지, 자동차의 모델이 무엇인지, 가솔린 자동차인지, 전기자동차인지(구현) 알 필요가 없다는 말이다.
좋은 객체 지향 설계의 5가지 원칙 (SOLID)
- SRP: 단일 책임 원칙 (single responsibility principle)
- OCP: 개방-폐쇄 원칙 (Open/closed principle)
- LSP: 리스코프 치환 원칙 (Liskov substitution principle)
- ISP: 인터페이스 분리 원칙 (Interface segregation principle)
- DIP: 의존관계 역전 원칙 (Dependency inversion principle)
SRP: 단일 책임 원칙 (single responsibility principle)
한 클래스는 하나의 책임만 가져야한다.
변경이 있을 때 파급효과가 적게 클래스를 설계해야 한다.
OCP: 개방-폐쇄 원칙 (Open/closed principle)
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
자바의 다형성을 이용하여 구현체를 바꾸는 것?
기존 코드를 변경하지 않고 확장하려면 인터페이스 객체의 구현 클래스만 바꿔 끼우면 되지 않나?? 완벽하게 만족시키지 못한다. (OCP말고 DIP특성도 위배된다.) 이것만으로는 한계가 있다. 왜냐하면 구현클래스를 바꾸려면 기존코드를 변경해야하기 때문이다!
LSP: 리스코프 치환 원칙 (Liskov substitution principle)
프로그램의 객체는 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
쉽게 말하면 인터페이스의 엑셀이라는 메소드를 오버라이딩한다라고 가정할 때, 앞으로 가는 기능이 아닌 뒤로가게 구현을 한다면 LSP를 위반한 것이다. 느리게라도 앞으로 가는 것!
ISP: 인터페이스 분리 원칙 (Interface segregation principle)
특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
인터페이스를 분리하면 인터페이스가 명확해지고, 대체가능성이 높아지기 때문이다!
DIP: 의존관계 역전 원칙 (Dependency inversion principle)
프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.
역할(Role)에 의존하게 프로그램을 설계해야 한다. 구현체에 의존하게 되면 변경이 아주 어려워 진다. 왜?
구현체에 의존하면 다형성을 만족시킬 수 없기 때문이다!구현체에 인터페이스와 같은 역할을 할 수 있는 추상메서드는 없다고 가정할 때 유효한 듯하다.
스프링과 객체 지향
스프링에서는 제어의 역전(IoC), 의존관계 주입(DI)를 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
DI를 활용하면 SOLID 특성의 OCP와 DIP를 만족시킬수 있다!
+실무
- 인터페이스를 도입하면 추상화라는 비용이 발생한다.
- 기능을 확장할 가능성이 없다면, 구체 클래스를 직접 사용하고, 향후 꼭 필요할 때 리팩터 링해서 인터페이스를 도입하는 것도 방법이다.
인터페이스를 만드는 비용과 수반되는 효과(미래에 확장될 가능성)를 저울질해봐야 한다.
스프링의 핵심컨셉. 스프링이란?
스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크. 객체 지향 언어인 자바가 가진 강력한 특징을 살려내주는 프레임워크이다. 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
좋은 객체 지향 프로그래밍
유연하고, 변경이 용이하게 코드를 작성하는 것.
다형성(Polymorphism)이란?
하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다.
역할과 구현을 분리함으로써 우리는 다형성을 만족하는 코드를 작성할 수 있다.

쉽게 말하자면,
자동차를 운전하는 입장인 사용자는 자동차 조작법(역할)만 알고 있으면 되고
사실 자동차 엔진이 어떻게 돌아가는지, 자동차의 모델이 무엇인지, 가솔린 자동차인지, 전기자동차인지(구현) 알 필요가 없다는 말이다.
좋은 객체 지향 설계의 5가지 원칙 (SOLID)
- SRP: 단일 책임 원칙 (single responsibility principle)
- OCP: 개방-폐쇄 원칙 (Open/closed principle)
- LSP: 리스코프 치환 원칙 (Liskov substitution principle)
- ISP: 인터페이스 분리 원칙 (Interface segregation principle)
- DIP: 의존관계 역전 원칙 (Dependency inversion principle)
SRP: 단일 책임 원칙 (single responsibility principle)
한 클래스는 하나의 책임만 가져야한다.
변경이 있을 때 파급효과가 적게 클래스를 설계해야 한다.
OCP: 개방-폐쇄 원칙 (Open/closed principle)
소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
자바의 다형성을 이용하여 구현체를 바꾸는 것?
기존 코드를 변경하지 않고 확장하려면 인터페이스 객체의 구현 클래스만 바꿔 끼우면 되지 않나?? 완벽하게 만족시키지 못한다. (OCP말고 DIP특성도 위배된다.) 이것만으로는 한계가 있다. 왜냐하면 구현클래스를 바꾸려면 기존코드를 변경해야하기 때문이다!
LSP: 리스코프 치환 원칙 (Liskov substitution principle)
프로그램의 객체는 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
쉽게 말하면 인터페이스의 엑셀이라는 메소드를 오버라이딩한다라고 가정할 때, 앞으로 가는 기능이 아닌 뒤로가게 구현을 한다면 LSP를 위반한 것이다. 느리게라도 앞으로 가는 것!
ISP: 인터페이스 분리 원칙 (Interface segregation principle)
특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
인터페이스를 분리하면 인터페이스가 명확해지고, 대체가능성이 높아지기 때문이다!
DIP: 의존관계 역전 원칙 (Dependency inversion principle)
프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.
역할(Role)에 의존하게 프로그램을 설계해야 한다. 구현체에 의존하게 되면 변경이 아주 어려워 진다. 왜?
구현체에 의존하면 다형성을 만족시킬 수 없기 때문이다!구현체에 인터페이스와 같은 역할을 할 수 있는 추상메서드는 없다고 가정할 때 유효한 듯하다.
스프링과 객체 지향
스프링에서는 제어의 역전(IoC), 의존관계 주입(DI)를 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
DI를 활용하면 SOLID 특성의 OCP와 DIP를 만족시킬수 있다!
+실무
- 인터페이스를 도입하면 추상화라는 비용이 발생한다.
- 기능을 확장할 가능성이 없다면, 구체 클래스를 직접 사용하고, 향후 꼭 필요할 때 리팩터 링해서 인터페이스를 도입하는 것도 방법이다.
인터페이스를 만드는 비용과 수반되는 효과(미래에 확장될 가능성)를 저울질해봐야 한다.