스프링 스터디 ; 객체 지향 설계와 스프링, 예제 만들기

MINJU·2022년 2월 13일
0

스프링

목록 보기
2/15
post-thumbnail

'객체 지향 설계와 스프링', '스프링 핵심 원리 이해-예제 만들기', '객체 지향 원리 적용','스프링 컨테이너와 스프링 빈','싱글톤 컨테이너', '컴포넌트 스캔' 중 처음 두 개를 맡아서 자료 정리를 준비했습니다.

강의 출처

객체 지향 설계와 스프링

스프링 생태계

이때 스프링 이라는 단어는 문맥에 따라 다르게 사용됩니다.

  • 스프링 DI 컨테이너 기술
  • 스프링 프레임워크
  • 스프링 부트, 스프링 프레임워크 등을 모두 포함한 스프링 생태계

스프링의 핵심

스프링은 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크입니다.

객체지향

여기서 객체지향이란 추상화, 캡슐화, 상속, 다형성 의 특징을 갖습니다. 여기서 다형성이란 '역할'과 '구현'으로 세상을 구분하는 것입니다. 역할과 구현으로 분리하면 세상은 단순해지고 유연해지며 변경도 편리해집니다. '클라이언트'는 대상의 역할(인터페이스)만 알면되고, 구현 대상의 내부 구조를 몰라도 되며 구현 대상의 내부 구조가 변경되어도 영향을 받지 않습니다. 그리고 구현 대상 자체를 변경해도 영향을 받지 않습니다.
이를 구현하기 위해서 객체 설계시 역할(인터페이스)을 먼저 부여하고 그 역할을 수행하는 구현 객체를 만듭니다.

다형성의 본질

다형성을 실현하면 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있습니다. 즉, 클라이언트를 변경하지 않고 서버의 구현 기능을 유연하게 변경할 수 있게 됩니다. 따라서 설계시에 '인터페이스'를 안정적으로 잘 설계하는 것이 중요해집니다.

스프링과 객체 지향

스프링에서는 다형성이 가장 중요합니다! 스프링은 다형성을 극대화해서 이용할 수 있게 도와줍니다. 스프링에서 이야기하는 제어의 역전(IoC), 의존관계주입(DI)은 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원합니다.

SOLID

  1. SRP = 단일 책임 원칙(single responsibility principle)
  2. OCP = 개방-폐쇄 원칙(Open/closed principle)
  3. LSP = 리스코프 치환 원칙(Liskov substitution principle)
  4. ISP = 인터페이스 분리 원칙(Interface segregation principle)
  5. DIP = 의존관계 역전 원칙(Dependency inversion principle)

SRP
1. 한 클래스는 하나의 책임만 가져야 합니다.
2. 이때 하나의 책임이라는 것은 클 수도 있고 작을 수도 있습니다. 즉, 문맥과 상황에 따라 다릅니다.
3. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것입니다.

OCP
1. SW 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야합니다.
2. 즉, 다형성을 활용하여야 합니다.
3. 스프링 부트에는 객체를 생성하고 연관관계를 맺어주는 별도의 조립, 설정자가 존재합니다.

LSP
1. 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야합니다.
2. 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야한다는 것입니다. 다형성을 지우너하기 위한 원칙, 인터페이스를 구현한 구현체는 믿고 사용하려면 이러한 원칙이 필요합니다.
3. 예를 들어 자동차 인터페이스의 엑셀은 앞으로 가라는 기능인데, 구현체에서는 뒤로 가도록 구현한다면 이는 LSP 위반입니다.

ISP
1. 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫습니다.
2. 이러면 인터페이스가 명확해지고 대체 가능성이 높아집니다.

DIP
1. 프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안됩니다.'
2. 즉, 구현 클래스에 의존하지 말고 인터페이스에 의존해야합니다.
3. 이는 역할에 의존해야한다는 것과 동일합니다. 객체 세상도 클라이언트가 이너페이스에 의존해야 유연하게 구현체를 변경할 수 있습니다. 구현체에 의존하게 되면 변경이 아주 어려워집니다.

객체 지향 설계와 스프링

: 스프링은 DI와 DI 컨테이너 제공으로 다형성을 제공하고 OCP와 DIP를 가능하게 지원합니다. 클라이언트 코드의 변경 없이 기능 확장이 가능해지며 쉽게 부품을 교체하듯이 개발할 수 있게 됩니다.


예제 만들기

스프링 부트 스타터 사이트에서 스프링 프로젝트를 생성합니다.

스프링을 만들기 전에 비즈니스 요구사항을 설계합니다. 하단은 인프런 강좌를 참조한 비즈니스 요구사항입니다.

  1. 회원
    = '가입'하고 '조회' 할 수 있습니다.
    = '일반'과 'VIP' 등급이 있습니다.
    = 회원 데이터 자체는 'DB'를 구축할 수 있고, 외부 시스템과 연동할 수 있습니다.(미정)

  2. 주문과 할인 정책
    = 회원은 상품을 주문할 수 있습니다.
    = 회원 등급에 따라 할인 정책을 적용할 수 있습니다.
    = VIP는 1,000원을 할인해주는 고정 금액 할인을 적용합니다.(변경 가능)

이에 따른 도메인 설계가 필요합니다.

DB가 아직 확정이 되지 않았을 경우, 가장 단순한 메모리 회원 저장소를 구현해서 우선 개발을 진행합니다.

0개의 댓글