스프링의 탄생
2000년대 초반 자바 진영에서는 EJB가 표준 기술이였다.
트랜잭션 관리, 분산 기술등의 장점
하지만 비싸고 어렵다. 복잡하고 느리다 → 스프링과 하이버네이트 탄생
표준 인터페이스 : JPA
JPA 구현체들: 하이버네이트, eclipseLink…
스프링은 EJB의 문제점을 지적하면서 등장하였고, 이름은 전통적인 J2EE(EJB)라는 겨울을 넘어 새로운 시작이라는 뜻으로 짓게 됨
스프링이란?
스프링 데이터: CRUD를 편리하게 사용 가능 (스프링 데이터 JPA 기술 많이 사용)
스프링 세션: 세션 기능을 편리하게 사용 가능
스프링 시큐리티: 보안 관련
스프링 RestDocs: API 문서와 테스트를 엮어 문서화를 편하게 해주는 것
스프링 배치: 배치처리(실시간으로 대량 데이터를 업데이트)에 특화된 기술
스프링 클라우드: 클라우드에 특화된 기술
스프링 프레임워크
핵심 기술: 스프링 DI 컨테이너, AOP, 이벤트
웹 기술: 스프링 MVC, 스프링 WebFlux
데이터 접근 기술: 트랜잭션, JDBC, ORM 지원, XML 지원기
기술 통합: 캐시, 이메일, 원격접근, 스케줄링
테스트: 스프링 기반 테스트 지원
언어: 코틀린, 그루비
스프링 부트
- 스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용
- Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨
- 스프링과 외부 라이브러리 자동 구성
💡 스프링 부트는 스프링 프레임워크와 별도로 사용할 수 있는게 아니다. 스프링을 편리하게 사용할 수 있는 기능을 제공해주는 것이다.
💡 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
좋은 객체 지향 프로그래밍이란
객체 지향 프로그래밍은 컴퓨터 프로그램을 객체들의 모임으로 파악하는 것
프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용
다형성
역할과 구현으로 세상을 구분
자동차를 변경해도 클라이언트(운전자)는 운전을 할 수 있다.
운전자(클라이언트)는 자동차 역할(인터페이스)만 알면 된다.
클라이언트가 자동차의 내부 구조를 몰라도 된다.
클라이언트는 구현 대상의 내부 구조나 대상 자체가 변경되어도 영향을 안받는다.
💡
역할 = 인터페이스
구현 = 인터페이스를 구현한 클래스, 객체
객체 설계시 역할(인터페이스) 부여한 후에, 역할을 수행하는 구현 객체 만들기
자바의 다형성
MemberService 클라이언트는 MemberRepository를 의존
인터페이스를 구현한 빨, 초를 변경해 할당 가능
- 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다.
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
💡 인터페이스를 가장 변화가 없는 방식으로 안정적으로 잘 설계하는 것이 중요
좋은 객체 지향 설계의 5가지 원칙
SRP: 단일 책임 원칙
변경이 있을 때 딱 하나의 클래스나 지점만 고치는 것
OCP: 개방-폐쇄 원칙
확장에는 열려 있으나 변경에는 닫혀 있음
다형성 - 인터페이스를 구현한 새로운 클래스를 만들어 새로운 기능을 구현
문제점 - 이 때 클라이언트인 MemberService의 코드를 바꿔야 한다. 다형성을 사용하지만 OCP를 못지켰다.
⇒ 객체를 생성하고 연관관계를 맺어주는 별도의 설정자가 필요
LSP: 리스코프 치환 원칙
프로그램의 객체는 하위 타입의 인스턴스로 바꿀 수 있어야함
하위 클래스는 인터페이스 규약을 다 지켜야 함
ISP: 인터페이스 분리 원칙
특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다
DIP: 의존관계 역전 원칙
구현 클래스(구체화)에 의존하지 않고, 인터페이스(추상화)에 의존하라
💡 다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 변경되어 OCP, DIP를 지킬 수 없음 → 스프링 등장!!
참고) 스프링 핵심 원리 기본편
'BACK > SPRING' 카테고리의 다른 글
[Spring] 스프링 핵심 원리 - 스프링 컨테이너와 스프링 빈 (0) | 2024.01.30 |
---|---|
[Spring] 스프링 핵심 원리 - 객체 지향 원리 적용(+ DI, IoC, 스프링 컨테이너) (0) | 2024.01.30 |
[SpringBoot] Thymeleaf form 태그 (0) | 2023.06.09 |
[Spring] Servlet 동작 방식 (0) | 2023.05.23 |
스프링MVC - 웹 애플리케이션의 이해 (0) | 2023.02.12 |