You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
의존관계 자동 주입
다양한 의존관계 주입 방법
의존관계 주입 방법
생성자 주입
수정자 주입(setter 주입)
@Autowired의 기본 동작은 주입할 대상이 없으면 오류가 발생한다. 주입할 대상이 없어도 동작하게 하려면@Autowired(required = false)로 지정하면 된다.필드 주입
@SpringBootTest처럼 스프링 컨테이너를 테스트에 통합한 경우에만 가능하다.일반 메서드 주입
Member같은 클래스에서@Autowired코드를 적용해도 아무 기능도 동작하지 않는다.옵션 처리
@Autowired만 사용하면required옵션의 기본값이true로 되어 있어서 자동 주입 대상이 없으면 오류가 발생한다.@Autowired(required=false): 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안됨org.springframework.lang.@Nullable: 자동 주입할 대상이 없으면 null이 입력된다.Optional<>: 자동 주입할 대상이 없으면Optional.empty가 입력된다.setNoBean1()은required = false이므로 호출자체가 안된다.출력결과
생성자 주입을 선택해라!
과거에는 수정자 주입과 필드 주입을 많이 사용했지만, 최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장한다. 그 이유는 다음과 같다.
불변
누락
@Autowired가 프레임워크 안에서 동작할 때는 의존관계가 없으면 오류가 발생하지만, 지금은 프레임워크 없이 순수한 자바 코드로만 단위 테스트를 수행하고 있다.이렇게 테스트 수행하면 실행은 된다.
final 키워드
final키워드를 사용할 수 있다. 그래서 생성자에서 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에 막아준다.discountPolicy에 값을 설정해야 하는데, 이 부분이 누락되었다. 자바는 컴파일 시점에 다음 오류를 발생시킨다.java: variable discountPolicy might not have been initializedfinal키워드를 사용할 수 없다. 오직 생성자 주입 방식만final키워드를 사용할 수 있다.정리
롬복과 최신 트랜드
@Autowired를 생략할 수 있다.@RequiredArgsConstructor기능을 사용하면 final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다. (다음 코드에는 보이지 않지만 실제 호출 가능하다.)정리
@Autowired를 생락하는 방법을 주로 사용한다. 여기에 Lombok라이브러리@RequiredArgsConstructor함께 사용하면 기능은 다 제공하며서, 코드는 깔끔하게 사용할 수 있다.롬복 라이브러리 적용 방법
build.gradle에 라이브러리 및 환경 추가plugins { id 'java' id 'org.springframework.boot' version '3.1.9' id 'io.spring.dependency-management' version '1.1.4' } group = 'hello' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } //lombok 설정 추가 시작 configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter' //lombok 라이브러리 추가 시작 compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //lombok 라이브러리 추가 끝 testImplementation ('org.springframework.boot:spring-boot-starter-test'){ exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } } tasks.named('bootBuildImage') { builder = 'paketobuildpacks/builder-jammy-base:latest' } tasks.named('test') { useJUnitPlatform() }조회 빈이 2개 이상 - 문제
All reactions