스프링에서 관리하는 객체
스프링 컨테이너 제작
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);



@Configuration 과 싱글톤
@Configuration이란?
설정 클래스임을 나타내는 어노테이션
해당 클래스는 하나 이상의 @Bean 메서드를 포함하고 있으며,
스프링 컨테이너에 빈(Bean) 정의를 제공하는 클래스
내부적으로는 @Component도 포함 > 자동으로 컴포넌트 스캔 대상
설정 클래스 : 스프링에 필요한 설정을 정의하는 클래스. 스프링 실행할 때 실행됨.
-> 스프링 컨테이너에 어떤 객체(Bean)를 등록할지, 그 구성 정보를 코드로 정의하는 클래스
싱글톤 패턴
클래스의 인스턴스가 1개만 생성되는 것을 보장하는 디자인 패턴 > 2개 안 됨

왜 쓰냐? 효율성. 메모리 낭비를 막기 위해.
하나를 생성하고 생성된 한 개를 공유해서 사용.
스프링 컨테이너는 이미 싱글톤 컨테이너다 왜냐면 원래 그럼
이렇게 싱글톤 객체를 생성하고 관리하는 기능이 싱글톤 레지스트리
-> DIP, OCP, 테스트, private 생성자로부터 자유
그리고 stateless로 설계해야 됨
-> 싱글톤이면서 상태를 가지면 여러 요청이 서로 영향을 주지만, 상태가 없으면 모든 요청이 안전하게 독립적으로 처리된다
-> stateful로 코드를 작성하면 나중에 같은 인스턴스를 공유할 뿐더러 내부에 저장되는 값이 중첩되어서 오류가 생기는데 stateless로 코드를 작성하면 내부에 저장된 값이 없으니까 필요할 때마다 값을 지정할 수 있어서 좋다는 거지
여태까지는 스프링 빈을 등록할 때 어노테이션이나 xml을 통해 설정 정보에 등록했음
-> 하지만 스프링 빈이 굉장히 많아지면 직접 등록하기에 번거로움
--> 따라서 스프링에서는 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공
(+) 의존 관계를 자동으로 주입하는 @Autowired 기능도 제공
@ComponentScan
@Component가 붙은 클래스를 찾아서 자동으로 스프링 빈으로 등록
컴포넌트 스캔을 사용하려면 @ComponentScan을 설정 정보에 붙임
@Bean으로 등록한 클래스가 없음
컴포넌트 스캔을 쓰면 빈이 자동으로 등록되는데 의존 관계를 설정할 수 없음 (수동 등록할 공간이 없음)
따라서 오토 와이어드를 쓰면 스프링이 자동으로 의존 관계를 주입함
중복 등록과 충돌
1. 자동 빈 등록 대 자동 빈 등록
-> ConflictingBeanDefinitionException 오류 발생
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true 오류 발생생성자 주입 불변성 높다
의존관계 역시 잘 변하지 않는다
-> 불변 누락을 막음
-> final 키워드 사용 가능. 생성자에서 값 미설정 오류를 컴파일에서 막아줌
final : 변경 불가능
1) 변수에 사용할 때 - 값 변경 불가 (보통 상수로 사용 : static final)
2) 메소드에 사용할 때 - 오버라이드 방지 (핵심 로직을 변경 못 하게 막고 싶을 때)
3) 클래스에 사용할 때 - 상속 방지 (final 클래스는 상속 불가)
대부분의 의존관계는 불변 > 생성자에 final (값을 단 한 번만 설정하도록 강제하는 키워드)사용
-> 생성자도 만들고 주입 받은 값 대입 코드도 만들고 -> 번거로움
-> 롬복 라이브러리의 등장
롬복 라이브러리
롬복 라이브러리가 제공하는
@RequiredArgsConstructor기능을 사용하면
final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다
의존 관계를 추가할 때 매우 편리함
기본 코드
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
롬복 라이브러리 적용 코드
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
}
스프링 컨테이너의 두 가지 라이프 사이클
1. 스프링 빈을 등록한다
2. 의존관계를 주입한다
@Configuration 과 싱글톤
@Configuration이란?
설정 클래스임을 나타내는 어노테이션
해당 클래스는 하나 이상의 @Bean 메서드를 포함하고 있으며,
스프링 컨테이너에 빈(Bean) 정의를 제공하는 클래스
내부적으로는 @Component도 포함 > 자동으로 컴포넌트 스캔 대상
싱글톤 패턴
클래스의 인스턴스가 1개만 생성되는 것을 보장하는 디자인 패턴 > 2개 안 됨
final : 변경 불가능
1) 변수에 사용할 때 - 값 변경 불가 (보통 상수로 사용 : static final)
2) 메소드에 사용할 때 - 오버라이드 방지 (핵심 로직을 변경 못 하게 막고 싶을 때)
3) 클래스에 사용할 때 - 상속 방지 (final 클래스는 상속 불가)
설정 클래스? 스프링 컨테이너에 어떤 객체(Bean)를 등록할지, 그 구성 정보를 코드로 정의하는 클래스
스프링 컨테이너는 이미 싱글톤 컨테이너다 글쿤
스프링 컨테이너는 싱글톤 컨테이너 역할
이렇게 싱글톤 객체를 생성하고 관리하는 기능이 싱글톤 레지스트리
-> DIP, OCP, 테스트, private 생성자로부터 자유
그리고 stateless로 설계해야 됨
-> 싱글톤이면서 상태를 가지면 여러 요청이 서로 영향을 주지만, 상태가 없으면 모든 요청이 안전하게 독립적으로 처리된다
-> stateful로 코드를 작성하면 나중에 같은 인스턴스를 공유할 뿐더러 내부에 저장되는 값이 중첩되어서 오류가 생기는데 stateless로 코드를 작성하면 내부에 저장된 값이 없으니까 필요할 때마다 값을 지정할 수 있어서 좋다는 거지
여태까지는 스프링 빈을 등록할 때 어노테이션이나 xml을 통해 설정 정보에 등록했음
-> 하지만 스프링 빈이 굉장히 많아지면 직접 등록하기에 번거로움
--> 따라서 스프링에서는 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공
(+) 의존 관계를 자동으로 주입하는 @Autowired 기능도 제공
@ComponentScan
@Component가 붙은 클래스를 찾아서 자동으로 스프링 빈으로 등록
컴포넌트 스캔을 사용하려면 @ComponentScan을 설정 정보에 붙임
@Bean으로 등록한 클래스가 없음
컴포넌트 스캔을 쓰면 빈이 자동으로 등록되는데 의존 관계를 설정할 수 없음 (수동 등록할 공간이 없음)
따라서 오토 와이어드를 쓰면 스프링이 자동으로 의존 관계를 주입함
중복 등록과 충돌
1. 자동 빈 등록 대 자동 빈 등록
-> ConflictingBeanDefinitionException 오류 발생
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true 오류 발생생성자 주입 특. 불변성 X됨.
의존관계 특. 잘 안 변함.
-> 상성 뒤지게 좋음.
-> 불변 누락을 막음
-> final 키워드 사용 가능. 생성자에서 값 미설정 오류를 컴파일에서 막아줌
아무튼 생성자 주입이 좋다
좋은 글 잘 보고 가요~ 열심히 공부하신 흔적이 보이네요!