Spring & OOP
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
객체 지향 특징(다형성)
객체 지향엔 추상화 / 캡슐화 / 상속 / 다형성이라는 특징이 있는데 스프링은 다형성 특징을 살리기 좋은 프레임워크다.
다형성
다형성은 역할
과 구현
으로 구분하여 실세계와 비유해볼 수 있다. 예를 들어 운전자 - 자동차라는 관계가 있고, 자동차 역할은 K3/아반떼/테슬라 등으로 구현할 수 있다.
사용자는 자동차의 인터페이스를 알고 있고, 위의 자동차들은 자동차 인터페이스를 통해 만들어졌기 때문에 문제 없이 작동할 수 있다. -> 클라이언트에게 영향을 주지 않고 새로운 기능을 추가적으로 개발할 수 있다.
역할과 구현 분리
역할과 구현으로 구분하면 단순해지고, 유연해지며 변경도 편리해진다.
장점
대상의 인터페이스만 알면 된다.
대상의 내부 구조를 몰라도 된다.
대상의 내부 구조가 변경되어도 영향을 받지 않는다.
대상 자체를 변경해도 영향을 받지 않는다.
자바에서의 역할과 구현 분리
자바 언어의 다형성을 활용
역할 -> 인터페이스
구현 -> 인터페이스를 구현한 클래스, 구현 객체
객체를 설계할 때 역할과 구현을 명확히 분리하여, 역할(인터페이스)를 먼저 부여하고 구현 객체 만들기
자바 언어의 다형성
자바 기본 문법인 오버라이딩
으로 다형성을 구현할 수 있다.
다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있으며, 클래스 상속 관계에서도 적용 가능하다.
public interface MemberRepository {
// ...
}
public class JdbcMemberRepository implements MemberRepository {
// ...
}
public class MemoryMemberRepository implements MemberRepository {
// ...
}
public class MemberService {
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
}
다형성의 본질
인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
다형성의 본질을 이해하려면 협력이라는 객체사이의 관계에서 시작해야함
클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
역할과 구현 분리의 한계
인터페이스 자체가 변경될 경우 클라이언트/서버 모두 큰 변경이 발생
인터페이스를 안정적으로 잘 설계하는 것이 가장 중요
스프링과 객체 지향
다형성은 객체 지향의 가장 큰 특징
스프링은 다형성을 극대화시키기 좋은 프레임워크
제어의 역전(IoC) / 의존관계 주입(DI)은 다형성을 활용해 역할과 구현을 편리하게 다룰 수 있도록 지원
정리
객체 지향의 핵심은 다형성이지만, 다형성 하나 만으로는 객체 지향 설계의 원칙을 지킬 수 없으며, 변경 용이성도 매우 떨어지게 된다. 스프링은 DI 컨테이너를 제공하여 다형성 + OCP/DIP를 가능하게 지원해준다. 모든 설계에 인터페이스를 부여하는 것이 이상적이지만, 추상화라는 비용(구현체를 봐야하는)이 발생한다. 그래서 기능 확장 가능성이 없는 경우엔 구체 클래스를 직접 사용하고, 필요할 때 도입하는 겻도 나쁘지 않은 방법이다.
참고자료
Last updated
Was this helpful?