✔ @Autowired 는 대표적으로 3가지 방법으로 구현이 가능합니다.
- 필드 주입 (가장 안좋은 방법) (지양 해야하는 방법)
- setter 주입
- 생성자 주입 (가장 권장되는 방법)
➡ 필드 주입
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
➡ setter 주입
- setter 생성자 위에
@Autowired를 작성해줍니다.- setter를 public 으로 설정해야됨으로 변경 가능성이 있습니다.
@Service public class UserService { private UserRepository userRepository; @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } }
➡ 생성자 주입 (@RequiredArgsConstructor 를 사용 해도됨)
생성자를 통해 의존성을 주입받을수 있습니다.
final = 누락을 방지 할수 있습니다. )@Service public class UserService { private final UserRepository userRepository; @Autowired public UserService(UserRepository userRepository) { this.userRepository = userRepository; } }
위의 코드와 동일한 기능을하는 코드입니다.
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
}
❓ 하지만 Controller, Repository 등 만을 테스트 하고 싶은 경우도 있을 것입니다.
그래서 단위(Unit) 테스트 라는 것이 등장 합니다.
- 개발 과정 중 예상치 못한 문제를 미리 발견할 수 있습니다.
- 여러 상황에 대한 테스트코드를 작성함에 따라 코드의 품질이 상승 합니다.
- 테스트 코드의 작성까지 해줘야 함으로 개발 시간이 오래걸립니다.
- 실행 코드가 변경되면, 테스트 코드도 변경해줘야 함으로 유지보수가 발생합니다.
- 테스트 폴더에 클래스 프로젝트를 만들어서 테스트 하면됩니다.
UserRepository를 단위 테스트하는 코드입니다.
@DataJpaTest: Jpa 관련 테스트만 합니다
( Spring Data Jpa 가 제공해주는 메소드,save,delete등)@Test: 테스트 메소드임을 나타내는 어노테이션
코드에서 보시면given/when/then으로 나누어 로직을 작성했습니다.- 로직을 나눠서 작성하게되면, 가독성도 좋아지고, 테스트를 작성하는데 있어 빼먹는 부분을 줄일수 있습니다.
서비스단에서는 대부분
Repository를 참조하고 있음으로,
UserService를 단위 테스트 하기 위해서UserRepository라는 가짜 객체를 만들어줍니다.