IT/Spring

예제로 배우는 스프링 입문 완주 후기

yeTi 2022. 4. 12. 12:53

안녕하세요. yeTi입니다.
오늘은 백기선님의 스프링 강좌중 하나인 예제로 배우는 스프링 입문 의 완주 후기를 공유하려고 합니다.

강의 수강 계기

백기선님의 유튜브 동영상을 보다가 스프링을 제대로 공부했는지 5분안에 확인하는 방법 을 봤는데요.

문제가 이거였습니다.

외부 라이브러리를 사용하는 코드가 포함된 함수를 테스트하려면 어떻게 해야하는가?
단, Mock framework을 사용하지 않는다.

그래서 전 외부 라이브러리를 상속받은 mock 클래스를 구현하여 테스트 코드에 활용하는 것을 생각했습니다.
(@SpyBean @MockBean 의도적으로 사용하지 않기 - 기억보단 기록을 참고)

하지만 백기선님의 해결책은 스프링에서 제공하는 IoC와 PSA를 활용해서 다음과 같이 제시합니다.

외부 클래스를 랩핑할 수 있는 인터페이스를 정의하고 해당 인터페이스를 implements 받은 서비스 클래스를 테스트 클래스에서 DI받아 사용함으로써 테스트 가능한 코드를 만들 수 있다.

해당 해결책에 대해서

예제에서 사용하는 외부 클래스는 Github 클래스인데, PSA와 IoC를 활용해서 직접적으로 Github 클래스의 connect() 함수를 호출하는 부분은 제거했지만
테스트 코드가 전체적으로 수행되기 위해서는 Github클래스의 멤버 함수들이 동작을 해야함으로 Github클래스를 임의의 값을 반환하는 mock 클래스가 필요하지 않나?

하는 의구심이 생겼습니다.

어찌됐든 PSA(Portable Service Abstraction) 라는 개념을 처음들어봄으로써 공부가 부족하다는 점을 느꼈고

이는 보완하기 위해 백기선님의 예제로 배우는 스프링 입문 을 정주행하게 됐습니다.

배운점

예제 프로젝트

스프링에서 제공하는 예제 프로젝트로 spring-petclinic 이 있습니다.

스프링 프레임워크로 웹 어플리케이션을 만드는 코드를 예제로 제공하고 있습니다.

IoC (Inversion of Control)

자바 프로그래밍의 기초는 내가 사용할 클래스의 의존성은 내가 만든다 입니다.

Sample sample = new Sample();

하지만 스프링에서는 프레임워크단에서 동일한 타입 혹은 이름을 가진 클래스의 의존성을 제공해줍니다.

public SampleService(Sample sample) {
  this.sample = sample;
}

DI를 할 수 있는 방법엔 다음 세 가지가 있습니다.

  • 필드 인젝션
  • 세터 인젝션
  • 생성자 인젝션

빈으로 등록된 클래스들만 DI를 한다.

의존성 주입 (Dependency Injection)

생성자 인젝션의 장점
해당 빈의 인젝션없이 빈을 load할 수 없도록 강제할 수 있다.
또한 빈의 순환참조도 불가능하다.

단, 순환참조를 해야만하는 경우에는 필드 인젝션이나 세터 인젝션을 활용해 빈을 주입 받을 서 있지만, 순환참조는 피하는것이 좋다.

PSA (Portable Service Abstraction)

PSA를 사용하는 대표적인 이유중 하나는 테스트히기 어려운 코드를 테스트하기 편리한 코드로 만들 수 있다.

느낀점

시작은 PSA (Portable Service Abstraction) 에 대한 개념을 잡기 위해서였지만 설명이나 예제가 추상적이여서 스프링에서는 PSA 를 지원하기 때문에 코드의 변경없이 코어 서비스들을 변경하여 사용할 수 있는 정도로 알고 넘어가게 됐습니다.

또한 그 동안 생성자 인젝션을 사용하는 이유가 궁금했는데 이를 해결할 수 있어서 유익한 시간이었습니다.

본 강의는 간략하게 스프링 프레임워크의 개념을 살펴보는 수준이므로 입문자 분들에게 추천드립니다.