의존성 주입은 이전 블로그에서 간단하게 설명했다.
의존성 주입은 클래스A와 클래스B가 서로 의존 상태일 때, 클래스를 생성하지 않고 외부에서 주입받아 사용한다. 외부의 클래스를 사용할 때 매번 새로운 객체를 만들어 사용하게 되면 메모리 부하가 발생하게 된다. 따라서 의존성 주입을 new 를 하지 않고 의존성 주입을 하는 법을 정리하겠다.
의존성 주입에는 크게 3가지가 있다.
1. 생성자 주입
@Controller public class UserController { private UserRepository userRepository; // 의존성 주입 받기 위해 만듬. 의존성 주입을 받을 떄 final을 붙여서 사용함 private HttpSession session ; public UserController(UserRepository userRepository) { this.userRepository = userRepository; // 생성자를 만들어서 디폴트 생성자를 제거함. }
클래스에 외부 클래스의 객체를 생성자를 통해 초기화한다.
@PostMapping("/login") public String login(UserRequest.JoinDTO requsetDTO){ User user = userRepository.findByUsernameAndPaaword(requsetDTO) }
생성자를 통해 외부 클래스 UserRepository 객체를 만들어 호출할 수 있다.
2. @AllArgsConstructor
사용
@AllArgsConstructor
은 lombok에서 제공하는 라이브러리 어노테이션으로 , 사용하게 되면 생성자를 자동으로 만들어준다.@AllArgsConstructor @Controller public class UserController { private UserRepository userRepository; // 의존성 주입 받기 위해 만듬. 의존성 주입을 받을 떄 final을 붙여서 사용함 private HttpSession session ; this.userRepository = userRepository; // 생성자를 만들어서 디폴트 생성자를 제거함. @PostMapping("/login") public String login(UserRequest.JoinDTO requsetDTO){ User user = userRepository.findByUsernameAndPaaword(requsetDTO) } }
3. @RequiredArgsConstructor
사용
@RequiredArgsConstructor
역시 Lombok 에서 제공하는 라이브러리 어노테이션으로 , final
이나 @NonNull
으로 선언된 필드의 생성자를 만들어준다.@RequiredArgsConstructor @Controller public class UserController { private final UserRepository userRepository; // 의존성 주입 받기 위해 만듬. 의존성 주입을 받을 떄 final을 붙여서 사용함 private final HttpSession session ; this.userRepository = userRepository; // 생성자를 만들어서 디폴트 생성자를 제거함. @PostMapping("/login") public String login(UserRequest.JoinDTO requsetDTO){ User user = userRepository.findByUsernameAndPaaword(requsetDTO) } }
@AllArgsConstructor
는 모든 객체의 생성자를 만든다. 따라서 @RequiredArgsConstructor
를 사용하고 원하는 변수에 final 을 붙여 사응하는 것이 좋다.Share article