Spring?
Java 개발자들에게 많이 친숙한(?) 나뭇잎 모양의 로고입니다
이 그림을 어디서 볼 수 있냐면
Intellij 라든가.. 인텔리제이 라든가.. 인텔리제이 라든가..
아무튼 스프링이 무엇일까요?
제가 생각하는 Spring이란..
Spring Framework = DI(Dependency Injection) + MVC(Model View Controller)
+ WAS(Web Application Server)
입니다
어디선가 들어본 용어들이 난무하죠?
DI는 흠 의존성 주입인데 뭔지 잘 모르겠고,
MVC는 그냥 뷰랑 모델이랑 컨트롤러 분리하는 거고,
WAS는 그냥 웹 서버를 의미하는 거고 끝~!
자자, 우리는 이렇게 간단하게 공부하고 넘어가서는 안되기에 차근차근히 알아보는 것을 목표로 합시다
3가지 구성요소들은 Spring의 핵심 요소를 나타낸 것이에요!
왜 저런 3가지를 제가 기본 구성요소로 삼았을까요?
우리는 Spring Document를 다시 볼 필요가 있습니다
The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.
A key element of Spring is infrastructural support at the application level: Spring focuses on the "plumbing" of enterprise applications so that teams can focus on application-level business logic, without unnecessary ties to specific deployment environments.
아 영어 너무 어려워요.. 대충 번역기 돌려볼께요
Spring Framework는 모든 종류의 배포 플랫폼에서 최신 Java 기반 엔터프라이즈 애플리케이션을 위한 포괄적인 프로그래밍 및 구성 모델을 제공합니다.
Spring의 핵심 요소는 애플리케이션 레벨에서의 인프라 지원입니다. Spring은 특정 배포 환경에 불필요한 연결 없이 팀이 애플리케이션 레벨 비즈니스 로직에 집중할 수 있도록 엔터프라이즈 애플리케이션의 "배관"에 초점을 맞춥니다.
핵심은 제가 밑줄을 쳐놓았습니다!
Spring은 비즈니스 로직에 집중할 수 있게 도와주는 Framework입니다.
한마디로, 틀은 내(Spring)가(이) 잡아줄게, 개발자 너는 도메인(Domain) 로직만 신경써!
Dependency Injection(의존성 주입)을 통해서 Spring Container가 Bean(객체)을(를) 생성하고,
MVC(Model View Controller)를 분리해서 도메인(=Model) 로직에 집중하고,
WAS(Web Application Server)에 대한 환경설정을 알아서 제공해줄테니까
개발자 너는 개발이나해!!
정말 간단하죠?
물론 깊이 파면 팔수록 어렵고 힘든게 Spring이지만,
저는 Framework를 사용하는 입장에서는 알아야될 항목들만 공부하면 된다고 생각합니다.
그래서, Spring을 핵심적인 3가지 요소로 분리해서 정의했습니다.
그러면, 제가 언급한 항목들에 대해서 디테일하게 알아보도록 할까요?
DI(Dependency Injection)
DI란?
-> 의존성을 특정 객체에 주입(=합성) 하는 것 입니다.
역시나 Code로 나타내는 것이 편하겠죠?
예시를 하나 들어볼께요
Cafe라는 도메인이 있어요. 우리는 Cafe를 관리자적인 입장에서 도메인 로직을 작성해볼까해요.
Cafe를 관리하는 사람은 누가 될까요? 바로 바리스타(Barista)입니다.
그렇다면 Cafe는 Barista에 의해서 의존이 되겠네요?
다이어그램을 보시면 아시겠지만, Cafe가 Barista를 향하고 있습니다!
크게 의존성을 주입하는 방식은 3가지가 있는데,
- 생성자를 통한 주입
- setter를 통한 주입
- Interface를 통한 주입
입니다.
1,2번 방식은 컴파일 타임에 의존성을 주입할 수 있고, 3번 방식은 런타임에 의존성을 주입할 수 있는 특징이 있습니다.
저는 보통 1,3번 방식을 추천합니다
* setter는 Domain 로직에 남발하면 OOP에 좋지 않습니다
위 다이어그램을 코드로 나타내면, 다음과 같겠군요
class Cafe {
private Barista barista;
// 1번 의존성 주입
Cafe(final Barista barista) {
this.barista = barista;
}
// 2번 의존성 주입
void setBaristar(final Barista barista) {
this.barista = barista;
}
}
3번 방식의 경우.. 소개글이 너무 길어질까봐ㅠㅠ 링크로 대체합니다
제가 작성한 DIP(Dependency Inversion Principle) 예제에 Interface기반 의존성 주입이 된 코드입니다.
이제 DI가 무엇인지 감이 오시죠?
실제로, Spring Container에서 Bean을 어떻게 생성하냐면..
개발자가 작성한 비즈니스 로직(Domain Object)를 Container에 DI(의존성 주입)을 통해서 Bean을 생성하게 됩니다.
이를 통해서, WebApplication을 계층화(Controller, Service, Repository, Domain)를 할 수 있게 되는거죠!
이는 매우 중요한 포인트 중에 하나입니다!
벌써부터 Model과 Controller가 분리된 것이 보이시나요?ㅎㅎ
그럼 대체 왜 Model Controller를 분리하는 것이 좋을까?
의문점이 생기실텐데, 차근차근히 더 알아보도록 합시다!
MVC(Model View Controller)
Spring에서는 DispatcherServlet이 MVC의 패턴의 주축이 되서 활용하고 있는데요,
URL Mapping을 통해서, Mappipng된 결과에 맞게 Controller를 호출하고 로직이 진행되게 됩니다.
흔히 Controller에서는 요청된 URL에 맞는 Service를 통해서, Domain로직을 진행하고 이에 대한 결과값을 Model에 담아서 리턴하게 됩니다.
@Controller
public class LottoController {
@RequestMapping("/lotto")
public String lotto(final Model model) {
String attributeValue = "lotto";
model.addAttribute("lotto", attributeValue);
return "lotto";
}
}
위 코드가 실제 MVC 패턴의 흐름 예제
해당 View에 맞는 값을 담아서 리턴하게 되면, ViewResolver를 통해서 어떤 View를 통해서 보여줄 것인지 결정하게 됩니다!
이것이 Spring에서 전체적으로 흘러가는 로직의 흐름입니다.
그럼 이것이 왜 MVC 패턴일까요?
다이어그램을 보시면 아시다시피, Model & View & Controller 는 철저히 독립되어 있습니다.
3가지 요소 중에서 의존성이 서로 생기게 되면, 변경에 매우 취약하고, 변경시 종속되어 있는 모든 로직을 수정해야 되기 때문이죠.
흔히 View에서 버튼을 하나 만들었을 뿐인데, 모든 로직을 수정해야 되는 일이 생긴다면 참 안타까운 일이지 아닌가 싶습니다.
그럼 이 DispatcherServlet은 누가 작동시키는 것일까요?
바로 내장된 WAS(Web Application Server)입니다.
WAS(Web Application Server)
Spring에서는 많은 것을 지원하고 있지만, 가장 자랑할만한 것이 바로 내장 WAS(Web Application Server)입니다.
예전에는 Spring을 가동시키기 위한 Tomcat을 따로 설치했지만,
버젼이 점점 증가됨에 따라 Spring Framework자체에 WAS가 들어가기 시작했습니다.
기본적인 셋팅(Default)은 Tomcat이나, web-flux를 사용하게 된다면, Netty로 지정되게 됩니다!
더군다나 최신 Spring Boot에서는 WAS의 종류를 선택할 수 있는 기능까지 제공되죠.
정말 개발자로써는 최고의 환경을 만들어주는 것이 아닐까 싶습니다.
더 이상 WAS에 대한 설치를 하는 번거로움을 할 필요가 없으니까요
Spring은 이처럼 우리 개발자에게 많은 것을 제공해주는 거대한 Framework입니다
구동환경을 빠르게 설정하고, 배포에 중점시켜서 Domain개발에 집중할 수 있게 도와주니까요~!
이제 천천히 차근차근
이 거대한 Spring에 대해 학습해보는 시간을 가질까 합니다!!
참고
의존성 주입
Spring Core Technologies
'Developer > Spring' 카테고리의 다른 글
Spring AOP의 원리 - CGlib vs Dynamic Proxy (11) | 2020.08.18 |
---|---|
Spring에서 API 문서를 자동화하는 방법 - Spring REST Docs (0) | 2020.06.22 |
Spring Boot 에서 log를 남기는 방법 - Spring log 남기기 (4) | 2020.06.13 |
Spring Valid - 스프링에서 Reqeust Body를 Validation 하는 방법 (0) | 2020.05.08 |
Spring Mapstruct - Java Entity DTO 매핑을 편하게 하자! (6) | 2020.03.25 |