스프링 프레임워크와 의존성 주입

Sunny·2022년 9월 6일
0

✨ React.js, 스프링 부트, AWS로 배우는 웹 개발 101


🔅 02. 백엔드 개발


🔅 2.1 백엔드 개발 환경 설정

2.1.1 자바 8 설치 (생략)
2.1.2 이클립스 설치 (생략)
2.1.3 스프링 프레임워크와 의존성 주입
2.1.4 스프링 프레임워크와 디스패처 서블릿
2.1.5 스프링 부트 프로젝트 설정
2.1.6 메인 메서드와 @SpringBootApplication
2.1.7 빌드 자동화 툴 : Gradle과 라이브러리
2.1.8 디펜던시 라이브러리 추가
2.1.9 롬복
2.1.10 포스트맨 API 테스트


🚩 [사전지식] 스프링 프레임워크

🐳 스프링 프레임워크

  • 오픈 소스의 경량 프레임워크
    *** 용어설명
    - 오픈 소스 : 소스코드가 공개 되어 있다는 뜻
    - 경량 프레임워크 : 프레임워크 사용 시 메모리나 CPU 자원이 많이 들지 않거나 사용이 쉽고 간편한 경우
    - 프레임워크 : 코드인데 개발자들이 확장해서 사용할 수 있는 코드. 확장해서 사용한다는 것은 프레임워크가 제공하는 클래스나 라이브러리를 사용하거나 프레임워크가 제공하는 클래스나 인터페이스를 상속 및 구현해 코드를 프레임워크의 일부로 실행하는 것을 의미.

  • 스프링 프레임워크의 컴포넌트 :

    • 스프링 AOP
    • 스프링 ORM
    • 스프링 웹
    • 스프링 부트
    • 의존성 주입

🚩 2.1.3. 스프링 프레임워크와 의존성 주입

의존성 주입을 이해하기 위해 의존성이 무엇이고, 의존성 주입이 왜 필요한지 살펴보자.

Todo 애플리케이션을 만들 예정이므로 Todo 애플리케이션을 예로 들어보자.

🐳 의존성 주입

/* (ex) 생성자 내부에서 오브젝트 초기화 */

public static void main(String[] args) {
	TodoService service = new TodoService();
}

public class TodoService {
	private final FileTodoPersistence persistence;
    
    public TodoService(){
    	this.persistence = new FileTodoPersistence();
    }
    
    public void create(...) {
        ...
        persistence.create(...);
    }
}

✔ 가정
Todo 애플리케이션에는 TodoService 클래스가 있고 이 클래스가 Todo 목록을 관리하는 기능을 제공한다.

✔ 코드 설명

  • TodoService는 FileTodoPersistence 를 사용
  • FileTodoPersistence는 파일에 Todo 목록을 저장할 수 있도록 도와주는 클래스
  • TodoService는 FileTodoPersistence 없이는 Todo 목록을 관리하는 기능을 구현 할 수 없다.
    👉 이것을 TodoService는 FileTodoPersistence에 의존(dependent)한다고 한다.
    👉 TodoService가 FileTodoPersistence 오브젝트를 생성하고 관리한다.

✔ 위의 예제의 문제 의존성 주입의 필요성

(가정)
Todo 목록을 파일에 저장하는 것이 아닌 DB에 저장하는 것으로 변경
👉 DatabaseTodoPersistence 를 구현
👉 TodoService에서 FileTodoPersistence 대신 DatabaseTodoPersistence로 자료형을 바꾸고 생성자에서 DatabaseTodoPersistence를 생성
👉 DB 저장하는 것은 생각보다 비싸서 가격이 저렴한 AWS S3으로 변경
👉 그런데 그 사이에 개발이 진전돼 DatabaseTodoPersistence를 사용하는 서비스가 100개 정도 생김
👉 100개의 클래스를 돌아다니면서 DatabaseTodoPersistence 대신 S3TodoPersistence를 생성하도록 수정

위의 가정과 같은 상황이 일어났을 때 해결책은 의존성 주입이다.

💡 의존성 주입
한 클래스가 의존하는 다른 클래스들을 외부에서 주입시킨다는 뜻

  • 구현 방법
    1) 생성자를 이용해 주입
    2) Setter를 이용해 주입

✔ 생성자를 이용한 의존성 주입, 서비스 코드 예제

public static void main(String[] args) {
	ITodoPersistence persistence = new FileTodoPersistence();
    TodoService service = new TodoService(persistence);
}

public class TodoService {
	private final ITodoPersistence persistence; // 인터페이스
    
    public TodoService (ITodoPersistence persistence){
    	this.persistence = persistence;
    }
    
    public void create(...) {
    	...
        persistence.create(...);
    }
}
  • 한 오브젝트가 의존하는 오브젝트를 생성하는 것이 아니라 외부에서 넘겨받는 것이 의존성 주입이다.
  • TodoService 오브젝트를 생성할 때 ITodoPersistence 구현부를 넘겨줌으로써 의존성을 주입한다.
  • TodoPersistence가 아니라 ITodoPersistence이며, ITodoPersistence는 인터페이스이다.

✔ Setter를 이용한 의존성 주입, 서비스 코드 예제

public static void main(String[] args) {
	ITodoPersistence persistence = new FileTodoPersistence();  // 초기화
    TodoService service = new TodoService(); // 초기화
    service.setITodoPersistence(persistence); // Setter을 이용해 의존하는 오브젝트 주입
}

public class TodoService {
	private final ITodoPersistence persistence;
    
    public void setITodoPersistence(ITodoPersistence persistence) {
    	this.persistence = persistence;
    }
}

위의 예제처럼 오브젝트를 초기화한 후 그 다음 줄에서 Setter를 이용해 의존하는 오브젝트를 주입한다.

🐳 스프링 프레임워크

스프링 프레임워크는 의존성 주입을 전문적으로 해주는 의존성 주입 컨테이너(Dependency Inject Container)이다.

프로젝트의 규모가 커질수록, 관리해야 하는 오브젝트가 많아질수록 오브젝트를 생성하는 데 할애하는 시간이 늘어나는데, 이때 의존성 주입 컨테이너의 도움을 받으면 오브젝트 생성과 관리를 효율적으로 할 수 있다.

예시로 이해해보자.

/* Todo 예약, 알림 및 공유 기능을 위한 클래스의 예 */
public class MyService {
	TodoService todoService;
    ShareService shareService;
    NotificationService notificationService;
    ScheduledExecutorService scheduledExecutorService;
}

public class ShareService {
	UserService
}

🐳 스프링 부트

추가예정

profile
개발에 재미를 붙여보기 :)

0개의 댓글