728x90
1.객체지향설계와 스프링
- 목차
- 1.자바진영의 추운겨울과 스프링의 탄생
- 2.스프링이란?
- 3.좋은 객체 지향 프로그래밍이란?
- 4.좋은 객체지향 설계의 5가지 원칙
- 5.객체지향 설계와 스프링
1.자바진영의 추운겨울과 스프링의 탄생
EJB
- 자바진영의 표준기술
- 가격이 비쌈..
- 진짜 어렵고 복잡하고 느리다
스프링
- EJB 컨테이너 대체
- 단순함의 승리
- 현재 사실상 표준기술
하이버네이트
- EJB 엔티티빈 기술을 대체
- JPA 새로운 표준정의
스프링의 역사
- 2002년 로드존슨 책 출간 (EJB의 문제점 지적) 스프링의 핵심개념과 기반코드가 들어있다
- 유겐힐러 와 얀카로프가 로드존슨에게 오픈소스 프로젝트를 제안
- 2003년 스프링 프레임워크 출시 XML로 설정
- 2014년 스프링부트 출시
2.스프링이란?
스프링의 핵심
- 자바언어의 큰특징인 객체지향언어
- 스프링은 객체지향언어가 가진 특징을 살려낸 프레임워크
- 프레임워크 : 일정하게 짜여진 틀,뼈대를 가지고 일을하다
- 스프링은 좋은 객체지향 애플리케이션을 개발할수있도록 도와주는 프레임워크
스프링부트
- Tomcat 같은 웹서버를 내장해서 별도의 웹서버 설치 안해도 된다
- 스프링과 외부라이브러리 자동구성
- 단독으로 실행가능한 스프링 애플리케이션 생성
- start 종속성 제공
- 매트리그,상태확인,외부구성같은 프로덕션 준비기능제공 (모니터링)
3.좋은 객체 지향 프로그래밍이란?
객체지향의 특징
- 추상화 , 캡슐화 , 상속 , 다형성
- 객체들의 모임으로 파악 각각의 객체는 메시지를 주고받고 데이터를 처리
- 프로그램을 유연하고 변경이 용이하게 만들어서 대규모 소프트웨어 개발에 많이사용
- 컴퓨터 부품을 갈아 끼우듯이 , 키보스 마우스를 갈아 끼우듯이
다형성의 실세계비유
- 역할과 구현으로 구분
- 운전자 - 자동차(k3 , 아반떼, 테슬라)
- 자동차 - 인터페이스(역할)
- K3,아반떼,테슬라 - 구현클래스(구현)
- 클라이언트에 영향을 주지않고 바꿀수 있다
- 공연무대 , 정렬알고리즘 , 할인정책 , 키보드마우스..
역할과 구현을 분리
- 역할과 구현으로 분리되면 단순해지고 유연해지며 변경도 편리해진다
- 클라이언트는 역할(인터페이스) 만 알면된다
- 클라이언트는 구현을 몰라도 되서 내부구조가 변경되도 영향을 안받는다
자바언어
-
역할 = 인터페이스
-
구현 = 구현객체 (인터페이스를 구현한 클래스)
-
객체설계시 역할을 먼저 부여 -> 역할을 수행하는 객체만듬
-
오버라이딩!!
-
service (save) -> Repository(save) -> MemoryMemberRepository(save) , JdbcMemberRepository(save)
-
MemoryMemberRepository(save) , JdbcMemberRepository(save) 둘중 하나의 기능을 넣을수 있다
-
다형성은 클라이언트를 변경하지않고 서버의 구현기능을 유연하게 변경할수 있다
정리
- 다형성을 통해서 유연하고 변경이 용이
- 확장가능한 설계를 할수 있다
- 클라이언트에는 영향을 안준다
인터페이스를 안정적으로 잘설계하는것이 중요하다
스프링과 객체지향
- 다형성이 중요
- 스프링은 다형성을 극대화 해준다
- 스프링에서는 제어의 역전(IoC), 의존관계 주입(DI) 은 다형성을 활용해서 역할과 구현을 편리하게 다룰수 있도록 지원
4.좋은 객체지향 설계의 5가지 원칙
SOLID (클린코드)
- SRP:단일책임원칙
- OCP:개방폐쇄원칙
- LSP:리스코프치환원칙
- ISP:인터페이스분리원칙
- DIP:의존관계역전원칙
SRP:단일책임원칙
- 한클래스에는 하나의 책임을 가져야한다
- 중요한기준은 변경 - 변경이 있을때 파급효과가 적으면 단일 책임원칙을 따른것
OCP:개방폐쇄원칙
- 소프트웨어 요소는 확장에 열려있으나 변경에는 닫혀야 한다
- 다형성을 활용해서 인터페이스로 역할을 만들고 새로운 구현클래스를 만들어서 기능을 구현
- 역할과 구현을 분리하는것!
- 문제점
- 다형성을 사용했지만 OCP 원칙을 지킬수 없다
- 구현객체를 변경하려면 클라이언트 코드도 변경되어야 한다...
LSP:리스코프치환원칙
- 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위타입의 인스턴스로 바꿀수 있어야한다
- 다형성에서는 하위클래스는 인터페이스 규약을 다지켜야한다는것
- 인터페이스를 구현한 구현체는 믿고 사용하려면 이원칙이 필요하다
- ex) 자동차 인터페이스의 악셀은 앞으로 가능기능 , 뒤로가게 구현하면 LSP 위반이다..
ISP:인터페이스분리원칙
- 특정클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나 보다 낫다
- 인터페이스가 명확해지고 대체가능성이 높아진다
DIP:의존관계역전원칙
- 추상화에 의존해야지 구체화에 의존하면 안된다 (의존성 주입은 이원칙을 따른다)
- 인터페이스를 의존하기
- 역할에 의존하기
- 문제점
- 인터페이스도 의존하지만 구현클래도 동시에 의존해서 DIP 에 위반된다
정리
- 인터페이스도 의존하지만 구현클래도 동시에 의존해서 DIP 에 위반된다
- 객체지향의 핵심은 다형성
- 다형성만으로는 OCP 와 DIP 를 지킬수 없다..
5.객체지향 설계와 스프링
스프링
- 스프링은 다형성 + OCP + DIP 를 가능하게 지원해준다 (DI)
- DI : 의존관계,의존성을 주입
- DI 컨테이너 제공
- 클라이언트 코드의 변경없이 기능 확장
정리
- 모든설계는 역할과 구현을 분리
- 유연하고 변경이 가능할수 있도록 만드는것이 좋은 객체지향 설계
- 모든설계에는 인터페이스를 부여하자
- 인터페이스를 도입하면 추상화 비용이 발생(기능을 확장할 가능성이 없다면 구체클래스 -> 리팩터링해서 인터페이스 도입)
참고
728x90
'Back-End > Spring' 카테고리의 다른 글
3.스프링 핵심 원리 이해2 - 객체지향원리적용 (0) | 2021.01.01 |
---|---|
2.스프링 핵심 원리 이해1 - 예제만들기 (0) | 2020.12.31 |
7.AOP (0) | 2020.12.29 |
6.스프링 DB접근기술 (0) | 2020.12.29 |
5.순수 JDBC 접근기술 (0) | 2020.12.28 |