본문 바로가기
스터디IT🌼/SpringBoot

스프링이란 ?!

by 동백사과 2022. 10. 10.

* 우아한 형제들 김영한 개발자님의 스프링 핵심원리 - 기본편 강의 중  일부 정리*

 

🎯 스프링 등장 전 배경

EJB : 과거에 자바 진영의 표준 기술 중 하나로 종합 선물 세트 처럼 많은 기능들이 제공되었음

 

그러나 EJB의 경우 비용이 비싸고, 어렵고, 느리다는 단점이 있었다. 

 

이에 개발자 Gavin King과 Rod Johnson이 HibernateSpring FrameWork 를 만들게 된다. 

 

출처 : inflearn Spring 김영한 강사님 강의자료

 

  이후 하이버네이트가 기반이 된 JPA 가 자바 진영의 표준 인터페이스로 불려지게 된다. 

 

 

🎯 스프링의 역사

 - 2002년 로드 존슨이 책을 출간하면서 시작 됨 ( EJB 의 문제점 지적 ) 

 - 유겐 휠러와 얀 카로프 개발자가 로드 존슨에게 오픈 소스 프로젝트를 제안 => 스프링 개발의 시작

 

* 릴리즈 * 

 2003년 : 스프링 프레임워크 1.0 출시 - XML

 2006년 : 스프링 프레임워크 2.0 출시 - XML 편의 기능 지원

 2009년 : 스프링 프레임워크 3.0 출시 - 자바 코드로 설정 

 2013년 : 스프링 프레임워크 4.0 출시 - 자바 8

 2014년 : 스프링 부트 1.0 출시 ( 설정이 어렵다는 스프링의 단점을 보완 ) 

 2017년 : 스프링 프레임워크 5.0, 스프링 부트 2.0 출시 => 리액트 지원

 2020년~ : 현재 스프링 프레임워크 5.3.9 버전까지 출시, 스프링 부트 3.0 출시 예정 

 

🎯 스프링이란 ?

 

 스프링은 자바의 웹 프레임 워크로 자바 언어를 기반으로 사용한다. 다양한 어플리케이션을 만들기 위한 프로그래밍 툴로 스프링은 중복 코드의 사용률을 줄여주고,다양한 기술들이 지원되며 비즈니스 로직을 좀 더 간단하게 해준다는 장점이 있다.

 

스프링 데이터 : CRUD 를 편리하게 해주는 프레임워크

스프링 세션 

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

스프링 Rest Docs : 문서화 작업을 편리화

스프링 배치 : 배치 프로그램 개발, 관리 기술

스프링 클라우드 

🎯 스프링 프레임워크의 기술

  • 핵심 기술 : 스프링 DI 컨테이너, AOP , 이벤트, 기타
  • 웹 기술 : 스프링 MVC, 스프링 WebFlux
  • 데이터 접근 기술 : 트랜잭션, JDBC, ORM 지원, XML 지원
  • 기술 통합  : 캐시 , 이메일, 원격접근, 스케줄링
  • 테스트 : 스프링 기반 테스트 지원
  • 언어 : 코틀린, 그루비 

 

🎯 스프링 부트 

  • 스프링을 편리하게 사용할 수 있도록 지원 ( 기본으로 사용 )
  • 단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성 가능함. 
  • Tomcat 같은 웹 서버가 내장되어 있음
  • 쉬운 빌드 구성을 위한 starter 종속성 제공
  • 스프링과 서드 파티 라이브러리 자동 구성 ( 버전 매치를 따로 신경 쓸 필요 없이 자동으로! ) 
  • 간결한 설정

 

🎯 스프링을 만든 이유는 ?

- 자바 언어 기반의 프레임워크로 객체 지향 언어가 가진 특징을 최대로 살리는 프레임워크! ( 다형성 극대화 )

- 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크!

 

❓ 그렇다면 ' 좋은 객체 지향 ' 이란

- 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다!

- 유연하고 용이하다는 것은 '레고' 맞추듯 컴포넌트를 쉽고 유연하게 변경하며 개발 할 수 있는 방법을 의미

- 추상화, 캡슐화, 정보은닉, 상속 , 다향성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치 제공

- 구현과 역할을 분리하여 개발 가능 ( 클라이언트에 영향을 주지 않고, 인터페이스로 안정적 개발 가능!  = 확장 가능한 설계 )

 

* 좋은 객체 지향 설계의 5가지 원칙이 있음 : SOLID

  • SRP : 단일 책임 원칙 (Single Responsibility Principle )
    •   한 클래스는 하나의 책임만 가져야 한다 -> 하나의 클래스 변경 시 타 클래스에 영향이 적으면 잘 짰다고 볼 수 있음
  • OCP : 개방-폐쇄 원칙 ( Open / Closed Principle ) 
    • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. 
    • 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현, 다형성 활용
    • 역할과 구현의 분리 
      • 구현 객체를 변경하려면 클라이언트 코드를 변경해야 하는 경우가 발생 / 다형성을 잘 사용했다 하더라도
      • 객체를 생성하고 연관관계를 맺어주는 별도의 조립, 설정자가 필요 ( Spring Container 가 해주는 역할 ) 
  • LSP : 리스코프 치환 원칙 ( Liskov Subsititution Principle )
    • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. 
    • 다형성에서 하위클래스는 인터페이스 규약을 다 지켜야한다. 
  •  ISP : 인터페이스 분리 원칙 ( Interface Segregation Principle )
    • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다. ( 인터페이스 쪼개기 ) 
    • 인터페이스가 명확해지고 대체 가능성이 높아진다. 
  •  DIP : 의존 관계 역전 원칙 ( Dependency Inversion Principle )
    • 프로그래머는 ' 추상화에 의존해야지, 구체화에 의존하면 안된다 ' ! ( 구현체에 집중하기 보다 인터페이스에 집중 )
    • OCP 에서는 인터페이스에 의존하지만 구현 클래스에도 의존하는 경우가 있음 - DIP 위반

 

객체 지향의 핵심은 다형성이지만 다형성 만으로는 깔끔한 개발이 어려움!

( 다형성 만으로는 구현 객체 변경 시 클라이언트 코드 함께 변경..) -> OCP , DIP 를 지키기 힘듦

 

이에 스프링이 필요하다!!!!!!

스프링은 DI ( Dependency Injection ) 과 DI container 를 통해 다형성, OCP, DIP를 가능하게 지원한다.

이로써 클라이언트 코드의 변경 없이 기능을 확장 가능하게 하고 개발자는 부품 교체하듯 편리하게 개발을 할 수 있게 된다.

 


- 이후 스프링 프레임워크를 사용해보면서 코드를 통해 스프링의 필요성을 직접 경험해보는 글을 올릴 예정입니다😃 -

 

댓글