Spring/Spring 이야기

스프링 핵심 원리 기본편 강의 - 스프링

seungdols 2024. 3. 26. 07:51

스프링이란?

  • Spring framework / Spring boot 필수
  • Spring batch, Spring Session, Spring Data 등등

스프링프레임워크

  • 핵심기술
  • 웹기술
  • 데이터 접근 기술
  • 기술 통합
  • 테스트
  • 언어

스프링 부트

  • 최근에 기본으로 사용
  • Spring Application을 쉽게 생성
  • 내장 톰캣 지원
  • 손쉬운 빌드 구성을 위한 starter 종속성 제공
  • 프로덕션 준비 기능 제공
  • 간결한 설정

스프링 부트만 사용 할 수 없고, 실제는 스프링 프레임워크를 사용한다.

스프링이란 단어?

  • 스프링 생태계
  • 스프링 프레임워크
  • 스프링 DI 컨테이너 기술

스프링 진짜 핵심

  • 자바 언어 - 객체 지향 언어
  • 스프링은 객체 지향 언어가 가진 강력한 특징으로 개발 할 수 있도록 돕는 프레임워크

다형성 / 객체

  • 역할과 구현으로 구분하는 것에 초점을 맞추면 됨.
  • 유연한 구조를 가지게 함.
    • 클라이언트는 대상의 역할만 알면 된다.
    • 클라이언트는 구현 대상의 내부 구조 몰라도 된다.
    • 클라이언트는 구현 대상의 내부 구조가 변경 되어도 영향이 없다.
    • 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
  • 객체를 설계 할 때 역할과 구현을 명확히 분리
  • 객체는 협력이라는 관계부터 생각 하라.
    • 혼자 있는 객체는 없다.
    • 클라이언트: 요청, 서버: 응답
    • 수 많은 객체 클라이언트와 객체 서버는 서로 협력 관계를 가진다.

다형성의 본질

  • 인터페이스를 구현한 객체 인스턴스 실행 시점에 유연하게 변경할 수 있다.
  • 협력이라는 객체 사이의 관계에서 시작해야 함.
  • 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.

SOLID

  • SRP 단일 책임 원칙
  • OCP 개방-폐쇄 원칙
  • LSP 리스코프 치환 원칙
  • ISP 인터페이스 분리 원칙
  • DIP 의존관계 역전 원칙

SRP (Single Responsibility princicple)

  • 한 클래스는 하나의 책임만 가져야 한다.
  • 하나의 책임은 모호함.
  • 중요한 기준은 변경이다.
    • 변경을 할 때, 파급 효과가 적으면 해당 원칙을 잘 지킨 것

OCP (Open/Closed princicple)

  • 확장에는 열려 있고, 변경에는 닫혀있다.
  • 다형성을 활용해야 함.
  • 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현
  • 구현 객체를 바꾸면, 클라이언트 코드를 변경 해야 한다. => OCP가 깨진다.
    • 역할과 구현의 분리를 적용
      • 객체 생성과 연결 해주는 설정 매개체가 있어야 함. => 이걸 스프링 컨테이너가 해준다.

LSP (Liskov substitution princicple)

  • 프로그램의 객체는 프로그램의 정확성을 꺠뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  • 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다.

ISP (Interface segregation princicple)

  • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
  • 인터페이스가 명확해지고, 대체 가능성이 높아진다.

DIP (Dependency inversion princicple)

  • 구현 클래스에 의존하지 말고, 인터페이스에 의존해야 함.
    • 추상화에 의존하고, 구체화에 의존하지 말자.
    • 결국, 역할에 의존 하게끔 해야지, 구현체를 바라보면 안 됨.
      • 이 말은 결국, 스프링에서 빈을 외부에서 주입 해주려고 하는 이유..근데, 생각해보면 어떻게 그렇게 큰 프로젝트에서 원칙들을 다 지키는 걸까? 대단하다..

객체지향 설계와 스프링

  • 스프링은 다형성 + OCP, DIP를 지키기 위해서 DI 컨테이너를 지원 함.
  • 스프링 없을 때는, EJB 시절이라 객체 지향은 개뿔 코드를 깔끔하게 작성 하기도 어려움.
    • 로드 존슨이 책에서 만든 예제를 천재 개발자들이 모여서 오픈 소스로 구성 제안
  • 거의 모든 설계에 인터페이스를 넣는게 이상적이다.

실무 고민

  • 인터페이스를 도입 하면 추상화 비용이 발생
  • 기능을 확장 할 가능성이 없으면, 그냥 사용하고 그게 아니면 리팩토링 하면서 인터페이스를 만들어주는게 좋다.

  • 생각보다 많은 내용을 정말 빠른 시간내에 설명을 하시는데, 그 설명이 어렵지도 않다.
  • 내가 이 강의를 듣게 된 이유는 단 하나, 코드 예제를 보고 싶어서다. (기대가 된다.)
  • 어떻게 보면, 아키텍트의 관점일 수 있는데, 경험이 결국 중요한데, 그냥 경험이 아니라 좋은 경험이 많이 쌓여야 한다. 결과적으로 개발 짬은 그냥 쌓이는 게 아니다.
반응형