자바로만 어플리케이션을 개발하려면 귀찮은 점이 한 두가지가 아니었고, 유지보수도 힘든 부분이 있었다고 한다. 그러한 점을 보완하기 위해 스프링 프레임워크가 나왔다. 스프링 프레임워크가 어떻게 자바 어플리케이션 개발을 돕는지 알아보자.
1.1.1 제어 역전(IoC : Inversion of Control)
자바로만 개발할 때는 특정 클래스 내에서 객체를 사용하기 위해서는 클래스 내에서 객체 하나하나를 생성하여 사용했어야 했다. 이렇게 객체 생성하는 것을 직접하지 않고 객체의 관리를 스프링 컨테이너 또는 IoC컨테이너에 맡긴다. 이와 같이 객체의 관리를 직접 하지 않고 외부 컨테이너에 위임하는 것이 제어역전이다.
객체를 직접 생성하고, 생성한 객체들이 많은 객체들을 참조하고 있는 상태를 의존성이 높다고 표현할 수 있다. 의존성이 높을 수록 사용한 특정 객체를 교체할 일이 생기면 수정할 코드부분이 상당할 것이다. 그러나 제어역전을 통해 객체 관리를 외부에 위임하면 객체 간 의존성을 낮출 수 있고, 의존성을 낮추는 것은 곧 서비스의 유지, 보수가 편해짐을 의미한다.
1.1.2 의존성 주입(DI : Dependency Injection)
외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식을 의미한다. 스프링에서 @Autowired 어노테이션을 통해 의존성을 주입받을 수 있다.
의존성 주입받는 방법 3가지
생성자를 통해 주입받는 방법이 레퍼런스 객체 없이는 객체를 초기화할 수 없기 때문에 추천된다.(오류 사전방지)
1.1.3 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)
AOP는 관점을 기준으로 묶어 개발하는 방식이다. 여기서 관점은 어떤 서비스의 핵심기능 또는 부가기능이 될 수 있다. 가령 날씨 제공 서비스라고 한다면 여기서 핵심기능은 날씨를 조회하는 것, 부가기능은 날씨를 조회하는 과정에서 로그를 남기거나 트랜잭션을 처리하거나 이러한 것들이 있다.
OOP에서는 서비슷를 유지보수를 편리하기 위해, 각 객체를 분리하여 개발하는 것을 추천한다. 따라서 핵심기능은 철저히 OOP관점에서 분류를 하여 개발하는데, AOP는 OOP에 보다 집중할 수 있도록 부가기능들을 하나의 공통 로직으로 모듈화해서 처리하는 방식을 의미한다.
스프링 부트는 스프링 프레임워크의 설정의 복잡성을 피하기 위해 만들어진 것이다. 스프링 프레임워크가 맞춤복이라면, 스프링 부트는 기성복이 아닐까 싶다. 맞춤복은 하나하나 직접 컨트롤 해야 하지만, 기성복은 팔, 다리 기장을 조금 늘리거나, 허리를 좀 늘리거나 줄이거나 해서 입을 수 있는 느낌이다.
1.2.1 의존성 관리
서비스를 개발하다 보면 여러가지 라이브러리를 사용(의존)해야 하는데 스프링 프레임워크에서 직접 설정을 하다보면 각 라이브러리 간 호환되는 버젼이 다를 수 있기 때문에 빡치는 일이 매우 많을 수 있다.
그러나 스프링 부트는 호환되는 버젼의 라이브러리 조합을 제공해 준다.
example : spring-boot-starter-web
1.2.2 자동 설정
스프링 부트는 스프링 프레임워크의 기능을 사용하기 위한 자동 설정을 지원한다. 자동설정을 통해 별도의 설정 없이 기능을 바로 사용가능하도록 한다.
example : spring-boot-configure 패키지 사용
1.2.3 내장 WAS(Web Application Server)
스프링 부트 각 웹 어플리케이션에는 내장 WAS가 존재한다.
example : spring-boot-starter-web에는 톰캣이 내장되어 있음.
1.2.4 모니터링
스프링 부트에는 스프링 부트 액추에이터라는 자체 모니터링 도구가 있다.