Public Article(int articleindex, String memberid) {
this.articleindex = articleindex;
this.memberid = memberid;
}
이 코드를 @RequiredArgsConstructor를 사용해서 생성자를 만들고 빈에 주입하면 다음과 같다.
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public class Article {
private final int articleindex;
private final String memberid;
}
@RequiredArgsConstructor
public class QuestionService {
private final QuestionRepository questionRepository;
}
위 코드와 아래 코드의 비교.
public class QuestionService(QuestionRepository questionRepository) {
this.questionRepository = questionRepository ;
}
두 코드는 기능적으로 동일합니다. 둘 다 QuestionService 클래스에 필드 questionRepository를 주입하는 생성자를 생성하는 방법 중 하나입니다. 이러한 생성자를 사용하면 스프링이 빈을 생성하고 필요한 의존성을 주입할 수 있도록 합니다.
첫 번째 코드는 Lombok의 @RequiredArgsConstructor 어노테이션을 사용하여 롬복 라이브러리를 활용한 방법입니다. 이를 통해 롬복은 해당 필드를 가지고 생성자를 생성합니다.
두 번째 코드는 롬복을 사용하지 않고 직접 생성자를 작성한 것입니다. 여기서 QuestionRepository를 생성자의 매개변수로 받아 필드에 할당합니다.
두 코드 모두 동일한 결과를 얻을 수 있으며, 의존성 주입을 위한 방법 중 하나를 선택할 수 있습니다. 롬복을 사용하면 코드를 간결하게 유지할 수 있으며, 생성자가 추가될 때 자동으로 관리하기 편리할 수 있습니다.
this.questionRepository가 new QuestionRepository() 라고 볼수도 있는건가? 어떤 관계가 있을까?
this.questionRepository는 새로운 QuestionRepository 객체를 생성하는 것이 아니라 이미 스프링 컨테이너에 의해 생성된 QuestionRepository 빈(Bean)을 참조하는 것입니다. 스프링에서는 객체를 직접 생성하거나 생성자를 통해 주입받아 사용하는 대신 스프링 컨테이너에 의해 미리 생성된 빈을 주입받아 사용하는 것이 일반적입니다.
QuestionRepository는 스프링 데이터 JPA나 다른 스프링 프레임워크의 일부로 정의된 빈이며, 스프링 컨테이너에 의해 관리됩니다. @Autowired나 생성자 주입 등의 방식을 사용하여 해당 빈을 주입받아 사용할 수 있습니다. 이렇게 하면 스프링이 QuestionRepository 빈의 인스턴스를 관리하고 필요한 곳에서 주입해줍니다.
스프링 컨테이너는 한 번 생성된 빈을 캐싱하고 관리하여 여러 곳에서 동일한 인스턴스를 공유합니다. 이로써 의존성 주입을 통해 같은 빈을 여러 번 생성하는 것을 방지하고 객체 간의 관계를 효과적으로 관리할 수 있습니다. 따라서 this.questionRepository는 스프링 컨테이너에 의해 관리되며, 이미 생성된 QuestionRepository 빈을 참조합니다.
빈이 결국 객체라는 건가?
네, 스프링의 "빈"은 결국 객체(인스턴스)입니다. 스프링은 객체 지향 프로그래밍의 원칙에 따라 애플리케이션을 개발하고, 스프링 컨테이너는 이러한 객체(빈)들의 생성, 관리, 주입을 효과적으로 처리하기 위한 컨테이너입니다.
스프링 빈은 Java 클래스로부터 생성되며, 이들은 일반적으로 POJO(Plain Old Java Object)로 구현됩니다. 스프링은 이런 빈을 생성하고 관리함으로써 애플리케이션의 유지보수성, 확장성, 테스트 용이성 등을 향상시키는데 도움을 줍니다.
각각의 스프링 빈은 런타임 시에 메모리에 객체로 생성되어 사용됩니다. 스프링 컨테이너는 이러한 빈들을 생성하고 주입(Dependency Injection)을 수행하여 빈들 간의 협력을 가능하게 합니다.
따라서, 스프링에서 "빈"이라고 언급할 때, 이는 일반적으로 객체 또는 클래스 인스턴스를 가리킵니다.