의존성 주입은 클래스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