느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라

스프링 시작하기


스프링은 스프링 애플리케이션 컨텍스트(ApplicationContext 이건 스프링에서 클래서로 제공된다) 라는 컨테이너를 제공하는데, 이것은 애플리케이션 컴포넌트(스프링에서 빈이라 불리는 객체들을 뜻하는 것으로 이해)들을 생성하고 관리한다. 그리고 애플리케이션 컴포넌트 또는 빈들은 스프링 애플리케이션 컨텍스트 내부에서 서로 연결되어 완전한 애플리케이션을 만든다.

의 상호 연결은 의존성 주입(Dependency Injection 즉 DI로 스프링을 사용하는 회사의 면접등에서 자주 묻는데, 사용할 객체들을 외부로 부터 전략패턴을 통해 주입받는것으로 이해) 이라고 알려진 패턴을 기반으로 수행된다. 즉, 애플리케이션 컴포넌트에서 의존(사용)하는 다른 빈의 생성과 관리를 자체적으로 하는 대신 별도의 개체가 해주며, 이 개체에서는 모든 컴포넌트를 생성, 관리하고 해당 컴포넌트를 필요로 하는 빈에 주입한다. 일반적으로 이것은 생성자 인자 또는 속성의 접근자 메서드를 통해 처리한다. (과거에는 xml등으로 의존성 주입을 명시해줬으나 최근에는 자바 코드상에 애노테이션을 통해서 이를 명시, 런타임시 이를 해석하여 생성, 주입한다.)

@Configuration 애노테이션은 이것이 각 빈을 스프링 애플리케이션 컨텍스트에 제공하는 구성 클래스라는 것을 스프링에게 알려준다. 구성 클래스의 메서드에는 @Bean 애노테이션이 지정되어 있으며, 이것은 각 메서드에서 반환되는 객체가 애플리케이션 컨텍스트의 빈으로 추가되어야 한다는 것을 나타낸다. 

자동-구성은 자동연결(Auto Wirering) 컴포넌트 검색(Component-Scan)이라는 스프링 기법을 기반으로 한다. 컴포넌트 검색을 사용하여 스프링은 자동으로 애플리케이션의 classpath에 지정된 컴포넌트를 찾은 후 스프링 애플리케이션 컨텍스트의 빈으로 생성할 수 있다. 또한, 스프링은 자동 연결을 사용하여 의존 관계가 있는 컴포넌트를 자동으로 다른 빈에 주입한다. 

스프링 부트는 Jar로 패키징 할 수 있는데, Jar 패키징은 클라우드를 염두에 둔 선택이다.  WAR 파일은 기존의 자바 애플리케이션 서버에 애플리케이션을 배포할 떄는 적합하지만, 대부분의 클라우드 플랫폼에는 잘 맞지 않는다. 일부 클라우드 플랫폼에서는 WAR파일을 배포하고 실행할 수 있다. 그러나 모든 자바 클라우드 플랫폼은 실행 가능한 JAR파일을 사용한다. 따라서 스프링  Initializr에서는 JAR 패키징을 기본값으로 사용한다. (이 점에 대해서 웹 프로젝트를 Jar로 배포할 수 있다는 사실에서 신기했는데, 아마 이에 대해서는 내장 톰캣이 있고 이러한 내장 톰캣을 스프링 애플리케이션 컨텍스트에 구성하기 때문에 가능한 것으로 판단된다)

스타터 의존성의 세가지 장점

  • 우리가 필요로 하는 모든 라이브러리의 의존성을 선언하지 않아도 되므로 빌드 파일이 훨씬 더 작아지고 관리하기 쉬워진다.
  • 라이브러리 이름이 아닌 기능의 관점으로 의존성을 생각할 수 있따. 따라서 만일 웹 애플리케이션을 개발한다면 웹 애플리케이션을 작성할 수 있게 해주는 라이브러리들을 일일이 지정하는 대신에 여기처럼 웹 스타터 의존성만 추가하면 된다.
  • 라이브러리들의 버전을  걱정하지 않아도 된다. 스프링 부트에 포함되는 라이브러리들의 버전은 호환이 보장되므로 사용하려는 스프링부트의 버전만 신경쓰면 된다.

@SpringBootApplication은 아래 하위의 어노테이션들의 결합이다.
  • @SpringBootConfiguration : 현재 클래스를 구성 클래스로 지정한다.
  • @EnableAutoConfiguration : 스프링 부트 자동-구성을 활성화한다. 
  • @ComponentScan : 컴포넌트 검색을 활성화한다. 이것은 @Component, @Controller, @Service등의 애노테이션과 함께 클래스를 선언할 수 있게 해준다. 


@SpringBootTest는 스프링 부트 기능으로 테스트를 시작하라는 것을 JUnit에 알려준다. 

@SpringBootTest가 테스트의 스프링 애플리케이션 컨텍스트를 로드하는 작업을 수행하더라도 테스트 메서드가 없다면 아무일도 하지 않는다. 기본적으로 있는 contextLoad()처럼 아무 코드가 없는경우라도 테스트 메소드가 있으면 애플리케이션 컨텍스트를 로드되도록 한다. 





profile

느린 것을 걱정하지 말고, 멈춰서는 것을 걱정하라

@주현태

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!