[Spring] Spring과 OOP

Hoon·2022년 10월 4일

Spring

목록 보기
2/18

Java와 OOP

자바 언어의 장점중에 가장 큰 장점은 객체지향적 설계로 코드를 짤 수 있다는 것이다.

우리는 항상 좋은 객체지향 애플리케이션을 개발할 수 있도록 노력해야 한다.

그래서 좋은 객체지향이 뭔데?

객체지향의 가장 중요한 핵심은 다형성(Polymorphism)에 있다.

다형성(Polymorphism)

다형성이란 역할과 구현의 분리를 말한다.

즉 객체를 설계할때 Interface(역할)을 먼저 부여한 후 그 역할을 수행하는 Implementation(구현체)를 만들게 된다.

이 방법의 장점은 클라이언트는 인터페이스만 사용하기 때문에 인터페이스를 구현한 구현체 내부에 대해서는 알필요가 없다.
또한 구현체를 변경하였을때 클라이언트는 전혀 영향을 받지 않는다.

다형성을 적용한 코드의 사용 예시를 살펴보자

public class MemberService {
	// private MemberRepository memberRepository = new MemoryMemberRepository();
    private MemberRepository memberRepository = new JdbcMemberRepository();
}

MemoryMemberRepositoryJdbcMemberRepositoryMemberRepository 인터페이스를 구현하고 있다. 현재상황은 JdbcMemberRepository 구현체를 사용하였다.

이와같은 다형성으로 실행시점에 객체 인스턴스를 유연하게 바꿀 수 있고, 클라이언트 변경 없이 서버의 구현 기능을 변경 할 수 있다. 또한 확장에도 유용하다!

하지만 위와 같은 순수 자바코드는 아쉽게도 SOLID원칙OCP를 지키지 못하는 모습을 볼 수 있다.

SOLID

SRP (Single Reponsibility prinicipal)

단일 책임 원칙: 한 클래스는 하나의 책임만 져야 한다.

하나의 책임이란 말이 모호하다. 중요한 기준은 변경이다. 변경이 있을때 파급효과가 적으면 단일 책임 원칙을 잘따른 것

OCP (Open Closed Principal)

개방 폐쇄 원칙: 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀있어야 한다.

OCP는 다형성을 활용하여 지키면 되는데 위의 코드처럼 순수 자바만으로는 OCP를 지키기 힘들다. 순수 자바 코드만으로는 역할과 분리를 통해 확장을 해도 결국 구현 객체를 변경하려면 클라이언트 코드를 변경해야 하기 때문에 OCP를 지킬 수 없다.

이 문제를 Spring이 해결해 줄 것이다.

LSP (Liskov Substitution Principal)

리스코프 치환 원칙: 다형성에서 하위 클래스는 인터페이스의 규약을 다 지켜야 한다.

예를 들어 Car라는 클래스의 구현체가 excel함수를 브레이크기능으로 구현하였다면 LSP를 지키지 않은 것이다.

ISP (Interface Segregation Principal)

인터페이스 분리 원칙: 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

예를 들어 Car라는 인터페이스를 운전 인터페이스, 정비 인터페이스로 분리한다. 그러면 클라이언트도 운전 클라이언트, 정비 클라이언트로 분리가 되는데 이러면 정비 클라이언트가 변해도 운전 클라이언트에 영향을 주지 않는다. 즉 인터페이스가 명확해지고, 대체 가능성이 높아진다.

DIP (Dependency Inversion Principal)

의존관계 역전 원칙: 구현클래스에 의존하지 않고 인터페이스를 의존하라.

만약 구현 클래스를 의존하면 OCP를 지키기 어려울 뿐만 아니라 변경이 아주 어려워진다. 즉 클라이언트가 구현클래스는 모르고 인터페이스를 의존하여 사용하라는 뜻.

하지만 순수 자바 코드로는 DIP를 지키기 힘들다.
예를들어 위의 코드의

public class MemberService {
	private MemberRepository memberRepository = new MemoryMemberRepository();
}

여기서는 MemberRepository 인터페이스를 의존하고 있지만 이를 구현한 MemoryMemberRepository도 의존하고 있다. -> DIP 위반

이것 역시도 Spring이 해결해 줄 것이다.

스프링과 OOP

스프링은 다음 기술로 위의 문제들(OCP, DIP 위반 문제)들을 해결해 준다.

  • Dependency Injection
  • DI Container

위의 기술들로 클라이언트 코드의 변경없이 기능을 확장할 수 있다.

이 점들이 바로 우리가 자바로 객체지향 프로그래밍을 할때 스프링을 써야 하는 가장 핵심적인 이유이다.

Reference

스프링 핵심 원리 - 기본편 (김영한님)

profile
개발이 즐거워

0개의 댓글