섹션 1 - 객체 지향 설계와 스프링
스프링이란?
- 자바 기반의 프레임워크로 좋은 객체 지향 프로그래밍을 할 수 있도록 도와준다.
- 이름의 유래는 이전에 기술의 복잡도가 증가해서 성능이 느렸던 시절을 "겨울"에 빗대어 겨울 후의 "봄"으로 새로운 시작한다는 것을 의미하는 스프링(봄)이 되었다고 한다.
스프링 부트란?
- 스프링 프레임워크 및 관련 스프링 라이브러리를 편리하게 사용할 수 있도록 지원한다.
- 별도의 웹 서버를 설치하지 않아도 되며 관례에 의한 간결한 설정이 가능하다.
객체 지향 프로그래밍이란?
- 객체는 메시지를 주고 받으며 협력한다.
- 유연하고 변경에 용이하다.
객체 지향 프로그래밍의 특성 중 다형성이란?
- 특징
- 역할(인터페이스)과 구현(구현 클래스)을 분리한다.
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
- 설계시 역할을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만든다.
- 한계
- 인터페이스가 변하면, 클라이언트 및 서버 모두 큰 변경이 발생한다.
- 인터페이스를 안정적으로 잘 설계하는 것이 중요하다.
좋은 객체 지향 설계의 5가지 원칙(SOLID)
SRP 단일 책임 원칙
- 한 클래스는 하나의 책임만 가진다.
- 변경에 따른 파급력을 최소화한다.
OCP 개방-폐쇠 원칙
- 확장에는 열려있지만 변경에는 닫혀있다.
- 다형성을 활용하여 인터페이스의 구현 클래스를 추가한다.
LSP 리스코프 치환 원칙
- 컴파일뿐만 아니라 프로그램의 기능을 변경하지 않으면서 하위 타입의 인스턴스로 변경이 가능하다.
ISP 인터페이스 분리 원칙
- 각 역할에 맞게 여러 개의 인터페이스로 분리하여 재사용성을 높인다.
DIP 의존관계 역전 원칙
- 추상화(인터페이스)에 의존하며 구체화(구현 클래스)에 의존하지 않는다.
실무 고민
- 추상화를 하기 위한 추가 비용이 발생할 수 있다.
- 기능을 확장할 가능성이 없다면 후에 꼭 필요할때 인터페이스를 도입하는 것도 방법이다.
섹션 2 - 예제 만들기
다음 3가지를 통해 비즈니스 요구사항을 설계할 수 있다.
1. 기획자도 알아볼 수 있는 도메인 협력 관계
2. 협력 관계를 바탕으로 개발자가 구체화해서 만들어낸 클래스 다이어그램
- 정적인 클래스 의존관계로 실제 어떤 객체가 주입될 지 알 수 없다.
3. 동적인 클래스 의존관계로 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존 관계를 표현하는 객체 다이어그램
전역 변수를 사용할 Map은 동시성 이슈로 문제가 발생할 수 있으므로 ConcurrentHashMap을 사용한다.
객체의 속성을 확인해보고 싶을때는 toString() 함수를 이용한다.
하지만 애플리케이션 로직으로 테스트하는 것은 좋은 방식이 아니다.
given + when + then 을 통한 JUnit 테스트를 사용한다.
섹션 3 - 객체 지향 원리 적용
변경 전
인터페이스 뿐만 아니라 구체 클래스도 의존하고 있다.
-> DIP 위반
새로운 할인 정책을 적용하려면 구현체도 함께 변경해야 한다.
-> OCP 위반
변경 후
인터페이스에만 의존하도록 코드 변경
-> DIP 만족
단일 책임 원칙을 따르면서 관심사를 분리
-> 구현 객체를 생성하고 연결하는 책임을 갖는 별도의 클래스를 생성한다.
-> 이를 통해 기존의 클라이언트 객체는 자신의 역할에 집중할 수 있다.
특정 기능을 교체하기 위해 사용 영역(클라이언트)의 코드는 변경할 필요 없이 구성 영역만 변경하면 된다.
-> OCP 만족
AppConfig를 통해 애플리케이션의 사용 영역과 객체를 생성하고 구성하는 영역으로 분리하였다.
-> SRP 만족
제어의 역전 IOC(Inversion of Control)
: 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것
의존관계 주입 DI(Dependency Injection)
: 정적인 클래스 의존 관계와, 실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계로
외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결 되는 것
IOC 컨테이너, DI 컨테이너
: 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것
'WINK-(Web & App) > Spring Boot 스터디' 카테고리의 다른 글
[2024 Spring Boot 스터디] 황수민 #2 주차 3~4장 (0) | 2024.05.19 |
---|---|
[2024 Spring Boot 스터디] 김호 #1 주차 - Spring Boot 3 알아보기 (0 ~ 2장) (0) | 2024.05.14 |
[2024 Spring Boot 스터디] 남윤찬#1 주차 - 1~3 섹션 (0) | 2024.05.12 |
[2024 Spring Boot 스터디] 정호용 #1 주차 - 0~2장 Spring Boot와 친해지기 (0) | 2024.05.11 |
[2024 Spring Boot 스터디] 정성원 #1 주차 - 객체 지향 설계와 Spring (0) | 2024.05.11 |