Spring Overview
스프링 부트
- 스프링 부트를 이용하면 스탠드얼론 프로덕션급의 스프링 기반 애플리케이션을 쉽게 구동할 수 있다.
- 스탠드얼론이란 애플리케이션 실행 시 다른 애플리케이션이 필요하지 않다는 뜻이다.
- 스탠드얼론이 아닌것은 아파치 톰캣같은 웹 서버/서블릿 컨테이너가 필요한 경우이다.
스프링 프레임워크와 디스패처 서블릿
- 클라이언트가 http 리퀘스트를 보내게 되면 서버(서블릿 컨테이너-아파치 톰캣)로 들어가게 되는데
서버 로직 > HttpServlet 서브 클래스 실행 > 서버 로직
처리 후 http 리스폰스가 클라이언트로 들어가게 된다. - 서블릿 기반의 서버를 사용하려면
javax.servlet.http.HttpServlet
을 상속받는 서브 클래스를 작성해야 한다. - HttpServlet 서브 클래스에는 아래와 같은것이 있다.
public class Hello extends HttpServlet {
//HttpServlet 상속받은 서브 클래스 만들고 doGet()메소드 구현해야 한다.
@Override
public class doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//HttpServletRequest에서 원하는 정보를 추출할 수 있다.
// parameter 해석
String name = request.getParameter("name");
//business logic 실행
process(name)
//response 구축
//HttpServletResponse에 반환할 정보를 담는다.
out.print("<html>");
//UI 부분
out.print("</html>");
}
}
- 얼핏 보면 좋아보이지만 API 하나 만들 때마다 이 작업을 반복해야 한다.
- 그래서 스프링 부트를 사용한다. 위에서 작성한것을 아래에 다시 작성해보면
- 클라이언트가 http 리퀘스트를 보내게 되면 서버(서블릿 컨테이너-아파치 톰캣)로 들어가게 되는데
스프링 부트 DispatcherServlet 실행 (비즈니스 로직 클래스 포함)
처리 후 http 리스폰스가 클라이언트로 들어가게 된다. - 스프링 부트가 제공하는 어노테이션과 인터페이스를 이용해 스프링 비즈니스 로직을 이해한다.
- 결과적으로 반복적으로 서블릿 클래스를 작성하지 않아도 된다.
1. HttpServlet 상속하지 않아도 된다.
2. doGet 오버라이드 하지 않아도 된다.
3. HttpServletReqeust 직접 파싱하지 않아도 된다.
4. HttpServletResponse 작성하지 않아도 된다.
메인 메서드 그리고 @SpringBootApplication
- @SpringBootApplication 어노테이션이 달린 클래스가 있는 패키지를 베이스 패키지로 간주한다.
- 스프링에서는 의존성 주입 컨테이너로서 작동한다.
- 스프링에서는 베이스 패키지와 그 하위 패키지에서 자바빈을 찾아 스프링 의존성 주입 컨테이너 오브젝트들을 ApplicationContext에 등록한다.
- 자동으로 다른 오브젝트를 찾아 연결하는것은 @Autowired를 사용한다.
- @Component 는 자바 빈으로 등록한다. (단, @ComponentScan 어노테이션 클래스가 있어야 한다. 이것은 @SpringBootApplication에서 포함하고 있다.)
만약, @Component를 추가하지 않고, 스프링을 통해 빈을 관리하고 싶다면?
- @Bean을 사용하면 된다.
- 엔터프라이즈 애플리케이션 경우 @Autowired를 사용하지 않는 경향이 있다.
- 오브젝트를 관리하기 위함
- 빈 관리를 하기 위해서 @Bean을 사용한다.
- 오브젝트를 정확히 어떻게 생성해야 하는지
- 매개변수를 어떻게 넣어줘야 하는지 알려줄 수 있다.
- Gradle 빌드 자동화 툴로 사용한다.
- 빌드 자동화 툴을 이용하면 컴파일, 라이브러리 다운로드, 패키징, 테스팅을 자동화할 수 있다.
- 빌드 자동화 툴이 없으면 jar파일을 다운받아야 한다.
Gradle이 없으면
- 프로젝트가 커지게 되면 여러 가지 빌드를 나눠 작업해야 할 수 있다.
- 여기서 디펜던시가 있으면 빌드 순서를 고려해야 한다.
- 빌드 자동화 툴이 없으면 개발자가 모든 라이브러리를 컴파일해 빌드를 하고 유닛 테스트를 실행시키는 작업을 해야 한다.
group = 'com.example' //artifact(애플리케이션) 배포하는데 사용
//Spring Initializer의 Project Metadata에 정의한 Group과 동일함
version = '0.0.1-SNAPSHOT' //프로젝트 버전이다.
sourceCompatibility = '1.8' //자바 버전을 이용해 소스를 컴파일 한다.
dependencies {
//lombok을 사용하는것을 알려준다.
annotationProcessor 'org.projectlombok:lombok'
}
//라이브러리를 다운로드 하는 곳을 리포지터리라고 부른다.
repositories{
mavenCentral()
maven {
url 'https://repo.spring.io/milestone'
}
maven {
url 'https://repo.spring.io/snapshot'
}
}
//사용할 라이브러리를 명시하면 리포지터리에서 라이브러리를 다운 및 설치한다.
dependencies {
...
}
//그래들을 사용하면 빌드뿐 만 아니라 유닛 테스트도 실행할 수 있다.
test{
//JUnit을 이용해 유닛 테스트를 하도록 명시
userJUnitPlatform()
}