인생을 코딩하다.

[Spring] 의존성 주입(DI)과 스프링 및 테스트코드 본문

Spring

[Spring] 의존성 주입(DI)과 스프링 및 테스트코드

Hyung1 2020. 9. 12. 12:27
728x90
반응형

스프링에 대한 얘기를 하면 빠지지 않는 개넘이 '의존성 주입'이라는 개념이다.

프레임워크를 이용해 본 적이없는 경우라면 쉽게 이해하지 못하는 개념이라 간단한 이야기로 정리해보겠다.

의존성이라는 것은 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것을 의미한다.

그리고 주입은 말 그대로 와부에서 밀어넣는 것을 의미한다. 즉 의존성이 필요한 객체에 필요한 객체를 찾아서

'주입'하는 역할을 하게된다.

저욱 자세한 것은 구글링을 통해 알아보면 좋겠다.

밑에 예제는 레스토랑 객체를 만들고 레스토랑에서 일하는 세프 객체를 주입하는 예제이다.

(실제 코드를 개발할 떄는 그다지 사용될 일이 없는 에제지만, 의존성 주입 코드를 통해서 이해하는 용도로 사용하려고 한다.)

우선 lombok을 이용해서 setter 메서드를 자동으로 구현되도록 할 것이고, 스프링의 동작을 테스트 할것이므로 pom.xml에서 Lombok 라이브러리를 추가하고, spring-test 라이브러리를 이용한다.

변경된 xml을 저장하고 'Bean Graph' 탭을 선택해보면 Restaurant와 Chef 객체가 설정된 것을 확인 할 수 있디.

다음은 지금 만든 예제들이 어떻게 동작하는지 이해하기 위해서 스프링과 함께 시간의 순서대로 고민해보아야 한다. 그림으로 정리하면 다음과 같이 표현할 수 있다.

이제 위의 예제를 테스트코드를 통한 확인을 하겠습니다.

각 어노테ㅐ이션들의 의미는 주석을 달아났으니 참고하시면 됩니다.

실행경과에서 주목해야하는 부분은 다음과 같습니다.

- new Restaurant()와 같이 클래스에서 객체를 생성한 적이 없는데도 객체가 만들어졌다는 점 -> 스프링은 관리가 필요한 객체(Bean)를 어노테이션 등을 이용해서 객체를 생성하고 관리하는 일종의 '컨테이너'나 '팩토리'가ㅣ능을 가지고 있습니다.

- Restaurant 클래스의 @Data 어노테이션으로 Lombok을 이용해서 여러 메서드가 만들어진점

- Restaurant 객체의 Chef 인스턴스 변수(멤버 면수)에 Chef 타입의 객체가 주입되어 있다는 점- -> 스프링은 @Autowried와 같은 어노테이션을 이용해서 개발자가 직접 객체들과의 관계를 관리하지 않고, 자동으로 관리되도록 합니다.

테스트 결과가 의미하는 바는 스프링을 공부하는데 있어서 가장 중요한 내용입니다. 1) 테스트 코드가 실행되지 위해서 스프링 프레임워크가 동작했고, 2) 동작하는 과정에서 필요한 객체들이 스프링에 등록되었고, 3) 의존성 주입이 필요한 객체는 자동으로 주입이 이루어졌다는 내용을 정리해 둘 필요가 있습니다.

Spring 관련

@Component는 해당 클래스가 스프링에서 객체로 만들어서 관리하는 대상임을 명시하느 ㄴ어노테이션입니다. 현재 예제의 경우 @Component가 있는 클래스를 스프링이 읽어주도록 @ComponentScan을 통해서 지정되어 있으므로 해당 패키지에 있는 클래스들을 조사하면서 @Component가 존재하는 클래스들을 객체로 생성해서 빈으로 관리하게 됩니다.

@Autowired는 스프링 내부에서 자신이 특정한 객체에 의존적이므로 자신에게 해당 타입의 빈을 주입해주라는 표시입니다. 예제에서 Restaurant 객체는 Chef 타입의 객체가 필요하다는 것을 명시합니다. 스프링은 @Autowired 어노테이션을 보고 스프링 내부에 관리되는 객체(들)중에 적당한 것이 있는지를 확인하고, 자동으로 주입해 줍니다. 당연한 얘기지만 필요한 객체가 존재하지 않는다면 스프링은 제대로 객체들을 구성할 수 없기 때문에 에러를 발생시킵니다.

테스트 관련 어노테이션

테슨트 관련해서가장 중요한 어노테이션은 @Contextconfiguration입니다. @Contextconfiguration은 스프링이 실행되면서 어떤 설정 정보를 읽어 들여야 하는지를 명시합니다. 속성으로는 locations를 이용하여 문자열의 배열로 XML 설정 파일을 명시할 수도 있고, classes 속성으로 @Configuration이 적용된 클래스를 지정해 줄 수도 있습니다. @Runwith는 테스트시 필요한 클래스를 지정합니다. 스프링은 SpringJUnit4ClassRunner 클래스가 대상이 딥니다. @Test는 junit에서 해당 메서드가 jUnit 상에서 단위 테스트의 대상인지 알려줍니다.

728x90
반응형
Comments