2023-05-09 EFUB 7주차 세션을 듣고 정리한 내용입니다.
Spring에서 자바 객체(Bean)들을 관리하는 공간
클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴
특징
Spring Container의 최상위 인터페이스
Application Context == Spring Container
• Application Context ⊂ Bean Factory
• Bean Factory + 부가 기능 (국제화, 환경 변수 관련 처리, 애플리케이션 이벤트, 리소스 조회)
• XML / 자바 클래스 기반으로 생성할 수 있음.
1) Spring Container 생성
2) Spring Bean 등록
: Spring 설정 파일을 기반으로 container에 Spring Bean 등록
3) Spring Bean 의존관계 설정
: Spring 설정 파일을 기반으로 Spring Bean 의존 관계 주입
Spring Container가 관리하는 자바 객체
1) 컴포넌트 스캔
• @Component를 사용
• @Controller, @Service, @Repository는 인터페이스로 @Component를 받음 ➡️ 컴포넌트 등록 가능
• 단, 실행되는 패키지와 같은 패키지에 있는 클래스에 대해서만 @Component가 적용됨
@Component
public @interface Service {
...
}
2) 직접 등록
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
}
1) getBeanDefinitionNames() : 스프링에 등록된 모든 Bean 이름을 조회
2) getBean() : 특정 Bean을 조회하는데 사용
프로그램의 제어 흐름을 개발자가 아닌 외부에서 관리
• 객체의 생성과 소멸, 객체 간의 의존관계 설정을 모두 Spring에서 제어
• 객체의 의존성을 역전시켜 모듈 간의 의존도를 줄이고 유연한 코드를 작성할 수 있게 함
• IoC가 이루어지는 공간 == IoC 컨테이너
참고) IoC가 구현된 예
: 클래스 사이의 의존 관계를 Bean 설정 정보를 바탕으로 자동 연결해주는 것
1) 필드 주입
2) 수정자(setter) 주입
3) 생성자 주입
4) 일반 메서드 주입
➡️ 주로 선택과 변경 가능성이 있는 의존 관계에서 사용
@Component
public class SampleController {
private SampleService sampleService;
@Autowired
public void setSampleService(SampleService sampleService){
this.sampleService = sampleService;
}
}
• 필요한 의존 객체의 타입에 해당하는 Bean을 찾아 주입
• 생성자, setter, 필드에서 사용 가능
➕ 사용시 주의할 점
• DI는 스프링이 관리하는 객체에서만 동작함
== Spring Bean으로 등록하지 않고 직접 생성한 객체에서는 동작 X
• Bean이 없는 경우 의존성을 주입할 수 없음
➡️ 주입할 Bean이 없어도 동작해야 하는 경우 존재!
• @Autowired(required = false): 자동 주입할 대상이 없으면 setter 메서드 호출 X
• org.springframework.lang.@Nullable 어노테이션: 자동 주입할 대상이 없으면 Null 입력
• Java8 Optional <>: 자동 주입할 대상이 없으면 Optional.empty 입력
+) XML 파일: 별도 파일인 .xml 파일에 등록할 Bean들을 모두 정의
: 반복되는 메서드를 어노테이션을 사용하여 자동으로 작성해주는 라이브러리
• Java에 사용하는 메서드가 많아질수록 코드가 복잡해지고 생성하는데 번거로워짐
➡️ Lombok을 사용하여 코드 다이어트
• 어노테이션 기반의 코드 자동 생성을 통한 생산성 향상
• 반복 코드 다이어트를 통해 가독성 및 유지보수성 향상
Spring, Lombok을 결합한 생성자 주입
• @RequiredArgsConstructor를 사용하는 방법
• Lombok 라이브러리를 통해 생성자를 생성 ➡️ Spring 프레임워크가 해당 생성자에 @Autowired가 생략되었다는 것을 인식 ➡️ 적합한 Spring Bean 주입
• Spring 4.3부터 사용 가능
• 생성자 의존관계 주입시 생성자 코드를 반드시 삽입해야 함
➡️ 이 또한 Lombok @RequiredArgsConstructor 애너테이션으로 간편하게 처리 가능!
🔻생성자 관련
• @NoArgsConstructor: 매개 변수가 없는 기본 생성자를 생성
• @RequiredArgsConstructor: final 필드만 포함된 생성자를 생성
• @AllArgsConstructor: 모든 필드를 포함한 생성자를 생성
🔻메서드 관련
• @Getter/@Setter: Getter/Setter를 자동으로 생성
• @toString: toString 메서드를 자동으로 생성
• @EqualsAndHashCode: equals, hashCode를 자동으로 생성
🔻빌더 패턴
• @Builder: 메서드 체이닝을 이용하는 static 메서드 builder를 생성
🔻통합 기능
• @Data: @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를
한꺼번에 제공
• @Data 사용 지양: 다양한 애너테이션을 한꺼번에 사용하는 만큼 부작용 다수 발생
• 무분별한 Setter 사용 지양
• Setter는 그 의도가 분명하지 않음
• 객체를 얼마든지 변경할 수 있는 상태가 되어 객체의 일관성을 유지하기 어려움