[ 2022.10.31 TIL-Spring SOLID 원칙 ]

Coosla·2022년 10월 31일
0

TIL

목록 보기
10/29
post-thumbnail

Spring SOLID 원칙

✏️ SOLID원칙이란?

  • 로버트 마틴이 좋은 객체 지향 설계의 5가지 원칙을 제시
  • 시스템의 기능이 확장되거나 변동사항이 있을 때, 기존 시스템들이 영향을 받지 않는 방향을 갖기 위해서
  • 단일 책임 원칙, 개방 폐쇄 원칙, 리스코프 치환 원칙, 인터페이스 분리 원칙, 의존 관계 역전 원칙이 있다.

✏️ 단일 책임 원칙 (SRP, Single Responsibility Principle)

  • 소프트웨어의 한 객체는 단 하나의 책임만 가질 수 있다
  • 변경했을 때 파급 효과가 적을 수록 SRP원칙을 잘지켰다고 보면됨
  • 객체 간의 응집도는 최대화, 객체 간의 결합도는 최소화하는 것
    응집도와 결합도 설명
  • 예시 코드
    class Cal{
    	수학 연산 관련 메소드...
    }
  • 위 예시 코드 처럼 계산기 클래스에 수학 연산 관련 메소드만 있을 경우 SRP 원칙을 잘지켰다고 봄

✏️ 개방 폐쇄 원칙 (OCP, Open/Closed Principle)

  • 소프트웨어가 기존의 코드를 변경하지 않고 확장할 수 있음
  • 인터페이스를 이용하면 인터페이스를 구현한 구현 클래스는 다형성을 통해 새로운 기능의 확장이 가능
  • 객체를 생성하고 연관 관계를 맺어주는 것을 Spring Container가 함
  • 예제 코드
    // 인터페이스
    public interface iface{
    	public boolean isTrue();
    }
    
    // 구현 클래스 A
    public class A implements iface{
    	@Override
    	public boolean isTrue(){
    		return true;
    	}
    }
    
    // 구현 클래스 B
    public class B implements iface{
    	@Override
    	public boolean isTrue(){
    		return false;
    	}	
    }
    
    // main
    public class main{
    	public void main(...){
    		// 이때는 문제가 없음
    		iface a = new a();
    		iface b = new b();
    		
    		// 클라이언트가 직접 구현 클래스를 선택하여 클라이언트 코드가 변경됨
    		// 다형성을 이용했지만 OCP 원칙이 깨짐
    		iface a = new b();
    	}
    }

✏️ 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)

  • 클래스를 상속하는 자식 클래스들은 부모 클래스의 규약을 지켜야함
  • 부모 클래스에서 A라는 기능을 하는 메소드를 자식 클래스에서 A의 기능과 정반대인 C라는 기능으로 오버라이딩했을 때 LSP 위반
  • 부모 클래스를 상속하는 자식 클래스는 부모 클래스의 규약을 무시하거나 오버라이딩을 자제하는 것
  • 예제코드
    public class parent{
    	// 더하기 기능
    	public int add(int i, int j){
    		return i + j;
    	}
    }
    
    public class child extends parent{
    	// 부모 클래스의 add 메소드의 기능은 더하기인데
    	// 자식 클래스의 add 메소드는 빼기로 오버라이딩하여 부모 클래스의 add 메소드 기능을 무시
    	@Override
    	public void add(int i, int j){
    		return i - j;
    	}
    }

✏️ 인터페이스 분리 원칙 (ISP, Interrface Segregation Principle)

  • 어떤 구현 클래스는 자신이 구현하지 않는 인터페이스는 사용하지 않아야함
  • 예제 코드
    interface People {
    	public void cook(); // 요리
    	public void cleaning(); // 청소
    	
    	public void work(); // 일
    	public void submit(); // 제출
    }
    
    // People 인터페이스의 기능을 보면 cook(), cleaning()은 가정부가 하는 역할이고, work(), submit()은 직장인이 하는 역할이다.
    // 그래서 People 인터페이스를 더 구체적으로 인터페이스를 분리하는 것이 ISP 원칙이다.
    
    interface housekeeper{
    	public void cook(); // 요리
    	public void cleaning(); // 청소
    }
    
    interface worker{
     	public void work(); // 일
    	public void submit(); // 제출
    }

✏️ 의존 관계 역전 원칙 (DIP, Dependency Inversion Principle)

  • 구현체보다는 인터페이스나 추상 클래스에 의존하는 것이 좋음
  • 인터페이스나 추상 클래스의 의존해야 기존 기능의 변경이나 새로운 요구사항을 통한 기능 확장이 되었을 때 유연하게 변경 가능
  • OCP는 인터페이스와 구현체 둘다 의존하므로 DIP를 위반
  • 다형성만으로 OCP와 DIP를 위반하는 경우가 발생
  • Spring에서는 의존성 주입과 DI 컨테이너를 이용해 자바 객체의 의존성을 연동

참고

SOLID 원칙

profile
프로그래밍 언어 공부 정리

0개의 댓글