안녕하세요! 보라입니다💜
얼마 전 UMC(University Makeus Challenge) 서버 10주차 트랙이 끝났는데요! 지금은 트랙의 연장 선인 앱 개발 프로젝트를 위한 팀이 빌딩 되었고, 이제 막 프로젝트 초반 단계에 있습니다😃
사실 트랙을 진행하는 동안 저는 Spring과 Spring boot라는 용어들을 혼용하여 사용했습니다. 정확한 개념을 모르고 있었기 때문입니다. 그래서 오늘의 포스팅은 Spring과 Spring boot에 대해 다루어 보겠습니다😁
Spring은 JAVA를 기반으로 하는 웹 어플리케이션 프레임워크입니다. (비슷한 프레임워크로는, Python을 기반으로 하는 Django, Javascript를 기반으로 하는 Node.js 등이 있습니다.)
기본적으로 Spring은 JAVA 객체들과 라이브러리들을 관리해주고, 톰캣이라는 WAS(Web Application Server)가 내장되어 있어 자바 웹 어플리케이션 구동이 가능합니다.
Spring은 경량 컨테이너이며, 자바 객체를 직접 Spring 안에서 관리합니다. 객체의 생성 및 소멸과 같은 생명 주기(Life cycle)을 관리하며, Spring 컨테이너에서 필요한 객체를 가져와 사용합니다. 여기서 중요한 두 개념이 등장합니다.
IOC (Inversion Of Control, 제어의 역전)
사용자의 제어권을 다른 주체에게 넘기는 것을 의미합니다.
일반적으로 자바 프로그램에서는 각 객체들이 프로그램의 흐름을 결정하였고, 각 객체를 직접 생성하고 조작하는 등, 모든 작업을 사용자가 제어하는 구조였습니다.
하지만 IOC가 적용된 Spring에서는 객체의 생성을 특별한 관리 위임 주체(Spring)에게 맡깁니다. 사용자는 객체를 직접 생성하지 않게 되고, 관리 위임 주체가 객체의 생명주기를 컨트롤하게 됩니다.
DI (Dipendency Injection, 의존성 주입)
객체를 외부에서 생성해서 사용하려는 주체 객체에게 주입해주는 방식을 의미합니다. (서비스와 컴포넌트도 마찬가지!)
예를 들면, MyController에서 MyService 객체를 사용하고 싶을 때, 일반적인 자바 프로그램에서는 MyController 안에서 MyService 인스턴스를 만들어 사용했을 것입니다. 하지만, DI가 적용된 Spring에서는 MyService 객체를 외부(Spring)에서 생성하고, 주체 객체인 MyController에 주입시켜 사용합니다.
이러한 특징들은 객체끼리의 의존성을 낮춥니다. 의존성이 낮아진다는 것은 변경 사항이 생겨도 서로에게 영향을 많이 주지 않는다는 것을 의미하며, 이로 인해 단위테스트가 용이해집니다.
DJ (Dipendency Lookup, 의존성 검색)
DI와는 반대로, 필요한 객체를 주체 객체에 주입 받는 방식이 아닌, 주제 객체에서 직접 검색하는 방식을 의미합니다.
이때, 주체 객체는 인터페이스 타입을 지정해서 검색할 뿐, 해당 인터페이스를 구현한 인스턴스에 대한 결정과 생명 주기는 IOC 컨테이너에서 책임집니다.
Spring Boot는 Spring을 사용할 때 사용자가 설정해야하는 부분을 자동화하여 더 쉽게 사용할 수 있도록 해주는 서브 프로젝트입니다.
기존의 Spring은 설정할 것이 너무 많았고, 의존성 관리가 힘들며, 배포가 어렵다는 문제점들이 있었습니다.
이러한 문제점을 해결하기 위해 등장한 것이 Spring Boot입니다. AutoConfiguration Annotation(자동 설정 주석, @ 기호를 앞에 붙여 사용함)을 이용하여 자동 설정을 할 수 있습니다.
다음 포스팅에서는 이러한 스프링 어노테이션에 대해서 자세하게 다루어보겠습니다!
https://melonicedlatte.com/2021/07/11/174700.html
https://hello-bryan.tistory.com/319
https://velog.io/@dusdn2424/%EC%8A%A4%ED%94%84%EB%A7%81-Spring-IoC-DI-DL-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC