2022. 2. 21. 02:21ㆍSpring
🏴들어가며
Spring이 있기 전의 방식을 구현해본 사람이라면 스프링이 얼마나 마법 같은지 알 수 있다.
하지만 이 마법같은 것을 이해해야 비로소 마법에서 기술이 되지 않겠는가?
그래서 그 첫 번째 시작을 MVC에서 부터 시작하려 한다.
(MVC는 제록스 연구소에서 일하던 트뤼그베 린즈커그가 처믐으로 소개한 개념으로,
데스크톱 어플리케이션용으로 고안되었다.)
🏴MVC란?
MVC가 뭘까? (MVP 아님)
MVC는 Model View Controller의 약자이다.
그럼 각각의 Model, View, Controller에 대해서 알아봐야할 것이다.
Model은 view가 렌더링하는데 필요한 데이터이다.
간단하게 설명하면 getTasks를 실행할때 Tasks가 있어야 불러오지 않겠는가?
이때 Tasks가 여기에서 Model이다.
View는 웹 어플리케이션에서 실제로 보이는 부분이다. 자바에서는 JSP, XML 등이라고 생각하면 된다.
(스프링을 사용할 정도면 프론트를 보통 따로 둔다...)
Controller는 사용자의 액션에 응답하는 컴포넌트이다. 모델을 업데이트하고, 다른 여러 액션을 수행한다.
계층형 아키텍처의 쓰임새를 통해 본다면 비지니스 로직 정도로 이해하면 되겠다.
이 3개의 요소가 모여서 MVC라고 부른다.
그리고 이러한 형태를 스프링에서 적용한 것이 Spring MVC이다.
🏴MVC의 구조는?
MVC에는 model1 아키텍처가 있고, model2 아키텍처가 있다.
이 문서에서는 Spring에 직접적으로 관련된 MVC model 2 아키텍처에 대해서 알아보기로 하자.
뭔가 Spring의 느낌이 강하게 든다.
클린아키텍처와 대입하면
프론트 컨트롤러 - 컨트롤러
컨트롤러 - 어플리케이션 레이어
모델 - 리포지토리
이정도로 생각하면 되지 않을까 싶다.
🏴그렇다면 Spring MVC의 구조는?
위가 Spring mvc의 구조이다.
파란색은 스프링이 기본적으로 제공해주는 것이고,
보라색은 개발자가 직접 작성해야하는 부분, 연두색은 스프링에서 제공하지만 가끔 개발자가 작성해야하는 것이다.
그럼 순서를 살펴보자.
1번에서 클라이언트가 요청하면 가장 먼저 이 요청을 맞이하는 것이 바로 Dispatcher Servlet이다.
이름에서도 알 수 있듯이 '분배'하는 친구이다.
(어떻게 분배하는지 그 구조를 상세하게 알면 좋지만 이 글에서는 그렇게 자세한 부분은 다루지 않기로 하자.)
이 '분배'하는 친구가 가장 먼저 요청에 대해서 어떤 메서드를 사용하면 좋을지 Handler mapping에게 물어본다.
하지만 이 Handler mapping이라는 친구는 그다지 똑똑하지 않아서 혼자서 알아내지 못한다.
그럼 어떻게 알려줘야할까? 바로 컨트롤러에 있는 어노테이션(annotation, @)이다.
스프링 클래스를 작성하면 @RestController, @Service, @Repository, @xxMapping 등의 어노테이션을 봤을 것이다.
이 어노테이션들이 '내가 컨틀롤러에요', '내가 서비스에요' 하고 알려주는 것이다.
그렇게 하면 실행과 동시에 생성된 핸들러 매핑 객체들이 메서드를 알아차리고 이에 대한 정보를 알아차리는 것이다.
이 알아차린 정보를 가지고 쫄래쫄래 Handler Adapter에게 뛰어가서
'얘 실행하면 돼!' 라고 알려준다.
그제서야 매핑된 메서드가 실행되는 것이다.
그리고 내부로직을 통해서 얻은 결과를 다시 컨트롤러가 View Name에게 전달하고
이 View Name에 대한 정보를 View Resolver가 정보를 view로 넘겨주면서 출력을 하게 된다.
🏴마무리하며
사실 MVC를 이해하기 위해서는 Dispatcher Servlet에 대한 이해가 좀 더 필요하다
여기에 대해서는 다음에 알아보기로 하자.
'Spring' 카테고리의 다른 글
(Spring) JpaRepository는 인터페이스인데 어떻게 동작할까? (0) | 2023.08.31 |
---|---|
(Spring) JPA exists를 최적화하는 여러가지 방법들 (0) | 2022.11.05 |
(Spring) DI/의존 객체 주입 패턴 + Lombok (0) | 2022.09.20 |
(Spring) Transactional 사용법 (0) | 2022.08.10 |
(Spring) Why Maven? Why Gradle? (0) | 2022.08.07 |