토비의 스프링 1장 마무리

유소이·2024년 9월 19일

1. 싱글톤 레지스트리 (Singleton Registry)

싱글톤은 객체를 한 번만 생성하고 여러 곳에서 이를 재사용할 수 있도록 하는 디자인 패턴입니다. 싱글톤 레지스트리는 이러한 싱글톤 객체를 관리하는 컨테이너 역할을 합니다.
스프링은 기본적으로 모든 빈(bean)을 싱글톤으로 관리합니다. 빈을 한 번 생성해 컨테이너에서 관리하고, 필요한 곳에서 꺼내 사용할 수 있도록 합니다.

2. IoC (Inversion of Control)

제어의 역전(IoC)은 객체 생성 및 의존성 관리를 개발자가 아닌 컨테이너(스프링)에 맡기는 것을 의미합니다.
IoC를 통해 객체 간의 결합도를 낮출 수 있으며, 유지보수 및 테스트가 쉬워집니다.
스프링은 IoC 컨테이너로 작동하여 애플리케이션의 객체 생성과 소멸을 관리합니다.

3. DI (Dependency Injection)

의존성 주입(DI)은 객체의 의존성을 외부에서 주입하는 것을 의미합니다.
생성자 주입, 세터 주입, 필드 주입과 같이 다양한 방식으로 DI를 구현할 수 있습니다.
DI를 통해 클래스 내부에서 객체를 생성하는 대신, 외부에서 객체를 주입받음으로써 유연하고 확장 가능한 코드를 작성할 수 있습니다.

아래 코드는 스프링 프레임워크에서 싱글톤 레지스트리, IoC, DI의 개념을 설명하는 간단한 예시입니다.

// UserRepository.java
import org.springframework.stereotype.Repository;

@Repository // 싱글톤 빈으로 등록
public class UserRepository {
    public String findUser() {
        return "User1";
    }
}

// UserService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service // 싱글톤 빈으로 등록
public class UserService {
    private final UserRepository userRepository;

    // 생성자 주입 (DI)
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public String getUser() {
        return userRepository.findUser();
    }
}

// Application.java (스프링 애플리케이션 실행)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Application.class, args);

        // 스프링 컨테이너에서 빈을 가져옴 (IoC)
        UserService userService = context.getBean(UserService.class);

        // UserService의 메소드 호출
        System.out.println(userService.getUser()); // 출력: User1
    }
}
  • UserRepository와 UserService는 각각 @Repository, @Service 어노테이션을 통해 스프링 컨테이너에 싱글톤 빈으로 등록됩니다.
  • UserService는 UserRepository를 의존성으로 받는데, 생성자에 @Autowired를 사용하여 스프링이 자동으로 UserRepository 객체를 주입(DI)합니다.
  • Application 클래스에서 ApplicationContext를 통해 UserService 빈을 가져오는데, 이는 IoC 컨테이너가 빈을 관리하고 제공하기 때문입니다.
  • 이러한 방식으로 스프링은 싱글톤 레지스트리로 빈을 관리하고, IoC를 통해 객체의 생명 주기를 관리하며, DI를 통해 의존성을 주입하여 유연하고 재사용 가능한 코드를 작성할 수 있도록 합니다.
profile
백엔드 개발자의 기술과 경험을 공유하는 개발 블로그입니다.

0개의 댓글