작성
·
338
0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
강사님께서 코드에서
final이 붙거나 @NotNull이 붙은 필드의 생성자를 자동생성해주는 롬복 어노테이션이라고 알고 있습니다.
근데, 이 코드에서 @RequiredArgsConstructor가 사용된 이유가 무엇인가요?
private final memberRepositoryV1 memberRepository;를 사용하는 이유는
싱글톤으로 코드를 작성하기 위해(즉, memberRepositoryV1이라는 하나의 객체를 사용)이라고 이해하고 있습니다.
혹시, @RequiredArgsConstructor를 사용한 이유가 싱글톤 코드를 작성하기 위한 것과 연관이 있는 것인가요?
항상 친절한 답변 감사합니다.
답변 2
0
안녕하세요. blackhole124님, 공식 서포터즈 y2gcoder입니다.
정확히는 생성자를 통해 memberRepository를 불변으로 주입해주기 위해서입니다. 말씀하신 것과 같이 @RequiredArgsConstructor를 사용하면 final 객체를 주입 및 초기화해주는 생성자를 자동으로 만들 수 있습니다. final 필드는 초기화 후에 변경하지 않도록 하는 제약이 있기 때문에, 우리는 해당 필드가 초기화 후에 변경되지 않는 필드라고 이해할 수 있습니다. 즉 memberService 객체를 생성할 때 memberRepository를 딱 한 번 주입한 뒤, 변경하지 않고 해당 객체를 계속 사용할 목적으로 해당 생성자를 이용했습니다.
또한 스프링 컨테이너에 memberService, memberRepository 객체가 빈으로 등록되어 있고, memberService의 생성자가 위에서 보여준 @RequiredArgsConstructor로 만들어진 생성자 하나 뿐이라면, 스프링에서는 해당 생성자 위에 @Autowired를 붙인 것과 같이 동작합니다. 즉 memberService 객체를 빈으로 등록할 때 memberRepository 빈을 찾아 의존성 주입해주게 됩니다.
위의 두 가지 이유로 @RequiredArgsConstructor를 많이 이용하는 것 같습니다!
감사합니다.
저는 불변하다는 것을 말 그대로 변하지 않는다고 이해하고 있습니다. 예를 들어 memberRepository를 한번 초기화 하고 나서는 내부의 메서드를 사용하기는 해도 객체가 변하지 않습니다. 그러면 여러 쓰레드에서 memberService에 접근해서 memberRepository 빈을 사용해도 모두 같은 빈을 사용하고 있음을 보장받을 수 있습니다.
불변성에 대해 조금 더 학습해보시면 더 잘 이해되실 거라 믿습니다!
추가로 불변 객체를 사용하는 이유에 대해 잘 정리된 글을 링크하겠습니다.
안녕하세요
친절한 답변 감사합니다.
혹시, "생성자를 통해 memberRepository를 불변으로 주입해주기 위해서입니다"라고 말씀하셨는데 여기서 "불변"이란 "직접적인 접근은 불가능하고, 메소드를 통해서 변경,조회,추가 등이 가능하다"라고 이해하면 옳게 이해한 것이 맞나요?