스프링 | SOLID원칙, 스프링컨테이너

Salt·2023년 5월 27일

스프링 부트

강력한 객체지향프로그래밍을 위한 프레임워크

객체 지향 설계원칙 SOLID

→ 클래스나 인터페이스들을 쪼개고, 포괄적이고 간결하게 상위 로직 짜기

SRP : 클래스에 주요 기능만, 남긴 클래스 하나하나 다 분리하기.

OCP : 뭘 변경해야 할때, 기존 코드를 지워서 수정하지 않고 새로운 코드를 추가하자.

LSP : 자식 객체가 부모 객체를 오버라이딩 했을 시, 부모 객체 일을 완벽수행? 모르겠다;;

ISP : 인터페이스에 필수 최소 기능만 넣고, 인터페이스를 다 쪼개야 한다.

DIP : 의존성이 낮아야 함. (큰게 작은걸 많이 참조하고, 그걸 또 참조하고.. 이걸 줄여야 함)

  1. 별로인 코드
public class HotelTest {

    @Test
    public void hotelTest() {
        **Hotel hotel = new Hotel();**
        hotel.inform();
    }
}
public Hotel() {
        restaurant = new FusionRestaurant();
        chef = new ChineseChef();
    }

이 코드의 문제점 : 최상위 객체인 호텔을 불렀는데, 호텔 내부의 셰프와 식당 정보를 바꿀 때마다,

항상 호텔 코드를 만져줘야 한다. 또 의존객체를 바꿀 때마다 호텔 내부 코드를 건드려야 함.

  1. 개선된 코드
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 의존성 주입

AOP 관점지향프로그래밍

주요 관심사(ex.결제) 보조 관심사(ex.보안,로그인) 를 분리해서 어노테이션 한 줄로만 연결하기

0개의 댓글