티스토리 뷰
가지고 있던 프로젝트에서 로거 생성을 실습하려고
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://tecoble.techcourse.co.kr/post/2020-05-26-static-factory-method/
근데 위에랑 아래 글 내용 똑같음... 나랑도 똑같음..
너무 여기저기서 봐서 이제 출처 다 까먹어버림..
'#2 > Spring' 카테고리의 다른 글
[Spring] @Component, @Repository와 @Service의 차이점 - 미완 (0) | 2022.05.16 |
---|---|
[Spring] devtools의 liveReload가 안되는 경우 (0) | 2022.04.19 |
[Spring] Produces & Consumes (0) | 2022.01.03 |
[spring] 코배스.. 댓글 페이징하기 (0) | 2021.11.24 |
[Spring] @ModelAttribute와 @RequestParam (0) | 2021.11.09 |