Spring으로 처음 입문해서 한 5년정도 사용하다가 스타트업으로 이직하면서 Spring 대신 NestJS로 진로를 바꿨다. 물론 NodeJS나 NestJS가 Spring보다는 개발 속도도 빠르고 비동기에 특화되어 있어 만족은 하지만... 마치 그 NodeJS나 NestJS가 Spring을 다 채우지 못하는 그 공허험이 존재 한다. 아마 나같이 Spring에서 NestJS, NodeJS로 전향한 사람은 다 이해 할 것다.ㅠ
최근 NestJS를 시작하면서 NestJS가 Spring과 비슷한 철학을 가진 프레임워크여서 스프링을 다시 학습을 할 필요 성이 느껴졌다.
@Controller
public class HomeController {
@Autowired
private HomeService homeService;
}
가장 간단한 방식의 선언 방법 이지만. 의존 관계가 눈에 잘 보이지 않아 추상적이고, 이로 인해 의존성 관계가 과도하게 복잡해질 수 있다.(@Autowired 선언 아래 3개든 10개든 ... 많이 추가 할 수록 의존 관계가 눈에 눈에 잘 보이지 않음)
또한 단일 책입 원칙에 반하는 안티패턴이다.
@Controller
public class HomeController {
private HomeService homeService;
@Autowired
public void setHomeService(HomeService homeService) {
this.homeService = homeService;
}
}
Setter Injection을 통해서 homeService를 주입하지 않아도 HomeController 객체가 생성이 가능하며 주입하지 않고 호출시 NullPointException이 발생한다.
즉 주입이 필요한 객체가 주입을 받지 않고 객체 생성이 된다는 문제가 발생한다.
@Controller
public class HomeController {
private final HomeService homeService;
public HomeController(HomeService homeService) {
this.homeService = homeService;
}
}
@Controller
@RequiredArgsConstructor
public class HomeController {
private final HomeService homeService;
}
Spring Framework Reference에서 권장하는 방법이다.
생성자 주입 방식은 필수적으로 사용해야하는 의존성 없이는 Instance를 만들지 못하도록 강제 할 수 있기 때문이다.
@Test
void 회원가입() {
// 테스트 케이스 문법
// given : 주어진 상황
Member member = new Member();
member.setName("hello");
// when : 실행 했을때
Long saveId = memberService.join(member);
// then : 예상 되는 결과
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
최근 IntelliJ 버전은 Gradle을 통해서 실행 하는 것이 기본 설정이다. 이렇게 하면 실행속도가 느리다.
다음과 같이 변경하면 자바로 바로 실행해서 실행속도가 더 빠르다.
Preferences
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술