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?