0. 들어가며
- 객체 지향 프로그래밍
- 스프링의 핵심 개념
스프링의 핵심 개념을 알아보기 앞서, 객체 지향 프로그래밍에 대해 알아두어야한다. 스프링은 자바 기반으로 이루어진 프레임워크이며, 자바는 객체 지향 언어이기 때문이다.
스프링 부트
- 스프링을 편리하게 사용할 수 있도록 지원
- 단독으로 스프링 애플리케이션을 쉽게 생성(Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치 안 해도 된다)
- 스프링과 외부 라이브러리 자동 구성 (버전까지)
- 운영환경에서 모니터링을 기본적으로 제공
❕ TMI ❕
개인적으로 스프링 부트 시작전에 그래도 순수 스프링을 해본다고 환경구성을 했는데 시간을 많이 썻다.. 스프링 부트는 자동으로 해줘서 환경 구성이 빠르게 끝난다.
1. 객체 지향 프로그래밍
객체가 주된 관심인 방법론
객체 지향 프로그래밍(Object Oriented Programming)
객체 지향 프로그래밍은, 컴퓨터 방법론 중 하나로, 필요한 데이터를 추상화해 상태와 행위를 가진 객체를 만들어 각각의 객체들이 메시지를 주고 받으며(객체들 간의 유기적인 상호작용) 데이터를 처리하는 프로그래밍 방법론이다.
즉, 객체가 주된 관심인 방법론으로서 프로그램을 유연하고 변경이 용이하게 돕는다.
객체 지향 프로그래밍에서의 '객체'와 어떻게 프로그램이 유연하고 변경이 쉽게 되도록 하는지는, 객체 지향 원리와 객체 지향 설계의 5가치 원칙을 알아야한다.
객체 지향의 원리
- 추상화
- 캡슐화
- 일반화 관계
- 다형성
❔❓ 자바 언어는 다형성을 어떻게 구현했나?
오버라이딩으로 상위 클래스가 가지고 있는 메서드를 하위 클래서가 재정의해서 사용한다.
인터페이스를 구현한 객체를 실행 시점에 유연하게 변경한다.
좋은 객체 지향 설계의 5가지 원칙(SOLID)
(1) SRP 단일 책임 원칙
- 한 클래스는 하나의 책임만 가져야 한다.
- 중요한 기준은 변경이다. 변경이 있을 때, 파급 효과가 적어야 한다. (EX: UI 변경, 객체의 생성과 사용을 분리)
(2) OCP 개방 - 폐쇄 원칙
- 소프트웨어 요소는 확장 열려 있으나, 변경에 닫혀 있어야 한다
- 다형성을 활용해 인터페이스를 구현한 새로운 클래스를 하나 만들어 새로운 기능을 구현한다.
(3) LSP - 리스 코프 치환 원칙
- 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
ex. 자동차 인터페이스 엑셀은 앞으로 가라는 기능 (뒤로 가게 구현하면 위반)
(4) ISP 인터페이스 분리 원칙
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
ex. 자동차 인터페이스 -> 운전 인터페이스, 정리 인터페이스로 분리/ 운전자 클라이언트, 정비사 클라이언트로 분리
ex. 분리하면 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않는다.
(5) DIP 의존관계 역전
- 프로그래머는 추상화에 의존해야지 구체화에 의존하면 안된다
- 구현 클래스에 의존하지 말고, 인터페이스에 의존
- 역할에 의존하라!
2. 스프링의 핵심 개념
좋은 객체 지향 애플리케이션을 개발할 수 있게 하는 프레임워크
스프링과 객체 지향
스프링은 객체 지향의 원리를 활용해 프로그램이 유연해지게 돕는다. 스프링의 제어와 역전(IoC)와 의존 관계 주입(DI)는 객체지향 원리 중 다형성을 활용해 역할(인터페이스)와 구현(인터페이스를 구현한 실제 클래스)를 편리하게 다룰 수 있도록 지원한다.
유연하고 변경에 유연한 다형성이 가장 중요하다, 스프링의 제어의 역전 (IoC), 의존 관계 주입(DI)은 다형성을 활용해 역할(인터페이스)과 구현(인터페이스를 구현한 실제 클래스)을 편리하게 다룰 수 있도록 지원한다.
정리)
- 객체 지향의 핵심은 다형성
- 다형성 만으로는 쉽게 부품을 갈아 끼우듯이 개발할 수 없고, 코드도 함께 변경된다. 객체 지향의 OCP, DIP원리를 지킬 수 없다.
REFERENCE
인프런 - 스프링 핵심 원리 (김영한님) 강의를 듣고 정리한 내용입니당
'공부 > Spring 핵심 원리' 카테고리의 다른 글
컴포넌트 스캔으로 의존 관계를 자동 주입해보자. (0) | 2021.08.31 |
---|---|
싱글톤 패턴을 보장해주는 스프링 컨테이너와 @Configuration (0) | 2021.08.29 |
스프링 컨테이너와 스프링 빈, 등록 된 빈들을 조회 해보자 (0) | 2021.08.16 |
스프링과 핵심 원리 - 순수 자바 예제로 객체 지향 원리를 적용과 스프링으로 전환해보기 (0) | 2021.08.14 |
스프링과 핵심 원리 - 순수 자바 예제로 객체 지향으로 설계해보자 (0) | 2021.08.14 |