Skip to content

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

@YoumHyeJi

Description

@YoumHyeJi

초기화 메서드 관련 이슈

책 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 초기화 메서드를 사용하면

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

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions