티스토리 뷰

728x90

 

 

 

가지고 있던 프로젝트에서 로거 생성을 실습하려고

 

private Logger logger = LoggerFactory.getLogger(XX.getClass());

 

같은 형태로 인스턴스를 만들어 써먹으려고 했는데

 

No qualifying bean of 'org.slf4j.logger' 라는 둥.... Bean creating 에 오류가 있다는 둥...

하면서 오류를 뱉길래..

Error creating bean with name 'XX' defined in file '/.../....' : Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.slf4j.Logger' available: expected at least 1 bean which qualifies as autowire candidate.

로그

 

private final Logger logger = LoggerFacotyr.getLogger(XX.getClass());

와 같이 final 을 추가하니 정상적으로 실행되었다.

 

 

찾다가 찾다가 @AllArgsConstructor 어노테이션과 충돌?? 관계로 인해서 문제가 생김을 확인,

 

생성자와 저 코드와의 관계를 찾다가..... 정적 팩토리 메서드를 발견했다.

 

 


 

정적 팩토리 메서드란?

객체 생성 역할을 하는 클래스 메서드이다. 

 

예를 보면.. 

(java.time 패키지의 LocalTime 클래스 정적 팩토리 메서드)

///
public static LocalTime of(int hour, int minute){
	ChronoField.HOUR_OF_DAY.checkValidValue((long)hour);
    if(minute == 0){
    	return HOURS[hour];
    }else{
    	ChronoField.MINUTE_OF_HOUR.checkValidValue((long)minute);
        return new LocalTime(hour, minute, 0, 0);
    }
}
...

//LocalTime 객체
LocalTime openTime = LocalTime.of(9, 30);

 

직접 생성자를 통해 객체를 생성하는 것이 아니라 메서드(LocalTime.of())를 통해서 객체를 생성한다.

-> 정적 팩토리 메서드

 

 

좀 더 쉬운 예제..

 

public class StaticFactory1 {

	private String name;

	//일반 생성자
	public StaticFactory1(String name) {
	   	this.name = name;
	}

	//정적 팩토리 메서드
	public static StaticFactory1 withName(String name) {
	    return new StaticFactory1(name);
	}

	public static void main(String[] args) {
	    //생성자로 객체 staticFactory 생성
	    StaticFactory1 staticFactory = new StaticFactory1("Neal");

    	//정적 팩토리 메서드로 sf 객체 생성
	    StaticFactory1 sf = withName("Peter");
	}
}

 

 

그래서 로거는

LoggerFactory의 getLogger가 정적 메서드에 해당한다.

 

 

 

그럼 이 정적 팩토리 메서드와 롬복의 @AllArgsConstructor 가 무슨 상관인가?

지금 보면 정적 팩토리 메서드를 사용해서 만든 객체를 가져다 롬복에서 생성자를 만들 때 문제가 되었고

final로 설정해주면 그 문제가 해결되었음.......

 

 

 

생성자가 하는 일을 알아보자

생성자는 인스턴스 변수를 초기화한다.

public class Test{
	private String name;
    private int age;
    
    public Test(){}
    
    public String getName(){
    	return name;
    }
    public int getAge(){
    	return age;
    }
    
    public static void main(String[] args){
    	Test test = new Test();
        System.out.println(test.getName()); //null
        System.out.println(test.getAge());  //0
    }
}

 

그래 우리는 기본을 알아야 한다....

이래서 lombok 생성자를 남발하면 안된다는 거쟝

아무튼 위처럼 ..

아니 근데 이러면 @NoArgsConstructor 를 써도 안돼야 하는거 아닌가?.. 근데 No에서는 되네

 

 

아.. Logger logger를 파라미터로 받는 생성자를 만들 때 이 Logger logger가 어딨는지를 몰라서

뭔지를 몰라서 오류가 나는 것 같으다..(로그 보세요 바보님아)

그래서 다른 객체 변수들은 Autowired를 해주자나....

 

일단 static content에는 autowired를 할 수 없음.

 

final이면,,,,, 이미 변수 선언 과정에서 끝나기 때문에 ?? 그런??

 

 

허 모르겠당^-^

 

 

 

 

 

 

 

 

더보기

https://velog.io/@ljinsk3/%EC%A0%95%EC%A0%81-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C%EB%8A%94-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C

 

https://tecoble.techcourse.co.kr/post/2020-05-26-static-factory-method/

근데 위에랑 아래 글 내용 똑같음... 나랑도 똑같음.. 

 

너무 여기저기서 봐서 이제 출처 다 까먹어버림.. 

 

 

 

 

 

 

 

728x90
댓글
250x250
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함