Spring IoC 컨테이너

박규민·2024년 10월 18일
post-thumbnail

스프링이란?

엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크

프레임 워크란?

Frame(틀) + Work(일하다)
즉, 어떠한 목적을 쉽게 달성할 수 있도록 "프로그램을 개발하기 위해 사용할 틀"

API란?

Application Programming Interface
2개 이상의 소프트웨어 컴포넌트 사이에서 상호작용할 수 있도록 정의된 인터페이스(다른 개발자들이 사용가능하게 함수,메서드 정의)

FrameWork vs API 둘의 차이점은?

프레임워크는 우리가 개발을 시도할 때, 우리가 표준화된 상황 하에서 개발할 수 있도록 도와준다. 이미 구조적으로 짜여져 있는 틀을 제공하기에 우리의 개발 속도를 향상시켜준다.

한편, API는 조금 더 세부적인 함수,클래스 등을 제공한다. 프레임워크와 마찬가지로 외부에서 가져오지만 프레임워크 보다는 조금 더 세부적인 툴을 제공한다.

요리로 예를 들자면, 프레임워크는 요리 전반의 레시피, API는 그 요리속 세부 요소들의 레시피이다.

Spring IoC 컨테이너

Spring IoC 컨테이너란?

Ioc = Inversion of Control
Ioc(제어 반전)이란, 객체의 생성, 생명주기 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것을 의미한다.

즉, Spring Ioc Container는
객체의 생명주기 관리를 개발자가 아닌 Spring 프레임워크가 담당하는 개념이다.
이를 통해 객체관리 주체가 프레임워크(Container)가 되어 개발자는 로직에 집중 할 수 있다.

IoC 컨테이너의 작동 방식

1. 객체를 class로 정의한다

  • 개발자가 application에서 사용할 객체들을 bean으로 등록하기 위해 스프링 설정 파일, 클래스, 어노테이션 사용
  • 객체를 스프링에 알려주기 위해 @Component와 같은 어노테이션 활용
  • IoC 컨테이너는 설정 정보를 바탕으로 객체를 bean으로 정의
    • bean이란?
      : 스프링 IoC 컨테이너에 의해 생성되고 관리된느 객체
      : 개발자가 직접 객체 관리하는 대신 bean을 정의,외주를 맡긴다
      : 여러 bean들이 모여 애플리케이션의 기능 구현

2. 객체들 간의 연관성 지정 : Spring 설정파일 or 어노테이션을 통해 객체들에게 의존성을 주입한다

  • 의존성 주입
    : 컨테이너는 각 빈의 생성 시점에 해당 bean이 필요로하는 의존성 주입
    • 의존성이란?
      : 객체 A가 작업 수행을 위해 다른 객체 B를 필요시, A는 B에 의존한다
      : 이때 의존성 객체를 생성하는 대신 외부로부터 주입받는다
      : 이를 통해 객체 간 결합도를 줄여, 유연성을 높여줄 수 있다

3. IoC 컨테이너가 이 정보를 바탕으로 객체를 생성,필요한 곳에 주입

IoC 컨테이너의 목표

IoC 컨테이너를 이용하면 POJO 기반의 개발이 가능하다.

POJO란?
Plain Old Java Object로, 특정 프레임워크에 종속적이지 않은 순수 자바 객체

Spring은 POJO 기반의 개발을 지향하며, 프레임 워크에 종속적이지 않고 일반적인 자바 객체를 사용하여 우리의 비즈니스 로직을 구현할 수 있다.

예시)

// java
// UserService : POJO 클래스
public class UserService {
	private UserRepository userRepository;
    
    // 의존성 주입 방법 = 생성자
    public UserService(UserRepository userRepository) {
    	this.userRepository = userRepository;
      }
      
      public User findUserById(Long id){
      	return userRepository.findById(id);
	  }
  }

: UserService는 어느 특정한 프레임워크나 라이브러리에 의존하지 않는 순수한 POJO
: Spring IoC 컨테이너가 UserRepository 객체를 자동으로 주입한다.
: 직접 의존성 객체(UserRepository)를 관리하지 않고도, 간결한 POJO로 비즈니스 로직을 구현할 수 있다

빈(Bean)이란?

일단, 콩은 아니구요
Spring IoC 컨테이너에 의해 생성되고 관리되는 자바의 객체를 의미합니다.
주로 비즈니스 로직 구현, 데이터 접근 등을 위한 다양한 객체로 사용되며,
XML 혹은 자바 기반의 설정 클래스, 어노테이션(@)을 통해 정의된다.

예시)
자바로 클래스 만들고, 객체 생성


public class UMC7thMember{
	private int age;
    private String nickname;
    private String school;
    private String studyPart;
    
    public UMC7thMember(){
    }
    
    public UMC7thMember(int age,String nickname,String school,String studyPart){
    	this.age = age;
        this.nickname = nickname;
        this.school = school;
        this.studypart = studyPart;
   
	}
}

1. 객체를 직접 생성하는 방식 (new 생성자)

UMC7thMember umc7thMember = new UMC7thMember(24,"덕규","UMC대학교","Server(SpringBoot)");
  • Java의 기초적 객체 생성 방식은 new 키워드를 이용해 생성하는 방식
  • 객체의 생성과 의존성 관리를 개발자가 전적으로 책임져야한다

-> UMC7thMember 객체를 빈으로 등록해 대체 가능

2. Bean으로 등록하여 관리하는 방식

2-1) @Component -> @Autowired : 묵시적 빈 정의

  • 클래스에 어노테이션을 추가하고, Autowired로 다른 클래스에서 해당 Bean을 끌어온다
    @Component
    public class UMC7thMember {
    	private int age;
    		private String nickname;
        private String school;
        
        
        private String studyPart;
    
    		public UMC7thMember(){
        }
    
    public UMC7thMember(int age,String nickname,String school,String studyPart){
    	this.age = age;
        this.nickname = nickname;
        this.school = school;
        this.studypart = studyPart;
    
    		}
    }
  • @Component 어노테이션 사용시, 자동으로 UMC7thMember을 Bean으로 등록하며, 이를 사용할 수 있다
  • 다른 클래스에서는 UMC7thMember를 @Autowired 어노테이션을 통해 주입받아 사용할 수 있다

2-2) @Configuration -> @Bean : 명시적 빈 정의
- Spring 설정 파일에 Configuration 어노테이션을 추가하고, Bean 어노테이션을 붙여 명시적으로 빈을 지정한다.

   	import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UMCService {
    	private final UMC7thMember umc7thMember;
        
        @Autowired
        public UMCService(UMC7thMember umc7thMember){
        	this.umc7thMember = umc7thMember;
        }
        public void printMemberInfo(){
        	System.out.println("나이:" + umc7thMember.getAge());
           System.out.println("너디너리 닉네임:" + umc7thMember.getNickname());
        }
 }

3. Bean의 스코프

  • Singleton 스코프 (기본 값)
    : 어플리케이션 컨텍스트 당 하나의 인스턴스만 생성,
    어플리케이션 내의 모든 요청에서 동일한 인스턴스를 공유한다
    : 빈을 여러번 요청하더라도, 컨테이너는 이미 생성된 동일한 인스턴스 반환
    : 주로 상태를 공유하지 않는 서비스나 비즈니스 로직 처리에 사용
  • 프로토타입 스코프
    : 빈의 인스턴스를 요청할 때마다, 매번 새로운 인스턴스를 생성
    : 상태가 변경될 수 있는 객체나 독립적인 작업을 처리하는 객체에 적합
profile
말도 할 줄 아는 Potato임니다

0개의 댓글