왜 ? 생겼는가
원래는 EJB쓰다가 EJB가 객체 지향 특징을 아주 망쳐놨었다고 한다.
그럼 좋은 객체 지향 프로그래밍은 뭘까?
새로운 기능이 추가되어도 클라이언트를 바꿀 필요가 없다.
다형성이 왜 중요한가?
!역할과 구현을 분리 했기 때문이다.
역할 = 인터페이스
구현 = 인터페이스를 구현한 클래스
좋은 객체 지향 설계의 5가지 원칙 솔리드(SOLID)
- SPR- Single Responsibilty Principle 단일 책임 원칙
하나의 클래스는 하나의 책임만 가진다.
변경이 있을 때, 파급 효과가 적으면 단일 원칙을 잘 지키는 것이다.
- OCP- Open/Closed Principle 개방/폐쇄 원칙
소프트웨어는 확장에는 열려 있으나 변경에는 닫혀있어야 한다.
이를 이행할려면 다형성만으로는 불가능하다.
별도의 조립자가 필요한데, 이 조립자가 바로 Spring이다.
- LSP- Liskov Substitution Principle 리스코프 치환 원칙
객체는 프로그램의 정확성을 지키면서 하위 타입 인스턴스로 바꿀 수 있어야 한다.
악셀을 구현했는데 차가 뒤로 간다면? 이것을 지키지 않은 것이다.
느리더라도 앞으로 가야 리스코프 원칙을 지킨 것이다.
- ISP- Interface segregation Principle 인터페이스 분리 원칙
특정 클라이언트를 위한 여러 개의 인터페이스로 작게 작게 나누는게 좋다.
- DIP- Dependency Inversion Principle 의존관계 역전 원칙
제일 중요하다. 역할에 의존해야 한다. 클라이언트가 인터페이스에 의존해야지 구현체에 의존하면 안된다. 근데 여기서도 Spring이 필요하다.
ApplicationContext?
BeanFactory의 모든 기능을 상속받아서 제공하는
고마운 스프링의 핵심기능이다. 빈을 관리, 빈을 검색
뿐만 아니라
MessageSource(국제화 기능)
EnvironmentCapable(환경 변수)
ApplicationEventPublish(애플리케이션 이벤트)
ResourceLoader("편리한 리소스 조회)
라는 부가기능을 갖고 있음.
*의존관계 주입의 4가지 방법
생성자 주입 = 불변 필수 값에 주로 사용된다.
근데 생성자가 한 개가 있으면 Autowired를 생략해도 된다.
수정자 주입(setter)
필드 주입 필드에 Autowired하나만 붙여주면 된다.
아주 쉽지만 외부에서 변경이 불가능해서 테스트하기 어렵다.
쓰면 안됌 !!!
근데 test 코드나 configuration같은 곳에서는 사용함.
일반 메서드 주입
아무 메서드나