Spring 핵심 원리 기본편 (1) - Spring의 등장배경 / 생태계 / 객체지향 프로그래밍

김정욱·2021년 2월 15일
3
post-thumbnail

본 글은 inflearn의 김영한님의 강좌를 ref합니다

[ 스프링의 등장 배경 ]

  • Java 진영에서 표준으로 사용하는 기술 인 EJB(J2EE)를 사용
    • 이론적으로 괜찮았지만 실제 사용 비용이 비싸며 사용하기가 매우 복잡 --> 추후 Spring 등장의 원인
    • EJB Entity Bean (EJB에서 사용하던 ORM방식의 기술)
      : 수준이 낮은 편이였기 때문에 추후 Hibernate가 개발
      이러한 Hibernate개발자를 데려와서 Java표준으로 만든 것이 JPA이다!
      (JPA는 표준 인터페이스 일 뿐 구현체들이 필요함)
  • Spring의 등장
    • 전통적인 J2EE(EJB)라는 겨울을 넘어 새로운 시작이라는 뜻으로 Spring이름을 가짐
    • 2003년 Spring Framework 1.0 등장
    • 2009년 최초로 자바 코드로 Spring 설정이 가능해짐
    • 2014년 Spring Boot 1.0 출시! (설정간편 / 서버내장)

[ Spring 생태계 ]

필수

  • 스프링 프레임워크
    • 핵심 기술 : 스프링 DI 컨테이너 / AOP / 이벤트 등
    • 웹기술 : 스프링 MVC / 스프링 WebFlux
    • 데이터 접근 기술 : 트랜잭션 / JDBC / ORM 등
    • 기술 통합 : 캐시 / 이메일 / 스케줄링 등
    • 테스트 : 스프링 기반 테스트 지원
    • 언어 : 코틀린 / 그루비
  • 스프링 부트
    • 스프링을 편리하게 사용할 수 있도록 지원하는 기술
    • 최근에는 아예 스프링 부트 개발이 기본이 되었음
    • 단독으로 실행할 수 있는 Spring App을 쉽게 생성
      (내장 톰켓 사용 등)
    • 손쉬운 빌드 구성을 위한 starter 종속성 제공
    • 스프링 / third parth(써드파티) 라이브러리 자동 구성
    • 메트릭 / 상태 확인 같은 프로덕션 준비 기능 제공
    • 관례에 의한 간결한 설정!!

선택

  • 스프링 데이터
    : 어떤 DB든 기본적인 CRUD를 편리하게 사용할 수 있게 해줌
  • 스프링 세션 : 세션 기능을 편리하게 사용할 수 있게 해줌
  • 스프링 시큐리티 : 보안 관련
  • 스프링 배치 : 배치 처리에 특화된 기술

Spring을 왜 만들었나요?

  • 기술 스택을 바라보는 좋은 2가지 관점
    • 이 기술을 왜 만들었는가?
    • 이 기술의 핵심 컨셉은?

Spring은 왜 만들었는가?

  • EJB는 EJB에 너무 의존적이고 종속적인 개발을 해야했다
    --> Java의 객체지향 특징을 살리지 못함
  • POJO(Plain Old Java Object) 처럼 프레임워크에 종속된 방식을 탈출하자는 단어가 나온 것도 이해가 된다
  • 이러한 이유로 Spring이 등장

Spring의 핵심 컨셉?

  • 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
  • Java 언어 기반의 프레임워크 --> Java는 객체 지향 언어
  • Spring은 이러한 Java의 객체 지향 언어의 장점을 살리는 프레임워크

좋은 객체 지향 프로그램 이란?

객체지향 프로그래밍 ?

  • 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 독립된 단위인 '객체'들의 모임으로 파악하는 방식의 프로그래밍
  • 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용

유연 하고 용이 ? (다형성!)

  • 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법
  • 레고 블럭 조립하듯
  • 컴퓨터 부품 갈아 끼우듯
  • 즉, 다형성(Polymorphism)이 핵심

다형성 (Polymorphism)


[ 핵심 ]

  • 역할구현으로 세상을 구분하면 유연해지며 변경도 편리해짐
    ( 역할 - 인터페이스 / 구현 - 인터페이스를 구현한 구현 객체 )
  • 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경

[ 비유 ]

  • 운전자(Client)
  • 자동차 역할(interface)
  • K3 / 아반떼 / 테슬라 - (구현체)
  • 자동차가 바뀐다고 운전자가 새로운 면허를 딸 필요가 없음
    --> 자동차라는 추상체를 기반으로 모두 만들어졌기 때문

[ 다형성의 장점 ]

  • 클라이언트는 대상의 역할(인터페이스)만 알면 된다
  • 클라이언트는 구현 대상 내부 구조를 몰라도 된다
  • 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향 X

Java언어의 다형성

  • 오버라이딩(over ridding)
    : 부모를 상속받아 메서드를 재정의 해서 사용하는 것
  • 오버라이딩을 통해 하나의 부모 아래에 다양한 구현체를 만들 수 있음
  • 다양한 구현체들을 실행시점에 유연하게 변경할 수 있다
    (Service에서 Repository를 사용할 때 생성을 변경!)
    (나중에 @Autowired사용하면 해당 코드가 불필요해진다)

정리

  • 실세계이 역할과 구현의 컨셉을 다형성을 통해 객체 세상으로 가져올 수 있음
  • 유연하고 변경이 용이
  • 확장 가능한 설계
    --> 클라이언트에 영향을 주지 않는 변경 가능
  • 인터페이스를 안정적으로 잘 설계하는 것이 매우 중요

스프링과 객체 지향

  • 다형성이 가장 중요하다 !
  • Spring은 다형성을 극대화해서 이용할 수 있게 도와준다 !
  • 제어의 역전(IoC) / 의존성 주입(DI) 등등은 결국 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원하는 것!
profile
Developer & PhotoGrapher

0개의 댓글