프레임워크 vs 라이브러리 / IoC / DI

Expert Inpyo·2022년 10월 19일
0

Java Spring

목록 보기
1/4

출처
출처1
출처2
출처3

프레임워크

정의

뼈대, 기반 구조를 뜻함
Application 개발 시 필수 코드, 알고리즘, DB 연동 같은 기능들을 위해 어느정도 뼈대(구조)를 제공해주는 것

이 뼈대 위에 프로그래머가 코드를 작성해 Application을 완성시킴

어느 정도 뼈대가 제공되므로 OOP를 하며 일관성 부족 등의 문제를 해결해줌

따라서, 프레임워크는

소프트웨어의 특정 문제를 해결하기 위해 상호 협력하는 클래스와 인터페이스의 집합

이라고 정의한다.

라이브러리

정의

특정 기능에 대한 도구 or 함수를 모은 집합.
프로그래머가 개발하는데 필요한 것들을 모아둔 것

따라서, 라이브러리는

단순 활용 가능한 도구들의 집합

이다.

프레임워크 vs 라이브러리

가장 큰 차이 : Flow(흐름)에 대한 제어 권한이 어디에 있느냐?!

  • 프레임워크
    • 전체적인 흐름을 자체적으로 가지고 있음
    • 프로그래머가 그 안에 필요한 코드를 작성하는 형태
  • 라이브러리
    • 사용자가 흐름에 대해 제어함
    • 프로그래머가 필요한 상황에 가져다 사용함

=> 따라서, 이는 프레임워크는 제어의 역전(IoC, Inversion of Control)이 적용되어 있다!

IoC, 제어의 역전

정의

어떠한 일을 하도록 만들어진 프레임워크에서 제어의 권한을 넘김으로써 클라이언트 코드가 신경써야 할 것을 줄이는 전략

오브젝트생성, 관계 설정, 사용, 제거 등 오브젝트 전반에 걸친 모든 제어권을 어플리케이션이 갖는 것이 아닌, 프레임워크의 컨테이너에게 넘기는 개념

=> 여기서, 이 오브젝트가 Bean이다.

예시

public class IoCExample{
	private Example example;
    
    public IoCExample(){
    	example = new Example();
        // IoCExample 생성자에서 Example 클래스와의 의존 관계를 어플리케이션 단에서 직접 설정 중
    }
}


public class IoCExample{
	
    @Autowired
    private Example example;
	// 스프링에서 제공하는 @Autowired 어노테이션을 사용함으로써 개발자가 직접 의존관계를 설정해주는 코드가 사라짐
    // 프레임워크에 IoCExample, Example 오브젝트 의존관계의 제어권을 맡김 => 이 것이 제어의 역전이다! 
}

이렇게 되면, 스프링 컨테이너에서 Bean(객체)의 생명주기(생성 -> 의존성 설정 -> 초기화 -> 소멸) 전부를 관리해줌.

객체에 대한 제어권이 컨테이너로 역전되기 때문에 제어의 역전이다!

장점

  • 개발자가 객체 관리에 덜 신경쓸 수 있게 되어 다른 부분에 더 집중할 수 있음
  • 약한 결합을 이용해 객체간 의존 관계를 쉽게 변경할 수 있음
    => 궁극적으로 코드의 재사용성과 유지보수성 상승

DI, 의존성 주입

제어의 역전의 하위 개념
IoC 원칙을 실현하기 위한 여러 디자인 패턴 중 하나
객체간의 결합을 느슨히 만들어 유연하고 확장성 뛰언나 코드를 작성하기 위한 패턴임

외부로부터 메모리에 올라가있는 인스턴스의 레퍼런스를 인터페이스 타입의 파라미터로 의존관계를 설정하는 것

예시

// 1. 필드를 이용한 의존관계 주입(Field Injection)
@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private CourseService courseService;

    @Override
    public void studentMethod() {
        courseService.courseMethod();
    }

}

// 2. setter 메서드를 이용한 의존관계 주입(Setter Injection)
@Service
public class StudentServiceImpl implements StudentService {

    private CourseService courseService;

    @Autowired
    public void setCourseService(CourseService courseService) {
        this.courseService = courseService;
    }

    @Override
    public void studentMethod() {
        courseService.courseMethod();
    }
}

// 3. 생성자를 이용한 의존관계 주입(Constructor Injection)
@Service
public class StudentServiceImpl implements StudentService {

    private final CourseService courseService;

    @Autowired
    public StudentServiceImpl(CourseService courseService) {
        this.courseService = courseService;
    }

    @Override
    public void studentMethod() {
        courseService.courseMethod();
    }
}

위 세가지 방법 중 Spring Framework Reference에서 권장하는 방법 = 생성자를 통해 Bean의 의존성을 주입하는 방법
Why? 필수적으로 사용해야하는 의존성 없이는 인스턴스를 만들지 못하도록 강제할 수 있기 때문에!

profile
도전! 데이터 엔지니어

0개의 댓글