개발자일지/Spring

0. SOLID와 Spring

어쩌다한번 2022. 6. 13. 22:58

처음부터 완전한 애플리케이션을 만드는 것은 정말 어려운 일이다

말이 정말 어렵다지 불가능에 가까울 수 있다

 

따라서 언제든 변화하고 수정될 수 있도록 유연해야하는데

이를 위해서는 'OOP객체 지향 원칙'을 잘 지켜야한다

 

좋은 객체 지향 설계의 5가지 원칙이 바로 SOLID


- SRP단일책임원칙

한 클래스는 하나의 책임만 가져야 한다

: 변경이 있을때 파급 효과가 적어야한다

 

- OCP개방폐쇄원칙

확장에는 열려있으나 변경에는 닫혀있어야 한다

: 인터페이스를 통해 새로운 클래스를 생성할 수 있는데 인터페이스에 영향을 미치지는 않는다.

 

- LSP리스코프치환원칙

다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다.

: 단순히 컴파일 성공을 넘어서 약속된 기능을 수행해야한다

 

- ISP인터페이스분리원칙

특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다

: 기능적으로 잘 분리되어야 사용하기 편하다.

 

- DIP의존관계역전원칙

추상화에 의존해야지, 구체화에 의존하면 안된다.

구현 클래스에 의존하지 말고, 인터페이스에 의존하는것이 좋다.


대체로 '인터페이스를 잘 활용하라'라는 말과 같은데

 

아주 간단한 예를 들자면

 

쇼핑몰을 막 개업한다고 하자

개업 행사로 할인을 하려하는데 할인 방법을 정해야한다

일단 고정적으로 전품목 5천원 할인을 하려하는데

이후에 효과가 좋지않거나 적자가 난다면 정률(%)할인으로 변경하는게 좋을 것 같다.

 

5천원 할인의 효과가 좋지않아서 새로 할인정책을 변경한다고 할때

인터페이스를 사용하면 각각 직접 구현하거나 지우는 번거로움 없이 손쉽게 변경이 가능하다

public interface DiscountPolicy {
    //할인 금액을 반환하는 메서드를 구현하도록 한다
    int discount(int price);
}

//정액 할인 정책 구현
public class FixDiscountPolicy implements DiscountPolicy{

    private  int discountFixAmount = 5000; //할인 금액

    @Override
    public int discount(int price) {
        return price - discountFixAmount;
    }
}

//정률 할인 정책 구현
public class RateDiscountPolicy implements DiscountPolicy{

    private int discountPercent = 10;//할인률

    @Override
    public int discount(int price) {
        return price * discountPercent / 100;
    }
}

적용

 

할인 정책을 만들었으니 이제 적용만 하면 된다.

 

상품 가격을 저장하는 곳에서

DiscountPolicy discountPolicy = new FixDiscountPolicy();
//혹은
DiscountPolicy discountPolicy = new rateDiscountPolicy();

위와 같이 객체를 생성해서 할인 메서드를 가격에 적용시키면 편하게 할인 정책 변경이 가능하다.

 

하지만 위 코드는 DIP를 위반하고 있다

new 를 사용해서 만든 구체적인 객체에 의존하고있기 때문이다.

 

이 경우 애플리케이션의 모든 구성을 관리하는 AppConfig라는 클래스를 새로 생성해서

각 부분마다 필요한 객체를 미리 생성해주도록하면 DIP의 충족은 가능하나

사용할 때 마다 매번 객체를 생성한다는 문제는 여전히 가지고 있다.

 

공유가 가능한 객체를 매번 생성하지 않고 하나의 객체만 생성해서 함께 사용하는것을

싱글톤 패턴이라고 하는데 이 역시 자바로 구현 가능하긴 하지만 코드가 매우 길고

다시 구체 클래스에 의존하는 등 여러 문제를 수반할 가능성도 존재한다

 


설명이 길었는데 요약하자면

자바만으로 좋은 애플리케이션을 만드는 것은 상당히 복잡하고 어렵다는 것이다

 

그래서 스프링은

좋은 객체 지향 애플리케이션을 개발하기 위해 만들어진 프레임워크

 

스프링은 컨테이너라는 것을 사용해서 위에서 존재하는 복잡한 문제들을 간단하게 해결해준다

 

나의 스프링 스승이신 김영한님의 말씀을 빌리자면

자바로 애플리케이션을 개발하다보면 스프링이 개발되지 않을 수가 없다

 

자바로 힘겹게 애플리케이션을 만들던 겨울에서

따뜻한 봄Spring을 안겨주기 위해서 탄생한 프레임워크인 것이다.

'개발자일지 > Spring' 카테고리의 다른 글

2. 의존관계 주입 DI  (0) 2022.06.15
1. Spring Framework의 특징과 싱글톤 패턴  (0) 2022.06.14
게시판 만들기  (0) 2022.03.31
Spring MVC 2편 - 검증 (Validation) 1  (0) 2022.03.21
Spring MVC 2편 - Thymeleaf  (0) 2022.03.17