객체 지향 프로그래밍
여러가지 기술들의 모음
스프링 프레임워크
스프링 부트
스프링 데이터
스프링 세션
스프링 시큐리티
스프링 Rest Docs
스프링 배치
스프링 클라우드
핵심기술: 스프링 DI 컨테이너, AOP, 이벤트
스프링 부트는...
스프링을 쉽게 사용할 수 있도록 도와주는 기술입니다.
스프링 부트만으로는 서버를 만들 수 없어요
스프링 부트를 사용하면 자동으로 스프링까지 사용할 수 있게 가져오는것 뿐이에요
스프링은 자바 언어 기반의 프레임워크
자바의 가장 큰 특징 - 객체지향 언어
스프링은 객체 지향 언어가 가진 가장 강력한 특징을 살려내는 프레임워크 입니다.
스프링은 좋은 객체 지향 어플리케이션을 개발할 수 있게 도와주는 프레임워크
객체 지향의 특징
추상화
캡슐화
상속
다형성(Polymorphism)
운전자가 모닝을 타다가 BMW로 차를 바꿔 탔을 때, 운전자는 아무런 어려움 없이 운전 할 수 있습니다.
자동차에는 운전에 필요한 인터페이스가 모두 구현 되었기 때문에
내부 구조를 몰라도 운전자에게 영향을 주지 않습니다.
유연하고 변경이 용이합니다.클라이언트에게 영향을 주지 않고, 새로운 기능을 제공할 수 있습니다.
역할과 구현으로 나누었기 때문에
역할 = 인터페이스
구현 = 인터페이스를 구현한 클래스, 구현 객체
객체를 설계할 때 역할과 구현을 명확히 분리
객체 설계시 역할(인터페이스)를 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기
오버라이팅을 떠올려 보자
오버라이딩은 자바 기본 문법
오버라이딩 된 메서드가 실행
다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다.
물론 클래스 상속 관계도 다형성, 오버라이딩 적용 가능
인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
다형성의 본질을 이해하려면 협력이라는 객체 사이의 관게에서 시작해야 함
클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
실세계의 역할과 구현이라는 편리한 컨셉을 다형성을 통해 객체 세상으로 가져올 수 있음
유연하고, 변경이 용이
확장 가능한 설계
클라이언트에 영향을 주지 않는 변경 가능
인터페이스를 안정적으로 잘 설계하는 것이 중요
역할(인터페이스) 자체가 변하면, 클라이언트, 서버 모두에 큰 변경이 발생한다.
자동차를 비행기로 변경해야 한다면?
대본 자체가 변경된다면?
USB 인터페이스가 변경된다면?
SOLID 원칙: 글 참고
https://velog.io/@jhyeom1545/SOLID-좋은-객체-지향-설계의-5가지-원칙
객체 지향의 핵심은 다형성
다형성 만으로는 쉽게 부품을 갈아 끼우듯이 개발할 수 없다.
다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 함께 변경됨.
다형성 만으로는 OCP, DIP를 지킬 수 없다.
뭔가 더 필요하다.
스프링은 다음 기술로 다형성 + OCP, DIP를 가능하게 지원합니다.
DI(Dependency Injection): 의존관계, 의존성 주입
DI 컨테이너 제공
클라이언트의 코드 변경 없이 기능 확장
쉽게 부품을 교체하듯이 개발
객체지향의 사실과 오해
토비의 스프링
자바 ORM 표준 JPA 프로그래밍
Spring 강의
비지니스 요구사항과 설계