반응형

 

스프링 공부를 하면서 final키워드를 만났을 때 평소와 다른 어색한 사용방법 때문에 의문점이 생겼다.

final인데 왜 주입이 되는거지?
@Controller
public class MemberController{
		private final MemberService memberService;

		@Autowired
		public MemberController(MemberService memberService){
				this.memberService = memberService;
		}
		
}

final 선언 후 첫 값 초기화는 가능해서 그런건가? 라는 의문이 들었다.

이유는, 평소 final키워드 선언할 때는 항상 선언과 동시에 값을 초기화하기 때문이다.

이러한 부분이 모호하다 생각해서 final과 함께 서비스를 공부해보았다.

 

final


 

final 키워드는 변경이 더이상 필요없을 때 선언해줄 수 있다.

이번에 스프링부트를 사용하며 의문이 들었기에 위의 코드를 기준으로 스프링부트에서 생성자주입을 할때,

우리는 해당 객체의 메서드의 변경이 더이상 필요없다고 인지를 하고 있을 것이다.

때문에 Service객체에서 사용되는 모든 메서드들은 어디에서 사용이 되던 동일한 역할과 책임이 있다.

그러한 이유로 다른 컨트롤러든 서비스에서든 해당 Service에서 나올 기댓값은 동일하기에 클래스 추가생성을 통해 자원을 낭비할 필요가 없으니 final 선언을 하는 것이고, 이것이 싱글톤형태로 사용되고있는 이유다.

여러 클래스에서 해당 Service클래스를 여러번 선언하고 생성자주입을 한다면 싱글톤으로 돌아갈 수 없다고 생각될 수 있다.

하지만 이 부분은 스프링 빈의 특성을 통해서 해결이 가능하다 스프링 빈은 기본적으로 싱글톤 스코프로 관리되기 때문에 한번 해당 클래스가 스프링 빈으로 등록이 된다면 이후 동일한 인스턴스가 계속 동작한다

반응형

'호기심 천국 > Spring' 카테고리의 다른 글

스프링 시큐리티 1 (인증)  (0) 2023.09.26
데이터베이스 정렬 vs 자바 정렬  (0) 2023.09.12

+ Recent posts