스프링은 여러가지 기술의 집합
- 스프링 프레임워크
- 핵심
- 스프링 부트
- 아래와 같은 여러 스프링 기술을 편리하게 사용하게 해 준다.
- 스프링 데이터
- 데이터 접근을 위한 친숙하고 일관된 Spring 기반의 프로그래밍 모델을 제공하는 프로젝트 Spring JPA
- 스프링 세션
- 세션 기능을 편리하게 사용하도록 도와준다.
- 스프링 시큐리티
- 보안 관련
- 스프링 Rest Docs
- API문서화를 편리하게 해주는 것
- 스프링 배치
- 배치 처리에 특화된 기술
- 스프링 클라우드
- 클라우드 처리에 특화된 기술
핵심기술: 스프링 DI 컨테이너, AOP, 이벤트, 기타
웹 기술: 스프링 MVC, 스프링 WebFlux
데이터 접근 기술: 트랜잭션, JDBC, ORM 지원, XML지원
기술 통합: 캐시, 이메일, 원격접근, 스케줄링
테스트: 스프링 기반 테스트 지원
언어: 코틀린, 그루비
스프링을 편리하게 사용할 수 있도록 지원, 최근에는 기본으로 사용
- 단독으로 실행할 수 있는 스프링 애플리케이션을 쉽게 생성
- Tomcat같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨
> 빌드나 웹 실행 결과를 띄우는 거까지 전부 부트에서 처리가능 - 손쉬운 빌드 구성을 위한 starter 종속성 제공
- 스프링 3rd path(외부) 라이브러리 종속성 제공
> 외부 라이브러리(ex. JSON)와 맞는 버전을 알아서 지정 (최적화) - 메트릭, 상태 확인, 외부 구성 같은 프로덕션 준비 기능 제공
> 모니터링기능 제공 - 관례에 의한 간결한 설정
> 디폴트 설정, 매뉴얼 설정이 제공됨
스프링 부트는 스프링 프레임워크와 별도로 사용 가능한 것이 아님
스프링은 자바 언어 기반의 프레임워크로 자바 언어의 가장 큰 특징 = 객체 지향 언어
- 스프링은 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임워크
- 결론 스프링은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크
Object 객체
주변에 있는 사물이나 생명체 같은 모든 것
프로그래밍에서의 객체는 데이터의 분산을 막기 위해 데이터와 기능을 하나로 묶은 그룹이다.
ex) 컴퓨터 (PC) = 데이터 (본체, 모니터, 키보드, 마우스 스피커) + 기능 (화면제공, 소리, 입력, 출력 등)
프로그램을 그저 데이터와 처리방법으로 나누는 게 아니라, 프로그램을 다수의 ‘객체’를 만들고, 이들이 서로 상호작용을 통해 만들어지는 방식
컴퓨터 한 대를 완성하려면 CPU, RAM, SSD, POWER 등 여러가지 부품이 있어야 한다. 이 부품 하나하나들을 객체라고 생각하면 각 객체(부품)들의 역할이 나뉘어져 있고 사용하고자 하는 부분에서 작동을 하게 된다.
고장이 나더라도 해당 부품(객체)만 수리 및 교체를 하면 간단하게 해결할 수 있다. 즉 각각의 독립된 “객체”들의 그룹이며, 객체 간의 메시지를 주고받음으로서 쉽게 연결이 가능하다.
객체 지향 언어의 특징
- 캡슐화
데이터와 코드의 형태를 외부로부터 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐형태로 만드는 방법
- 상속
상위 클래스의 모든 걸 하위 클래스가 모두 이어받는 것.
- 다형성
상속과 연관이 있는 개념으로 한 객체가 다른 여러 형태(객체)로 재구성되는 것을 말한다.
대표적으로 자바의 ‘오버로드’ (동명의 매개변수만 다른 함수 만들기),
‘오버라이드’ (상속 관계에 있는 상위 클래스의 메서드를 하위 클래스에서 재정의 하기)
- 추상화
추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것
즉 실제로 존재하는 객체들을 프로그램으로 만들기 위한 “공통적인” 특성을 파악해서 필요 없는 특성을 제거하는 과정을 말한다.
객체 지향 언어의 장점
- 재사용성
상속을 통해 프로그래밍시 코드의 재사용을 높일 수 있음
- 유지보수의 우수성
프로그램 수정 시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기 때문에 유지보수가 쉬워서 매우 경제적이라 할 수 있다.
- 생산성 향상
잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상시킬 수 있음
- 자연적인 모델링
우리 일상생활의 모습의 구조가 객체에 자연스럽게 녹아 들어 있기 때문에 생각하는 것을 그대로 자연스럽게 구현할 수 있다.
참고 출처 : https://radait.tistory.com/4
유연하고, 변경이 용이하다.
다형성
컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법
좋은 객체 지향 설계의 5가지 원칙
(SOLID)
역할과 구현으로 세상을 구분
역할 : 인터페이스
구현 : 인터페이스를 구현한 것
예를들어 운전자 역할과 자동차 역할을 나눈다면
운전자는 자동차역할을 구현한 수많은 자동차로 차를 변경해도 운전할 수 있다.
운전자 역할은 자동차 역할 즉 자동차 인터페이스에 의존하고 있기 때문이다.
역할과 구현으로 세상을 구분하기 때문에
세상이 단순해지고, 유연해지며 변경도 편리해진다.
즉 클라이언트를 변경하지 않고 새로운 기능을 제공할 수 있다.
- 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
- 자동차의 구조를 몰라도 OK
- 클라이언트는 구현 대상의 내부 구조가 변경 되어도 영향을 받지 않는다.
- 경유차에서 전기차로 변경되어도 OK
- 클라이언트는 구현 대상 자체를 변경 해도 영향을 받지 않는다.
- 자동차 기종이 아반떼에서 포르쉐로 아예 바꾸어도 OK
- 객체를 설계할 때 역할과 구현을 명확히 분리
- 객체 설계시 인터페이스를 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기
혼자 있는 객체는 없다.
클라이언트 : 요청
서버 : 응답
수 많은 객체 클라이언트와 객체 서버는 서로 요청 응답을 주고 받으면서 협력관계를 가진다.
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
- 다형성의 본질을 이해하려면 협력이라는 객체 사이의 관계에서 시작해야 함
- 유연하고, 변경이 용이
- 확장 가능한 설계
- 클라이언트에 영향을 주지 않는 변경 가능
- 역할(인터페이스) 자체가 변하면, 클라이언트, 서버 모두에 큰 변경이 발생한다.
- 자동차가 비행기로 변경해야 할 경우 DEAD
다형성이 가장 중요하다!
스프링은 다형성을 극대화해서 이용할 수 있게 도와준다.
스프링에서 이야기하는 제어의 역전(IoC), 의존관계 주입(DI)은
다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
스프링을 사용하면 마치 레고 블럭 조립하듯이!
공연 무대의 배우를 선택하듯이!
구현을 편리하게 변경할 수 있다.
Gradle은 의존관계가 있는 라이브러리를 함께 다운로드 한다.
- spring-boot-starter-web
- spring-boot-stater-tomcat : 톰캣(웹서버)
- spring-webmvc : 스프링 웹 MVC
- spring-boot-stater-thymeleaf : 타임리프 템플릿 엔진(View)
- spring-boot-stater(공통) : 스프링 부트 + 스프링 코어 + 로깅
- spring-boot
- spring-core
- spring-boot-stater-logging
- logback, slf4j
- spring-boot
- spring-boot-starter-test
- junit : 테스트 프레임워크
- mockito : 목 라이브러리
- assertj : 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
- spring-test : 스프링 통합 테스트 지원