Java Spring을 왜 사용하는가? Spring이 무엇인가?에 대해서
스프링 기술
기술명 | 설명 |
프레임워크 | 핵심 |
부트 | 여러 스프링 기술 편리하게 사용하도록 help |
데이터 | CRUD 사용 편리하게 |
세션 | 세션 기능 편리하게 |
시큐리티 | 보안 관련 |
Rest Docs | API 문서화 |
배치 | 배치 처리 특화 |
클라우드 | 클라우드 관련 |
등등 여러가지 기능이 있다.
spring.io/projects에 들어가면 더 많은 것을 볼 수 있음.
스프링 프레임워크
- 핵심 기술: 스프링 DI 컨테이너, AOP, 이벤트, ..
- 웹 기술: 스프링 MVC, ...
- 데이터 접근 기술: 트랜잭션, JDBC, XML, ...
- 기술 통합
- 테스트
- 언어: 코틀린, 그루비
스프링 부트
: 스프링 편리하게 사용할 수 있도록 지원.
- 톰캣 같은 별도의 웹서버 설치할 필요 x
- 편리한 빌드 구성을 위한 starter 종속성 제공.
ex: 한 라이브러리를 추가하면 관련된 라이브러리들까지 한꺼번에 가져올 수 있도록
스프링을 사용하는 이유?
- '객체 지향' 특성을 살려내는 프레임워크
( 스프링 이전에 사용하던 EJB는 사용이 너무 어려움
+EJB에 종속적이라 자바의 객체 지향 특성을 다 죽임 )
- 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
좋은 객체 지향이란?
- 유연하고 변경이 용이함
ex: 기계 부품 갈아 끼우듯
- 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법
역할, 구현 분리
- 역할(=인터페이스), 구현(=인터페이스를 구현한 클래스/객체) 분리
- 클라이언트를 변경하지 않고 서버의 구현 기능을 유연하게 변경할 수 있다.
- 한계: 역할 자체가 변하면 클라이언트, 서버 모두에 큰 변경
자바 언어의 다형성
- 오버라이딩: 메소드 재정의
(!=오버로딩: 메소드 여러개 정의)
- 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경
SOLID
: 좋은 객체 지향의 5가지 원칙
- 단일 책임 원칙; SRP; Single Responsibility Principle
한 클래스는 하나의 책임만 가진다.
변경이 있을 때 파급 효과가 적다.
- 개방 폐쇄 원칙; OCP; Open/Closed Principle
sw 요소는 확장에는 열려 있고 변경에는 닫혀 있어야 한다.
인터페이스를 구현한 새로운 클래스를 하나 만들어서 새 기능 추가
(다형성의 역할/구현 분리하자는 말과 유사)
but, 클라이언트가 구현 클래스를 직접 선택하는 경우, 구현 객체 변경을 원하면 클라이언트 코드 변경해야 한다.
-> 객체 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자 필요 (spring이 지원! DI Container 등)
- 리스코프 치환 원칙; LSP; Liskov Substitution Principle
객체는 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다
하위 클래스는 인터페이스 규약을 다 지켜야 한다는 것.
(ex: 악셀을 밟으면 앞으로 간다는 규약-> 뒤로 간다는 기능으로 구현 x)
- 인터페이스 분리 원칙; ISP; Interface Segregation Principle
특정 클라이언트를 위한 여러 인터페이스가 범용 인터페이스 하나보다 낫다
- 의존관계 역전 원칙; DIP; Dependency Inversion Principle
추상화에 의존 o. 구현에 의존 x
클라이언트는 인터페이스를 보게 하고, 구현한 것을 보는 것은 x. (역할에 의존하게 해라)
스프링과 객체 지향
- 다형성을 극대화
- 제어의 역전(IoC), 의존관계 주입(DI)은 다형성을 활용해 역할/구현을 편리하게 함
본 글은 김영한님의 유료 강의를 들으며 요약, 정리를 목적으로 작성한 것으로 홍보나 금전적 목적이 없습니다.
제 방식으로 정리한 것으로 강의 내용을 추가/삭제/변경된 부분이 많으며 자세한 설명은 강의 구매를 추천 드립니다.
참고: inflearn / 김영한 / 스프링 핵심 원리 기본편
'Develop > Spring+JPA' 카테고리의 다른 글
[Spring] Interceptor (0) | 2021.01.29 |
---|---|
[Spring Boot] Request method 'DELETE' not supported (2) | 2021.01.20 |
[Spring] <context:component-scan>에 대해 (0) | 2021.01.07 |
@Qualitifier 편리하게 이용하기 (0) | 2020.12.29 |
IoC, DI, Container 개념 (0) | 2020.12.29 |