본문 바로가기
프로젝트 · 트러블 슈팅

[플젝기록] 생성자 관련 @어노테이션

by 외계나무 2025. 7. 3.

오늘도 자정을 30분 남기고 급하게 끌어온 옛날 기록  ㅋㅋㅋㅋㅋ

이게 의미가 있나 싶지만 일단 블로그를 정기적으로 쓴다 << 는 루틴을 만드는 중이라 뭐라도 쓰는 게 안 쓰는 것 보다는 낫다.


@RequiredArgsConstructor / @Autowired / @AllArgsConstructor 구분

@RequiredArgsConstructor, @AllArgsConstructor → lombok 소속

@Autowired → Spring 소속

@Autowired => 생성자/필드의 의존성 주입 목적 (생성자의 경우, 해당 클래스에 생성자가 하나면 해당 어노테이션 생략 가능) → 생성자 의존성 주입 = 생성자에 사용된 필드들이 생성자의 매개변수로 전달되면, 그 생성자를 통해 객체를 생성할 때 해당 필드들의 값이 외부에서 주입된다.

@AllArgsConstructor ⇒ 갖고 있는 모든 필드를 사용한 생성자를 생성한다. 처음부터 각 필드에 값이 들어가야 하는 종류의 클래스 객체에 쓰기 편리하다. 회원가입 시에 모든 회원정보를 한번에 입력받는다든가... 반면 클래스 객체 생성 시에 필수로 필요하지 않은 필드가 있다면 굳이 필요하지 않다.

@RequiredArgsConstructor ⇒ final 붙은 필드만 사용한 생성자를 생성한다. → 이렇게 만들어진 생성자에 @Autowired가 명시적/암묵적(생성자 하나일 때)으로 의존성을 주입한다.

 

@Autowired - final과의 관계

어떤 객체를 final로 선언할 경우, 해당 변수가 생성될 때 값을 넣지 않으면 이후에는 값을 넣을 수 없다. (final = 고정값, 변경 불가) 그런데 필드에 붙은 @Autowired는 해당 클래스 객체 생성 전후에 알아서 적절한 값을 넣어 해당 필드 객체를 생성한다. 즉, 이 필드가 final로 선언되어 있으면 @Autowired가 클래스 객체 생성 후에 값을 넣으려다 실패하게 된다.

결론

1. 필드에 @Autowired를 쓰려면 필드를 final로 선언하지 말자.

2. 생성자에 @Autowired를 쓰려면 final로 선언된 필드는 반드시 초기화 하자.

Controller 객체는 싱글톤 객체로, 객체의 개수가 하나로 고정되어 있다. 즉, 매번 생성되지 않고 한 번 생성해서 계속 재활용해야 한다. 보통 Controller 객체의 수명은 해당 앱의 수명과 같다.


스프링 공부하던 시점에 정리해둔 거였는데, 프로젝트 하다보면 @Autowired는 잘 안 쓰게 되어서 의미가 있나 싶다. @RequiredArgsConstructor를 제일 많이 쓴 듯.