본문 바로가기
Spring|Spring-boot

[Spring] 의존 자동 주입 대상의 필수 유무설정

by oncerun 2021. 1. 25.
반응형

스프링 5 버전부터는 @Autowired 애노테이션의 required 속성을 false 하는 대신 의존 주입 대상에 자바 8의 Optional을 사용할 수 있다.

 

 

자동 주입 대상 타입이 Optional인 경우, 일치하는 빈이 존재하지 않으면 값이 없는 Optional을 인자로 전달하여 exception이 발생하지 않으며, 일치하는 빈이 존재하면 해당 빈을 값으로 갖는 Optional을 인자로 전달한다.

 

@Autowired(required = false)
	public void setDateFormatter(DateTimeFormatter dateTimeFormatter) {
		this.dateTimeFormatter = dateTimeFormatter;
	}

다음과 같은 코드는 Optional을 사용하면 다음과 같이 변경할 수 있다.

@Autowired
	public void setDateFormatter(Optional<DateTimeFormatter> formatterOpt) {
		
		if (formatterOpt.isPresent()) {
			this.dateTimeFormatter = formatterOpt.get();
		} else {
			this.dateTimeFormatter = null;
		}
		
	}

 

DateTimeFormatter 객체를 담을 수 있는 Optional객체를 인자로 받아서 값이 존재한다면 그 값을 받아오고, 그렇지 않으면 null값을 넣도록 합니다.

 

	@Autowired
	public void setDateFormatter(Optional<DateTimeFormatter> formatterOpt) {
		
			this.dateTimeFormatter = formatterOpt.orElse(null);
		
	}

orElse() 설명을 읽어보니 formatterOpt의 값이 존재하면 값을 반환하고 없다면 other을 반환한다고 해서 한 줄로 줄여봤습니다.

 

 

@Nullable 애노테이션을 사용하는 방법도 존재합니다.

 

	@Autowired
	public void setDateFormatter(@Nullable DateTimeFormatter datetimeFormatter) {
		
		this.dateTimeFormatter = datetimeFormatter;		
	}

@Nullable 애노테이션을 의존 주입 대상 파라미터에 붙이면 setter메서드를 spring container가 호출할 때 자동 주입할 빈이 존재하면 해당 빈을 전달하고 그렇지 않으면 null을 전달합니다.

 

required = false와 @Nullabel 차이점은 다음과 같다.

- required속성이 false인 경우 대상 빈이 존재하지 않으면 메서드를 호출하지 않습니다.

- 그와 반대로 @Nullable 같은 경우는 빈이 존재하지 않아도 메서드가 호출된다는 것입니다.

반응형

'Spring|Spring-boot' 카테고리의 다른 글

Spring Security(3)  (0) 2021.03.28
[Spring ] 빈 객체의 초기화와 소멸  (0) 2021.01.25
JWT(2)  (0) 2020.08.18
Json Web Tokens(1)  (0) 2020.08.14
회원가입을 위한 Spring security  (0) 2020.08.09

댓글