싱글톤은 객체를 한 번만 생성하고 여러 곳에서 이를 재사용할 수 있도록 하는 디자인 패턴입니다. 싱글톤 레지스트리는 이러한 싱글톤 객체를 관리하는 컨테이너 역할을 합니다.
스프링은 기본적으로 모든 빈(bean)을 싱글톤으로 관리합니다. 빈을 한 번 생성해 컨테이너에서 관리하고, 필요한 곳에서 꺼내 사용할 수 있도록 합니다.
제어의 역전(IoC)은 객체 생성 및 의존성 관리를 개발자가 아닌 컨테이너(스프링)에 맡기는 것을 의미합니다.
IoC를 통해 객체 간의 결합도를 낮출 수 있으며, 유지보수 및 테스트가 쉬워집니다.
스프링은 IoC 컨테이너로 작동하여 애플리케이션의 객체 생성과 소멸을 관리합니다.
의존성 주입(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
}
}