-
Notifications
You must be signed in to change notification settings - Fork 0
Description
초기화 메서드 관련 이슈
책 213p 아래에서 3번째 줄을 보면, "이 메커니즘(초기화 메서드)의 장점은 정적(static) 초기화 메서드를 사용하려고 할 때 사라집니다."라는 구문이 있습니다.
해당 내용이 잘 이해가지 않아 공부하던 중 좋은 레퍼런스를 발견해서 공유합니다.
caffeine-library/pro-spring-5#28
위 레퍼런스 내용을 한 줄로 정리하자면,
"정적 초기화 메서드를 사용하면 제대로 빈이 구성되었는 확인할 수 없기 때문에, 초기화 메서드 메커니즘의 장점이 사라진다." 입니다.
초기화 메서드는 제대로 빈이 구성되었는지 확인하는 방법입니다.
그러나 non-static 멤버 변수 상태를 검증하는 초기화 메서드를 static 메서드로 선언하게 되면,
static 메서드에서는 non-static 멤버 변수(인스턴스 변수)에 접근할 수 없으므로 제대로 빈이 구성되었는지 그 상태를 확인하는 것이 불가능합니다.=> static 메서드의 경우 런타임이 아닌 클래스 로딩 때 한 번 메모리(method area, JAVA8 부터는 heap area)에 올라가기 때문에 그 static 메서드가 로딩될 때는 비 static 멤버 변수가 아직 인스턴스화 되기 이전, 즉 런타임 이전이기 때문에 접근할 수 없음.
그렇다고 static 상태 정보를 사용하고 해당 상태 정보를 검증하려고 초기화 메서드에 static 메서드를 사용한다면 이전에 생성된 bean에 상태에 영향을 받을 수 있습니다.
=> static 멤버 변수를 사용하게 되면, 영향을 받으면 안 되는 각각의 빈 상태가 이전에 생성된 빈의 상태에 영향을 받을 수 있기 때문.
즉, static 초기화 메서드를 사용하면
- non-static 멤버 변수에 접근할 수 없음
- static 멤버 변수 상태가 제대로 구성되지 않을 수 있음
둘 중 하나의 상황이 발생하므로 어느 쪽도 제대로 빈이 구성되었는지 확인하기 어렵기 때문에, 해당 메커니즘의 장점이 사라집니다.