Enthusiasm! Enthusiasm!

객체 지향 설계와 스프링 본문

자바 스프링/스프링 핵심원리

객체 지향 설계와 스프링

열동 2023. 1. 2. 21:32

스프링은 좋은 객체 지향 어플리케이션을 개발할 수 있게 도와주는 프레임워크이다.

 

좋은 객체 지향 프로그래밍이란

  • 객체 지향 프로그래밍의 핵심은 다형성이다.
  • 다형성이란 현실에서 역할(Interface)과 구현(구현체)으로 구분하는 것과 유사하다.
  • 운전자와 자동차 예시를 통해 역할과 구현에 대해 알아보자

운전자가 운전하는 방법을 알면 어떤 자동차던 운전이 가능하도록 자동차를 설계 해야 한다.
우리가 일상에서 운전을 배울 때 자동차의 종류에 따라 운전법을 다르게 배우지는 않는다. 세부적인 기능은 자동차마다 다르겠지만, 큰 틀인 운전법은 달라지지 않는다. 따라서 신형 자동차가 나오더라도 운전자는 신형 자동차를 운전할 수 있다. 이를 객체지향의 관점에서 보면 클라이언트인 운전자는 인터페이스인 자동차에만 의존하며, 인터페이스를 구현한 새로운 구현체가 나와도 클라이언트의 코드 변경 없이 확장이 가능하다. 이와 같이 설계하는 것이 객체지향 프로그래밍의 핵심이며, 이를 5가지 원칙으로 정리한 내용은 다음과 같다.


  • 좋은 객체 지향 설계의 5가지 원칙(SOLID)
    • SRP: 단일 책임 원칙(single responsibility principle)
      • 한 클래스는 하나의 책임만 가져야한다.
      • 이때 책임의 기준은 변경이 있을 때 파급효과가 적으면 단일 책임 원칙을 잘 따른 것이다.
    • OCP: 개방-폐쇄 원칙 (Open/closed principle)
      • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
      • 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현하면 이를 클라이언트의 코드 변경 없이 이용할 수 있어야 한다. 즉 기능을 확장해도 클라이언트의 코드를 변경해서는 안된다. 이를 위해객체를 생성하고, 연관관계를 맺어주는 별도의 조립,설정자가 필요하다.
      • ex) 같은 인터페이스의 두 가지 구현체에 대해 클라이언트 코드 변경 없이 언제든 바꿔낄 수 있도록 설계
    • LSP: 리스코프 치환 원칙 (Liskov substitution principle)
      • 일반적인 사회의 규칙에 맞게 설계한다. → 컴파일이 되냐 마냐의 문제가 아닌, 자동차 인터페이스의 엑셀은 앞으로 가는 기능을 구현해야하는 것과 같은 일반적인 규칙을 따라야 한다.
    • ISP: 인터페이스 분리 원칙 (Interface segregation principle)
      • 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
      • 인터페이스도 범위를 잘 정해서 특정 기능에 따라 분리해주어야함. ex) 자동차 인터페이스 → 운전 인터페이스 , 정비 인터페이스로 분리 → 사용자 클라이언트도 운전자 클라이언트, 정비사 클라이언트로 분리 가능!
      • 정비 인터페이스가 변해도 운전자 클라이언트에 영향을 주지 않음
    • DIP: 의존관계 역전 원칙 (Dependency inversion principle)
      • 프로그래머는 추상화에 의존해야지 구체화에 의존하면 안된다!
      • 구현 클래스에 의존하지 않고 인터페이스에 의존해야한다! (역할에 의존해야한다.)
      • k3를 위해 설계하여 인터페이스를 k3에 맞추지 말고 자동차 인터페이스를 잘 설계하여 k3에 적용해야한다. 전자처럼 설계하면 변경이 어렵기 때문에, 아반떼에 적용하기 힘들어진다.
      • 인터페이스에 의존하면서 구현체에 동시에 의존해도 DIP위반이다. 무조건 인터페이스에만 의존해야한다.
      좋은 객체지향 프로그래밍의 핵심은 다형성 이지만, 다형성만으로는 OCP,DIP를 지킬 수 없다!!

객체 지향 설계와 스프링

다형성과 함께 OCP, DIP를 지키면서 개발을 하다보면 결국 스프링 프레임워크에 도달하게 된다. 이를 쉽게 사용하기 위해 프레임워크로 만든 것이다. 스프링은 DI(Dependency Injection)를 통해 OCP, DIP를 지킬 수 있게 지원하여, 클라이언트의 코드 변경 없이 기능을 확장할 수 있게 된다. 자세한 내용은 이후 포스팅에서 설명한다.



다음포스팅 - 객체 지향 설계가 필요한 상황:https://yulddong.tistory.com/9

 

객체 지향 설계가 필요한 상황

객체 지향 설계가 필요한 상황(순수 자바 코드만 이용) 한번 정해지면 바뀔 일이 없는 서비스를 설계할때는 클라이언트 코드에서 구현체에 의존하도록 설계하여도 문제가 되지 않는다. 다만, 위

yulddong.tistory.com


이 포스팅은 스프링 핵심원리 - 기본편(By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다.

'자바 스프링 > 스프링 핵심원리' 카테고리의 다른 글

컴포넌트 스캔  (0) 2023.01.06
싱글톤 컨테이너  (0) 2023.01.05
스프링 빈 조회  (2) 2023.01.04
객체지향 설계 - 스프링으로 전환  (0) 2023.01.03
객체 지향 설계가 필요한 상황  (0) 2023.01.03
Comments