스프링 핵심 원리
- 객체 지향 설계
🍰 다형성
역할과 구현을 분리하는 방법
자바 언어에서 다형성 사용? → 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 에서 제공하는 어노테이션)
'Spring, Java 🌵' 카테고리의 다른 글
WebFlux 개념 (알아보기) (0) | 2024.06.16 |
---|---|
동시요청 (멀티 쓰레드) , 쓰레드 풀이란 (2) | 2024.06.16 |
서블릿 HttpServletRequest, HttpServletResponse 차이점 (2) | 2024.06.16 |
throws 와 throw new 차이점 (0) | 2024.06.01 |
Spring 에서의 예외처리 방법 @ControllerAdvice와 @ExceptionHandler (0) | 2024.06.01 |