
강력한 객체지향프로그래밍을 위한 프레임워크
→ 클래스나 인터페이스들을 쪼개고, 포괄적이고 간결하게 상위 로직 짜기
SRP : 클래스에 주요 기능만, 남긴 클래스 하나하나 다 분리하기.
OCP : 뭘 변경해야 할때, 기존 코드를 지워서 수정하지 않고 새로운 코드를 추가하자.
LSP : 자식 객체가 부모 객체를 오버라이딩 했을 시, 부모 객체 일을 완벽수행? 모르겠다;;
ISP : 인터페이스에 필수 최소 기능만 넣고, 인터페이스를 다 쪼개야 한다.
DIP : 의존성이 낮아야 함. (큰게 작은걸 많이 참조하고, 그걸 또 참조하고.. 이걸 줄여야 함)
public class HotelTest {
@Test
public void hotelTest() {
**Hotel hotel = new Hotel();**
hotel.inform();
}
}
public Hotel() {
restaurant = new FusionRestaurant();
chef = new ChineseChef();
}
이 코드의 문제점 : 최상위 객체인 호텔을 불렀는데, 호텔 내부의 셰프와 식당 정보를 바꿀 때마다,
항상 호텔 코드를 만져줘야 한다. 또 의존객체를 바꿀 때마다 호텔 내부 코드를 건드려야 함.
public class HotelManager {
public Chef chef() { // 이거만 고치면 됨!
**return new JapaneseChef();**
}
public Course course() { // 이거만 고치면 됨!
**return new JapaneseCourse();**
}
public Restaurant restaurant() {
**return new FusionRestaurant(chef(), course());**
}
public Hotel hotel() {
**return new Hotel(restaurant(),chef());**
}
}
public class HotelManagerTest {
@Test
public void diTest() {
**HotelManager manager = new HotelManager();**
**Hotel hotel = manager.hotel();**
hotel.inform();
}
}
public void inform() {
String chefName = chef.getClass().getSimpleName();
String restaurantName = restaurant.getClass().getSimpleName();
System.out.println("우리 호텔의 레스토랑은 " + restaurantName + "이며, 수석 셰프는 " + chefName + "입니다.");
restaurant.order();
}
1) HotelManager 의 정보를 manager에 집어넣음 (수정하는 정보를 이 꾸러미에서 바꿔주면 끝)
2) manager.hotel() (호텔 매니저의 호텔 메서드) 호출 후, 내부적으로 hotel을 조립한 후, hotel에 생성 → hotel 변수에 담긴 정보 : (셰프, 레스토랑, 코스요리)
3) 조립된 정보가 담겨진 hotel에서 inform 실행
기존 자바 : 스태틱 → 스택 → 힙
스프링 : 스태틱 → 스프링컨테이너(힙의 일종으로, new로 생성x) → 스택 → 힙
객체 간의 의존성을 줄이고 결합도를 느슨하게 만들기 위함
IOC 제어의 역전, DI 의존성 주입
주요 관심사(ex.결제) 보조 관심사(ex.보안,로그인) 를 분리해서 어노테이션 한 줄로만 연결하기