* 우아한 형제들 김영한 개발자님의 스프링 핵심원리 - 기본편 강의 중 일부 정리*
🎯 스프링 등장 전 배경
EJB : 과거에 자바 진영의 표준 기술 중 하나로 종합 선물 세트 처럼 많은 기능들이 제공되었음
그러나 EJB의 경우 비용이 비싸고, 어렵고, 느리다는 단점이 있었다.
이에 개발자 Gavin King과 Rod Johnson이 Hibernate와 Spring FrameWork 를 만들게 된다.
이후 하이버네이트가 기반이 된 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를 가능하게 지원한다.
이로써 클라이언트 코드의 변경 없이 기능을 확장 가능하게 하고 개발자는 부품 교체하듯 편리하게 개발을 할 수 있게 된다.
- 이후 스프링 프레임워크를 사용해보면서 코드를 통해 스프링의 필요성을 직접 경험해보는 글을 올릴 예정입니다😃 -
'스터디IT🌼 > SpringBoot' 카테고리의 다른 글
[ SpringBoot ] 스프링 핵심 원리 기본편_핵심원리 이해 (with. 예제) (1) | 2022.10.13 |
---|---|
[SpringBoot] 프로젝트 생성 _라이브러리 살펴보기 (0) | 2022.10.08 |
[ Intellij ] mac에서 마우스 먹통 & 씹힘 문제 해결 (0) | 2022.10.05 |
[SpringBoot] Lombok Annotation Processer 에러 ( Cannot find Symbol ) (0) | 2022.01.14 |
[SpringBoot] Annotation 종류 & 역할 (0) | 2022.01.14 |
댓글