본문 바로가기
Spring

[spring] spring과 객체지향의 원리

by devjh 2021. 2. 28.
반응형

spring을 통해 객체지향의 원리를 활용하는 기본 예제입니다.

 

동작원리와 이유를 생각해보지않고 @Service @Repository @Component @Autowired 등의 어노테이션을 사용하였지만 의미를 확인하기 위해 정리하였습니다.

 

public interface Animal {
    void eat();
}

 

 

public class Tiger implements Animal{
    @Override
    public void eat() {
        System.out.println("고기를 먹습니다.");
    }
}

 

 

public class AnimalManager {

    private Animal animal = new Tiger();
    
    public void exacute() {
        animal.eat();
    }
    
}

 

 

AnimalManager라는 클래스는 Animal이라는 인터페이스를 활용하여 어떠한 구현체가 오더라도

 

Animal을 상속받은 클래스라면 excaute에서 정상적으로 동작하며, animal이 Tiger에서 Monkey로 바뀌더라도 new Tiger를 new Monkey로 변경해주기만 한다면 정상 동작합니다.

 

유연하게 잘 설계 된 것 같지만

 

AnimalManager가 Tiger라는 구현체에 의존하게 된 상태입니다.

 

Tiger를 Monkey나 Human등 으로 바꿔주고 싶다면 new Tiger라는 구문을 바꿔줘야 하는 상태입니다.

 

AnimalManager가 사육사라고 가정하면

 

사육사는 어떤 동물에게 먹이를 줄지 본인이 정하면 안됩니다.

 

외부에서 동물원 관계자가 정해주도록 해야합니다q

 

변경해보겠습니다

public class AnimalManager {

    private Animal animal;
    
    public AnimalManager(Animal animal) {
    	this.animal = animal;
    }
    
    public void exacute() {
        animal.eat();
    }
    
}

 

객체지향의 원리인 DIP를 잘 지키게 되었습니다.

 

이제 사육사는 어떤 동물이 오더라도 먹이를 잘 줄수 있는 상황이 되었습니다.

 

단 외부에서 누군가 AnimalManager라는 클래스를 생성할때 동물이 누구인지 매개변수로 넣어줘야하는 상황입니다.

 

이때 스프링 컨테이너가 주입해줍니다.

 

기존에 스프링 컨테이너에 생성해 줬던 동물을 스프링 DI가 주입을 해주므로 사육사는 동물이 뭐가 됐던간에 먹이를 잘 줄 수 있는 상태가 됐습니다.

 

@Autowired @Component(@Service, @Repository ..) 의 어노테이션은 객체지향의 원칙을 잘 지키 위해 등장하였을뿐 본질은 SOLID의 5번째 원칙인 DIP(인터페이스에 의존하라) 를 지키기 위함임을 정리해 보았습니다.

 

반응형

댓글