스프링 핵심 원리 - 기본편 (1)
<스프링 핵심 원리 - 기본편>
- 인프런 김영한님 강의 필기
객체 지향 설계와 스프링
- 이야기 - 자바 진영의 추운 겨울과 스프링의 탄생
- 스프링이란?
- 좋은 객체 지향 프로그래밍이란?
- 좋은 객체 지향 설계의 5가지 원칙(SOLID)
- 객체 지향 설계와 스프링
1. 이야기 - 자바 진영의 추운 겨울과 스프링의 탄생
- 2000년대 초반 자바당 정파 기술 - EJB (Enterprise Java Beans)
- 당시 오픈소스는 사파 기술.. 기존 시스템에 새로 도입하기에 리스크가 있었음
- 그러나 EJB는 굉장히 복잡하고 의존적으로 코딩하게 되어 객체지향 설계의 장점을 잃어버림
- 2002년 로드 존슨이 30000줄짜리 스프링 시초 코드 들어있는 책 출간
- 유겐 휠러, 얀 카로프 등 사람들이 로드 존슨 찾아가서 오픈소스 프로젝트 제안
스프링 역사
- 2003년 스프링 프레임워크 1.0 - XML
- 2006년 스프링 프레임워크 2.0 - XML 편의기능 지원
- 2009년 스프링 프레임워크 3.0 - 자바 코드로 설정
- 2013년 스프링 프레임워크 4.0 - 자바8
- 2014년 스프링 부트 1.0
- 2017년 스프링 프레임워크 5.0, 스프링 부트 2.0 - 리엑티브 프로그래밍 지원
- 2022년 현재 버전 업그레이드 진행중..
2. 스프링이란?
- 스프링은 자바 기반의 오픈 소스 프레임워크
- 웹 어플리케이션을 만들기 위한 여러 가지 기능을 제공
스프링 프레임워크
- 핵심 기술: 스프링 DI 컨테이너, AOP, 이벤트, 기타
- 웹 기술: 스프링 MVC, 스프링 WebFlux
- 데이터 접근 기술: 트랜잭션, JDBC, ORM 지원, XML 지원
- 기술 통합: 캐시, 이메일, 원격접근, 스케줄링
- 테스트: 스프링 기반 테스트 지원
- 언어: 자바, 코틀린, 그루비 지원
- +) 최근에는 스프링 부트를 통해서 스프링 프레임워크 기술들을 편리하게 사용중
스프링 부트
- 스프링 프레임워크를 편리하게 사용할 수 있도록 지원, 최근에는 디폴트로 사용
- 단독으로 실행 가능한 스프링 애플리케이션을 쉽게 생성
- Tomcat 같은 웹 서버를 내장해서 별도로 웹 서버를 설치하지 않아도 됨
- 손쉬운 빌드 구성을 위한 starter 종속성 제공
- 스프링과 3rd party(외부) 라이브러리 자동 구성
- 메트릭, 상태 확인, 외부 구성 같은 프로덕션 준비 기능 제공
- 관례에 의한 간결한 설정
스프링 진짜 핵심 ★★★★★
- 스프링은 자바 언어가 가진 객체 지향적 특징을 가장 잘 활용할 수 있게 도와주는 프레임워크
- 스프링을 통해 좋은 객체 지향 어플리케이션을 개발할 수 있다.
3. 좋은 객체 지향 프로그래밍이란?
객체 지향 프로그래밍
- 프로그램이 독립된 객체들의 조합이라는 개념을 도입하여 프로그래밍하는 방법론
- 각각의 객체는 메시지를 주고받으며 데이터 처리에 협력 가능
- 프로그램 구조 변경이 쉬워져 대규모 소프트웨어 개발에 많이 사용
- 객체 지향 특징 - 캡, 추, 상, 다
다형성
- 역할 / 구현으로 세상을 구분
- 역할이 정해지면 누가 구현체로 들어오든 문제 없음, ex) 운전자-자동차, 로미오-줄리엣
자바 언어의 다형성
- 역할 = 인터페이스
- 구현 = 인터페이스를 구현한 클래스
- 객체 설계 시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 객체 만들기
- 오버라이딩 - 부모 클래스의 메서드를 자식 클래스에서 재정의 가능
- 다형성으로 인터페이스 구현한 객체를 실행 시점에 변경 가능, 오버라이딩 메서드 사용
- 즉, 클라이언트 변경 없이 서버의 구현 기능을 유연하게 변경 가능
스프링과 객체 지향
- 다형성이 가장 중요
- 스프링은 다형성을 극대화해서 이용할 수 있게 도와준다.
- 스프링의 IoC, DI 는 다형성을 활용해서 역할과 구현을 편리하게 다룰 수 있도록 지원한다.
4. 좋은 객체 지향 설계의 5가지 원칙 (SOLID)
- SOLID - 클린 코드를 위한 5가지 설계 원칙
- SRP, OCP, LSP, ISP, DIP
(1) SRP 단일 책임 원칙 (Single Responsibility Principle)
- 한 클래스는 하나의 책임만 가져야 한다.
- 클래스 변경이 있을 때 파급효과가 적을수록 잘 지켜진 것
(2) OCP 개방 폐쇄 원칙 (Open Closed Principle)
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- 인터페이스에 구현체를 계속 추가하는 구조로 기존 코드 변경 없이 확장 가능
- ex) 서비스가 리포지토리 구현 클래스 직접 선택 시, 코드 변경이 발생하므로 OCP 위반
-> 객체를 생성하고 연관관계를 맺어주는 별도의 설정자 필요 (Spring)
public class MemberService {
// MemberRepository m = new MemoryMemberRepository(); // 기존 코드
MemberRepository m = new JdbcMemberRepository(); // 변경 코드
}
(3) LSP 리스코프 치환 법칙 (Liskov Substitution Principle)
- 구현체는 인터페이스의 규약을 깨뜨리지 않아야 한다.
- ex) 자동차 인터페이스에서 엑셀은 앞으로 가는 기능, 뒤로 가게 구현하면 LSP 위반
(4) ISP 인터페이스 분리 원칙 (Interface Segregation Principle)
- 특정 클라이언트를 위한 인터페이스 여러 개가 하나의 범용 인터페이스보다 낫다.
- 자동차 인터페이스 - 운전, 정비로 나누면
- 사용자 인터페이스 - 운전자, 정비사로 나눌 수 있음
- 인터페이스가 변해도 구현체에 영향을 주지않으므로 인터페이스 대체가 더 용이해짐
(5) DIP 의존관계 역전 원칙 (Dependency Inversion Principle)
- 구현 클래스(구현체)에 의존하지 말고 인터페이스에 의존해야 한다.
- ex) 운전자 클라이언트는 자동차 구현체 아반떼, k3에 상관없이 자동차 인터페이스 사용 가능하다.
- ex) 서비스가 리포지토리 구현 클래스 직접 선택 시, 구현체에 의존하게 되므로 DIP 위반
public class MemberService {
// MemberRepository m = new MemoryMemberRepository();
MemberRepository m = new JdbcMemberRepository();
// 코드 그냥 사용만 해도 바뀔 때 영향받으므로 의존 관계임
}
객체 지향 설계 원칙 정리
- 객체 지향의 핵심은 다형성
- 다형성을 이용해 인터페이스와 구현체 만들었지만, 구현체 변경 시 클라이언트 코드도 함께 변경된다.
- OCP, DIP를 지키기 위해서 별도의 설정자가 필요하다.
5. 객체 지향 설계와 스프링
스프링 DI, DI 컨테이너
- 스프링은 다음 기술로 다형성 + OCP, DIP를 가능하게 지원
- DI - 의존관계, 의존성 주입
- DI 컨테이너 제공
- 클라이언트 코드의 변경 없이 기능 확장 가능
- 애플리케이션 설계도 공연을 설계하듯이 배역만 만들어두고 배우는 언제든지 변경할 수 있도록 만드는 것이 좋은 객체지향 설계
- 이상적으로는 모든 설계에 인터페이스를 부여하자.
실무 고민
- 모든 곳에 인터페이스를 도입하면 베스트지만, 이것도 하나하나 일이 됨
- 기능 확장 가능성이 없다면 일단 구현 클래스를 직접 사용하고, 향후 꼭 필요할 때 리팩터링해서 인터페이스 도입하는 것도 방법
책 추천
- 객체지향 책 - 객체지향의 사실과 오해
- 스프링 책 - 토비의 스프링
- JPA 책 - 자바 ORM 표준 JPA 프로그래밍
Author And Source
이 문제에 관하여(스프링 핵심 원리 - 기본편 (1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sunshine0070/스프링-핵심-원리-기본편-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)