[스프링 핵심원리 기본편] - 섹션1. 객체지향 설계와 스프링

jada·2023년 10월 17일
0

Spring 스터디

목록 보기
6/35

🎥 스프링 탄생 배경

2000년대 초반 - java 진영의 대표 표준기술, 스프링 및 JPA를 합친 기능들 가진EJB(Enterprise Java Beans)를 사용했음. But EJB는 시간이 오래 걸리고 복잡했음..

-> Spring, Hibernate 등장
-> Hibernate가 표준 JPA기술의 원형이 됨.

현재: JPA라는 표준 인터페이스를 하이버네이트와 같은 JPA구현체를 통해 구현, 이용한다.

🪐 Spring이란?

Spring은 여러 기술들의 모음이다.

      필수

  • 스프링 프레임워크 : 스프링 기술의 핵심임.

  • 스프링 부트 : 여러 스프링 기술을 편리하게 사용하도록 도와줌

    선택

  • 스프링 데이터 : 데이터베이스의 기본적인 CRUD 편리하게 사용할 수 있도록 도와준다.

  • 스프링 세션 : 세션을 편리하게 사용할 수 있도록 도와준다.

  • 스프링 시큐리티 : 보안 관련

  • 스프링 Rest Docs : API 문서화 편리하게 도와줌

  • 스프링 배치 : 배치 처리에 특화된 기술

  • 스프링 클라우드 : 클라우드에 특화된 기술



스프링 프레임워크

  • 핵심 기술: 스프링 DI 컨테이너, AOP, 이벤트, 기타

  • 웹 기술: 스프링 MVC, 스프링 WebFlux

  • 데이터 접근 기술: 트랜잭션, JDBC, ORM 지원, XML 지원

  • 기술 통합: 캐시, 이메일, 원격접근, 스케줄링

  • 테스트: 스프링 기반 테스트 지원

  • 언어: 코틀린, 그루비

  • 최근에는 스프링부트를 통해서 스프링 프레임워크의 기술들을 편리하게 사용한다.

스프링부트

  • 스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용한다.

  • 단독으로 실행할 수 있는 스프링 애플리케이션을 귑게 생성해준다.

  • Tomcat같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 된다.
    -> 스프링부트가 빌드하고 서버에 띄우는 것까지 알아서 해준다.

  • 손쉬운 빌드 구성을 위한 starter 종속성 제공
    -> 스프링에서 필요한 라이브러리들을 가져와준다.

  • 스프링과 3rd parth(외부) 라이브러리 자동 구성

    -> 현재 사용중인 스프링 프레임워크의 버전에서 사용할 수 있는 외부 라이브러리의 버전을 자동으로 구성해준다.

  • 메트릭, 상태 확인, 외부 구성 같은 프로덕션 준비 기능 제공
    -> 운영 환경에서 모니터링을 위한 기능 제공 등

  • 관례에 의한 간결한 설정
    -> 꼭 필요할 때만 커스터마이징 하면 됨


Spring 이라는 단어는?

  • 스프링이라는 단어는 문맥에 따라 다르게 사용된다.

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

Spring의 핵심 개념

이 기술을 만들었는가? 핵심 컨셉은?

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



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

  • 역할과 구현을 분리

    • 구조가 단순해지고, 유연성이 높아진다. -> 변경이 용이
    • 장점
      • 클라이언트는 대상의 역할(인테페이스)만 알면 된다.
      • 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
      • 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다.
      • 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
    • 자바 언어의 다형성을 활용
      • 역할 = 인터페이스
      • 구현 = 인터페이스를 구현한 클래스, 구현 객체
    • 객체의 협력
      • 혼자 있는 객체는 없다.
      • 클라이언트: 요청, 서버: 응답
      • 수 많은 객체 클라이언트와 객체 서버는 서로 협력 관계를 가진다.

    - 다형성의 본질

    • 인터페이스를 구현한 객체 인스턴스르 실행 시점에 유연하게 변경할 수 있다.

    • 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.


  • 역할과 구현의 분리 - 한계

    • 역할(인터페이스) 자체가 변하면, 클라이언트와 서버 모두에 큰 변경이 발생.

    • 따라서 인터페이스를 안정적으로 잘 설계하는 것이 중요하다 !


    스프링과 객체 지향

    • 객체 지향의 꽃은 다형성 !

    • 스프링은 다형성을 극대화해서 이용할 수 있게 도와준다.

    • 스프링에서의 제어의 역전(IoC), 의존관계 주입(DI)은 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
      -> 마치 레고 블럭 조립하듯이 구현을 편리하게 변경할 수 있다.




⭐ SOLID - 좋은 객체지향 설계의 5가지 원칙

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

SRP: 단일 책임 원칙 (single responsibility principle)

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

OCP: 개방-폐쇄 원칙 (Open/closed principle)

  • 가장 중요한 원칙 !

  • 소프트웨어 요소는 확장에는 열려있으나 변경에는 닫혀있어야 한다.

  • 다형성을 활용

    • 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현
  • <문제점>

    MemberService 클라이언트가 구현 클래스를 직접 선택
    • MemberRepository m = new MemoryMemberRepository(); //기존 코드
    • MemberRepository m = new JdbcMemberRepository(); //변경 코드

  • 구현 객체를 변경하려면 클라이언트 코드를 변경해야 한다. -> 다형성 사용했지만 OCP 원칙 지킬 수 X... -> ??

  • 어떻게 해결 ? -> 객체를 생성하고 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다 ! 그것이 바로 스프링 컨테이너가 해주는 역할.


LSP: 리스코프 치환 원칙 (Liskov substitution principle)

  • 다형성에서 하위 클래스는 인테퍼에시 규약을 다 지켜야 한다는 것.
  • 인터페이스를 구현한 구현체를 믿고 사용하려면, 이 원칙이 필요하다.
    • 자동차 인터페이스의 엑셀은 앞으로 가라는 기능임. 뒤로 가게 구현하면 LSP 위반, 느리더라도 앞으로 가야함

ISP: 인터페이스 분리 원칙 (Interface segregation principle)

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

    • 자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스로 분리
    • 사용자 클라이언트 -> 운전자 클라이언트, 정비사 클라이언트로 분리
    • 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않음
  • 인터페이스가 명확해지고, 대체 가능성이 높아진다.


DIP: 의존관계 역전 원칙 (Dependency inversion pirnciple)

  • 가장 중요한 원칙 2 !
  • 쉽게 이야기해서 클라이언트 코드 작성시 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 뜻
  • 역할(Role)에 의존하게 해야 한다.

그런데 OCP에서 설명한 MemberService는 인터페이스에 의존하지만, 구현 클래스도
동시에 의존한다.
• MemberService 클라이언트가 구현 클래스를 직접 선택
• MemberRepository m = new MemoryMemberRepository();
DIP 위반

정리

  • 객체 지향의 핵심은 다형성, But 다형성만으로는 쉽게 부품을 갈아끼우듯이 개발할 수 없다.
    • (구현 객체를 변경할 때 클라이언트 코드도 함께 변경 ...)
  • 다형성만으로는 OCP, DIP를 지킬 수 없다 !

⚡ 객체지향 설계와 스프링

스프링은 다음 기술로 다형성 + OCP, DIP를 가능하게 지원한다.

  • DI - 의존관계, 의존성 주입
  • DI 컨테이너 제공
  • DI 컨테이너란? 자바 객체들을 넣어놓고 의존관계를 주입해주는 역할

-> 클라이언트 코드의 변경 없이 기능 확장 + 쉽게 부품 교체하듯이 개발

profile
꾸준히 발전하는 개발자가 되자 !

0개의 댓글