[Spring] Spring 핵심원리(기본) 객체 지향 설계와 스프링

RepDay1·2023년 7월 12일

Spring

목록 보기
2/5

김영한 강사님 - 스프링 핵심 원리 기본편
을 수강하고 정리한 글 입니다.

객체 지향 설계와 스프링

스프링 핵심 개념

웹 애플리케이션을 쉽게 만들어주고 DB 접근을 편리하게 해주는 것만이 아님, 이건 그저 스프링은 사용해서 얻어지는 부가적인 결과일 뿐,
스프링의 진짜 핵심은 아래에 있음

  • 스프링은 자바 언어 기반의 프레임워크임, 자바는 객체 지향 언어
  • 스프링은 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크
  • 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크

좋은 객체 지향 프로그래밍?

레고 블럭을 조립하듯, 컴퓨터 부품을 갈아 끼우듯, 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법이 객체 지향 프로그래밍의 핵심임
이를 실현시켜주는 객체 지향의 특징이 다형성

  • 다형성을 활용(역할과 구현 분리)
    • 클라이언트는 대상의 역할(인터페이스)만 알면 됨
    • 클라이언트는 구현 대상의 내부 구조(인터페이스 구현체)를 몰라도 됨
    • 클라이언트는 구현 대상의 내부 구조가 변경 되어도 영향을 받지 않음
    • 클라이언트는 구현 대상 자체를 변경해도 영향 받지 않음

--> 역할과 구현을 구분하면 유연해지며 변경도 편리해짐
이를 위해서는 역할(인터페이스)를 안정적으로 잘 설계하는게 중요함 역할 자체가 변하면 클라이언트, 서버 모두에 큰 변경이 발생하기 때문임 즉 인터페이스 설계를 안정적으로 잘 설계하는것이 좋은 개발자

  • 결론 - 스프링과 객체 지향
    • 다형성이 가장 중요함
    • 스프링은 결국 다형성을 극대화해서 이용할 수 있게 도와주는 프레임워크임
    • 스프링에서의 제어의 역전(IoC), 의존 관계 주입(DI)은 다형성을 활용해 역할과 구현을 편리하게 다룰 수 있도록 지원
    • 스프링을 사용하면 레고 블럭 조립하듯이 구현을 편리하게 변경 할 수 있음

좋은 객체 지향 설계의 5가지 원칙(SOLID)

클린코드로 유명한 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 정리한게 SOLID

  • SRP 단일 책임 원칙

    • 한 클래스는 하나의 책임만 가져야됨
    • 하나의 책임이라는건 모호함, 클 수 있고 작을 수 있으며 문맥과 상황에 따라 다름
    • 중요한 기준은 변경임 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것
    • 예) UI 변경, 객체 생성과 사용 분리 등
  • OCP 개방-폐쇄 원칙

    • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야됨
    • 다형성 을 활용
    • 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능 구현
    • OCP가 잘지켜져야 역할과 구현의 분리가 잘됐음을 의미함
    • 예시
    MemberService 클라이언트가 구현 클래스를 직접 선택하게되면?
    MemberRepository m = new MemoryMemberRepository(); //기존 코드 메모리로 저장하는 구현체
    MemberRepository m = new JdbcMemberRepository(); // 변경 코드 jdbc로 저장하는 구현체
    구현 객체를 변경하려면 클라이언트의 코드(MemberService)를 변경해야됨
    다형성을 활용했으나 OCP 원칙이 지켜지지 않았음  
    이를 해결하기 위해 객체를 생성하고 연관관계를 맺어주는 별도의 조립, 설정자가 필요함 --> 이걸 스프링 컨테이너가 해줌
  • LSP 리스코프 치환 원칙

    • 프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야됨
    • 다형성에서 하위 클래스는 인터페이스의 규약(의도)대로 구현되어야됨을 의미함
    • 단순히 컴파일에 성공하는걸 넘어서는 얘기
    • 예를 들어 자동차 인터페이스의 엑셀 메소드는 앞으로 가라는 기능인데, 구현체가 뒤로가게 구현하면 LSP를 위반한게 됨, 인터페이스의 의도대로 구현이 되지 않았기 때문임
  • ISP 인터페이스 분리 원칙

    • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 나음
    • 각각의 역할 별로 인터페이스를 분리해야됨
    • 인터페이스가 명확해지고, 대체 가능성이 높아지는 효과를 얻을 수 있음
  • DIP 의존관계 역전 원칙

    • 개발자는 추상화에 의존해야하고 구체화에 의존하면 안됨, DI는 이 원칙을 따르는 방법 중 하나임
    • 구현 클래스에 의존하지말고, 인터페이스에 의존해야된다는 의미
    • 즉 역할에 의존해라 그래야 유연하게 구현체를 변경할 수 있음
    • OCP에서 예시에 해당하는 부분을 보면 MemberService가 인터페이스도 의존하고 있으나 구현체에도 의존하고 있음 --> DIP 위반
  • 결론

    • 객체 지향의 핵심은 다형성
    • 다형성만으로는 쉽게 부품을 갈아 끼우듯이 개발하기 힘듦
    • 다형성만으로는 구현 객체를 변경할 때, 클라이언트 코드도 함께 변경됨
    • 다형성 만으로는 OCP DIP라는 중요한 원칙을 지킬 수 없음
    • 다형성만으로는 해결하기 힘든 문제를 스프링이 해결해줌(스프링을 사용하는 이유)

객체 지향 설계와 스프링

  • 스프링은 다음 기술로 OCP DIP를 가능하게 지원함
    • DI(Dependency Injection): 의존 관계, 의존성 주입
    • DI 컨테이너 제공
  • 위 기술을 활용하면 클라이언트 코드의 변경 없이 기능 확장가능

0개의 댓글