KU-BESTA / pro-spring-5

전문가를 위한 스프링5를 읽고 공부합니다.
1 stars 0 forks source link

초기화 메서드 메커니즘의 장점은 정적(static) 초기화 메서드를 사용하려고 할 때 사라진다. #5

Open YoumHyeJi opened 2 years ago

YoumHyeJi commented 2 years ago

초기화 메서드 관련 이슈

책 213p 아래에서 3번째 줄을 보면, "이 메커니즘(초기화 메서드)의 장점은 정적(static) 초기화 메서드를 사용하려고 할 때 사라집니다."라는 구문이 있습니다. 해당 내용이 잘 이해가지 않아 공부하던 중 좋은 레퍼런스를 발견해서 공유합니다. https://github.com/caffeine-library/pro-spring-5/issues/28

위 레퍼런스 내용을 한 줄로 정리하자면,

"정적 초기화 메서드를 사용하면 제대로 빈이 구성되었는 확인할 수 없기 때문에, 초기화 메서드 메커니즘의 장점이 사라진다." 입니다.

초기화 메서드는 제대로 빈이 구성되었는지 확인하는 방법입니다.

그러나 non-static 멤버 변수 상태를 검증하는 초기화 메서드를 static 메서드로 선언하게 되면, static 메서드에서는 non-static 멤버 변수(인스턴스 변수)에 접근할 수 없으므로 제대로 빈이 구성되었는지 그 상태를 확인하는 것이 불가능합니다.

=> static 메서드의 경우 런타임이 아닌 클래스 로딩 때 한 번 메모리(method area, JAVA8 부터는 heap area)에 올라가기 때문에 그 static 메서드가 로딩될 때는 비 static 멤버 변수가 아직 인스턴스화 되기 이전, 즉 런타임 이전이기 때문에 접근할 수 없음.

그렇다고 static 상태 정보를 사용하고 해당 상태 정보를 검증하려고 초기화 메서드에 static 메서드를 사용한다면 이전에 생성된 bean에 상태에 영향을 받을 수 있습니다.

=> static 멤버 변수를 사용하게 되면, 영향을 받으면 안 되는 각각의 빈 상태가 이전에 생성된 빈의 상태에 영향을 받을 수 있기 때문.

즉, static 초기화 메서드를 사용하면

  1. non-static 멤버 변수에 접근할 수 없음
  2. static 멤버 변수 상태가 제대로 구성되지 않을 수 있음

둘 중 하나의 상황이 발생하므로 어느 쪽도 제대로 빈이 구성되었는지 확인하기 어렵기 때문에, 해당 메커니즘의 장점이 사라집니다.

ksi05503 commented 2 years ago

오.. static 멤버변수를 사용하면 안되니까 non static을 참조못하는 스태틱 init 메서드는 쓰면 안된다는거지?