본문 바로가기
Spring

스프링 핵심 원리 기본편 - 챕터 1,2

by mingutistory 2023. 3. 5.
728x90

Chapter 1. 객체 지향 설계와 스프링

스프링이란?

자바 언어 기반의 프레임워크

좋은 객체 지향 애플리케이션을 개발 할 수 있게 도와주는 역할을 함

 

스프링부트는 스프링 프레임워크를 편리하게 사용할 수 있도록 지원함. 단독으로 실행할 수 있는 스프링 애플리케이션을 웹 서버를 내장하여 사용 할 수 있게 함.

 

 

좋은 객체 지향 프로그래밍이란?

유연하고 변경이 용이하게 만든다 => 다형성

역할(인터페이스) 구현(객체)로 세상을 구분함으로써 유연하고, 변경이 편리하게 구현 할 수 있음.

 

클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경 가능함.

인터페이스를 안정적으로 잘 설계하는 것이 필요함

 

스프링은 다형성을 극대화 하도록 도와준다.

 

 

좋은 객체 지향 설계의 5가지 원칙 (SOLID)

SRP: 단일 책임 원칙

하나의 클래스는 하나의 책임만 가져야 한다. 

=> 변경이 있을 때 파급 효과가 적어야 한다.

 

OCP: 개방-폐쇄 원칙

확장에는 열려있으나 변경에는 닫혀 있어야 한다 => 다형성

역할과 구현의 분리를 통해 지킬 수 있다.

 

LSP: 리스코프 치환 원칙

하위 클래스는 인터페이스 규약을 다 지켜야 한다. 

컴파일 성공하는 것을 넘어서 기능적으로 보장을 해줘야 한다.

 

ISP: 인터페이스 분리 원칙

명확한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.

서로 영향을 적게 줄 수 있기 때문에 인터페이스가 명확해지고, 대체 가능성이 높아진다.

 

DIP: 의존관계 역전 원칙

"추상화에 의존하고 구체화에 의존하면 안됨"

구현 클래스에 의존하지 말고 인터페이스에 의존해야 함

역할에 의존하게 해야 유연하게 구현체를 변경 가능함

ex: 운전자 - 자동차(K3, 테슬라, 벤츠)의 관계에서 운전자의 경우에 자동차의 기능만 알아야 하지 특정 자동차의 기능에 대해서 너무 세세하게 알아버리면 안된다.

 

 

public class MemberService {
	// MemberService(Client)가 구현 클래스에 의존하고 있음. 직접 선택하고 있기 때문 => DIP 위반
	private MemberRepository memberRepository = new MemoryMemberRepository();
}

 

객체 지향 설계와 스프링

스프링은 DI(Dependency Injection)을 통하여 의존관계, 의존성을 주입함으로써 다형성 + OCP, DIP 원칙을 지킬 수 있게 도와준다.

 

 

Chapter 2. 스프링 핵심 원리 이해1 - 예제 만들기

프로젝트 생성

강의에서 자바 11을 쓰고 있어서 다운 받고 스프링 3.0.4가 안정 버전이려고 돌리려고 했는데 오류가 계속 났다. 

검색 해보니 스프링 3.x 버전부터는 자바 17 이상이 필수 인지 확인 필요함.

버전 바꿔줘도 인텔리제이가 계속 안 돌아서 확인해보니 Gradle JVM도 17 이상으로 변경이 필요했다.

 

비즈니스 요구사항과 설계

인터페이스를 만들고 구현체를 언제든지 갈아끼울 수 있도록 설계하자.

 

회원 도메인 설계/개발

회원 데이터는 자체 DB를 구축 할 수 있고, 외부 시스템과도 연동 할 수 있다. (변경이 생기는 부분) -> 이 부분을 회원 저장소라는 인터페이스로 만들고 구현 클래스로 갈아 끼우면서 사용한다고 생각한다.

 

회원 도메인 협력 관계,

회원 클래스 다이어그램,

회원 객체 다이어 그램(실제 클라이언트가 사용되는 모습)

=> 현재 구현은 OCP, DIP 위반 중

 

주문과 할인 도메인 설계/개발

주문 도메인 협력, 역할, 책임

주문 도메인 전체

주문 도메인 클래스 다이어그램,

주문 도메인 객체 다이어그램

 

협력 관계를 그대로 재사용 할 수 있다.

 

 

 

객체 지향의 사실과 오해

토비의 스프링

 

 

출처: 인프런 - 김영한 스프링 핵심 원리 기본편

300x250

댓글