Spring, Java 🌵

스프링 핵심 원리 (객체 지향 설계 - 다형성, SOLID, DI컨테이너)

MAYMIN 2023. 6. 12. 17:58
728x90
SMALL

스프링 핵심 원리

- 객체 지향 설계

🍰 다형성

역할과 구현을 분리하는 방법
자바 언어에서 다형성 사용? → Interface로 역할을 만들고, Interface를 상속받은 구현 객체를 만든다.
이를 통해 역할과 구현을 분리한다!

객체 설계시, 역할 부분인 Interface를 먼저 설계하고, 이 역할을 수행할 구현 객체인 class 만들기.


Car 라는 자동차의 기능을 하는 Interface가 있으면

client는 

Car에 명시된 역할이 무엇인지 (시동걸기, 브레이크 / 악셀 법, 전진, 후진,,,,등등) 만 알면

Genesis, Hyundai, Kia 차 구현 객체 class들을 사용 할 수 있다. 

[새 차가 나와도 운전자인 client는 새로운 자동차들을 운전 할 수 있다.]



🍰 SOLID [OCP, DIP] 

좋은 객체 지향 설계의 5가지 원칙 (SRP, OCP, LSP, ISP, DIP)의 앞 글자를 딴 용어 by 로버트 마틴

OCP(Open/Closed Principle), 개방 폐쇄 원칙
DIP(Dependency inversion principle), 의존 관계 역전 원칙

🍭 OCP (Open/Closed Principle) 개방 폐쇄 원칙

소프트웨어 기존 코드를 변경하지 않고, 기능을 추가 할 수 있도록 설계되어야 한다는 원칙


코드 확장에는 열려있으나(Open), 변경에는 닫혀(Closed) 있어야 한다 !


Interface 안에 필요한 기능들을 작성하고,
이 Interface를 구현하는 구현 객체 class를 통해 새로운 기능을 확장 할 수 있다.
→ 역할과 구현을 분리하기!!!!!

Interface의 코드는 변경하지 않고, 새로운 구현 객체 Class 들로 기능 확장하기!

🍭 DIP(Dependency Inversion Principle), 의존 관계 역전 원칙

구현 객체 Class를 직접 참조 하는것이 아니라, 그 Class의 상위 요소인 추상클래스 or Interface 를 참조한다는 원칙

구현체에 의존하지 말고, 인터페이스에 의존해라!
⇒ OCP는 인터페이스랑 구현 클래스에 동시에 의존함. 

즉, DIP를 위반한다.
객체 지향 설계 핵심은 다형성이지만, 다형성 만으로는 OCP, DIP를 위배한다.

그래서!
Spring이 지원하는 의존성주입 DI과 , DI 컨테이너를 이용하여 자바 객체 의존성을 연동해준다.



🍰 DI 컨테이너

DI ? Dependency Injection으로 의존성 주입 (의존관계주입)

이것으로 다형성 + OCP, DIP를 가능하게 함

각 Class간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것

DI 컨테이너 → 의존 관계 주입을 대신해줌 ! 객체를 생성하고 관리하면서 의존 관계를 연결


DI 유형

- Setter Inection (Setter 메서드를 이용하여 의존성 삽입)
- Constructor Injection (생성자를 이용하여 의존성 삽입)
- Method Injection (일반 메서드를 이용하여 의존성 삽입)

 


이는 Constructor Injection예시

public class Controller {
...
public Controller(Service service) {
            this.service= service
        }
        ...
}



🍭 의존성 주입과 관련된 Annotation

@Autowired 

- 기본적인 의존성 주입 어노테이션
- 기본적으로 등록되어있는 Bean 중에서 변수 타입이 일치하는 Bean을 찾아서 주입

@Qualifier

- 사용할 의존 객체를 선택해줌. 의존성 주입의 대상이 되는 특정 객체를 찾고, 조건에 만족하는 객체에 의존성을 주입

@Resource

- 객체 **name**을 통해 Bean을 찾아 주입한다. (Java 에서 제공하는 어노테이션)

@Inject

- 생성자, 메서드, 멤버변수 위에 모두 사용 가능(Java 에서 제공하는 어노테이션)

728x90
LIST