티스토리 뷰

SOLID

SOLID 란 객체지향 설계의 5원칙이라고 하며, 앞글자를 따서 SOLID라고 합니다.
원칙은 아래과 같습니다.

  • SPR(Single Responsibility Principle) : 단일 책임 원칙
  • OCP(Open Closed Principle) : 개방 폐쇄 원칙
  • LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
  • ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
  • DIP(Dependency Inversion Principle) : 의존 역전 원칙

모두 중요하지만 특히 OCP, DIP 가 중요하다


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

쉽게 말해 서버를 바꿨다고 클라이언트 소스도 바꿀 필요가 전혀!! 없도록 설계해야한다! 라는 원칙


DIP(Dependency Inversion Principle) : 의존 역전 원칙

쉽게 말해 "운전자"는 "자동차" 라는 역할에만 의존하면 되지 자동차의 구현체인 "k3", "아반떼", "테슬라 모델3" 같은 자동차 모델에 의존하게되면 안되게 설계되어야한다는 원칙


OCP와 DIP를 지키기 위해서는 누군가가 구현체를 주입해줘야한다!
이를 AppConfig라는 의존성 주입자(일종의 무대 기획자)를 만들어서 주입하는 방법이 있지만
우리의 SPRING을 이용하면 별도로 만들필요가 없다!!


스프링 컨테이너

  • ApplicationContext 를 스프링 컨테이너라 한다.
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

  • 기존에는 개발자가 AppConfig 를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제부터는 스프링 컨테이너를 통해서 사용한다.

  • 스프링 컨테이너는 @Configuration 이 붙은 AppConfig 를 설정(구성) 정보로 사용한다. 여기서 @Bean 이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
    // 스프링 컨테이너의 구성 정보로 사용될 클래스에 @Configuration 어노테이션 적용
    @Configuration
    public class AppConfig {
       @Bean
       public MemberService memberService() {
           return new MemberServiceImpl(memberRepository());
       }
       @Bean
       public OrderService orderService() {
           return new OrderServiceImpl(memberRepository(), discountPolicy());
       }
       @Bean
       public MemberRepository memberRepository() {
          return new MemoryMemberRepository();
       }
       @Bean
       public DiscountPolicy discountPolicy() {
           return new RateDiscountPolicy();
       }
    }

  • 스프링 빈은 @Bean 이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다. ( memberService , orderService ) 이전에는 개발자가 필요한 객체를 AppConfig 를 사용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 스프링 빈(객체)를 찾아야 한다. 스프링 빈은 applicationContext.getBean() 메서드를 사용해서 찾을 수 있다.
    @Configuration
    public class AppConfig {
       @Bean    // Bean 이름 메소드 이름과 같은 : memberService
       public MemberService memberService() {
           return new MemberServiceImpl(memberRepository());
       }
       @Bean    // Bean 이름 메소드 이름과 같은 : orderService
       public OrderService orderService() {
           return new OrderServiceImpl(memberRepository(), discountPolicy());
       }
       @Bean    // Bean 이름 메소드 이름과 같은 : memberRepository
       public MemberRepository memberRepository() {
          return new MemoryMemberRepository();
       }
       @Bean    // Bean 이름 메소드 이름과 같은 : discountPolicy
       public DiscountPolicy discountPolicy() {
           return new RateDiscountPolicy();
       }
    }

  • 기존에는 개발자가 직접 자바코드로 모든 것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함