본문 바로가기

스프링부트 관련(spring boot, mybatis)

logger를 사용할 때 static을 붙이고 안붙이고 차이가 무엇일까?

스프링부트를 사용하면서 로그를 찍기위해 서비스에 아래와 같은 로그를 초기화하여 사용하고 있었다. 그런데 사수님께서 static 안붙인 이유가 있는지, static 붙이고 안붙이고의 차이가 무엇인지 물어보셨다.

 

static은 메모리에서 저장되는 위치가 힙 영역이 아니라 데이터 영역(전역변수, static 변수)에 저장되어 여러 클래스 객체를 생성하더라도 하나만 공유한다고 알고 있었다. 그런데 스프링은 빈에 인스턴스를 등록해 싱글톤으로 관리되는데 굳이 static으로 할 필요가 있나? 라는 생각을 갖고 열심히 인터넷을 뒤적거려봤다. 참고에 뒤적거린 사이트들을 적어두었다.

 

static을 사용하면 생기는 장점

1. 잘 알려진 관용구이다. (이게 왜 장점이지?)

2. CPU, Memory 오버헤드가 적다. logger가 딱 한번만 메모리에 올라가기 때문이다.

3. 하나의 인스턴스만 생성해 사용할 수 있다.

 

static을 사용하면 생기는 단점

1. IOC 친화적이지 않다.

2. 사용하지 않더라도 메모리 공간을 차지한다. (근데 이게 되어봤자 얼마나 되려나..)

 

마지막으로 static을 사용하는 이유중 하나로 logger를 serialize하는 것을 피하기 위함이라는데 이게 무슨뜻인지 잘 이해가 안된다.

 

여러 글을 참조해본 결과 "스프링 부트"로 웹서버를 만들 때에는 써도 되고, 안써도 된다고 생각한다. 단 클래스를 싱글톤으로 관리하지 않는다면 static을 붙여주는 것이 자원을 더 절약할 수 있는 방법이라고 생각된다. 사수님한테 물어보고 큰 이유가 없으면 안쓸듯?

로그를 사용하는 모든 클래스가 스프링 빈에 등록되는것이 아니기 때문이기도 하고, 관용적으로 static을 붙이는 경우도 많다고 한다.

 

참고

https://stackoverflow.com/questions/8262310/any-reason-to-use-private-instead-of-private-final-static-on-the-logback-logger

https://atin.tistory.com/639