Programming/Spring

[Spring] Spring MVC

주죵 2021. 3. 18. 20:29
728x90
반응형

Spring에서 흔히들 사용하는 디자인패턴 혹은 아키텍처인 MVC에대해서 알아봅시다.

 

1. 디자인패턴

디자인패턴은 이런점에서 발생하는 문제점과 개발의 효율성을 위해 나온 다양한 구조들 중 살아남은 "Best Practice" 라고 생각하면 됩니다. 오늘 살펴볼 Spring MVC 프레임워크도 그러한 "Best Practice"가 통상적으로 굳어진 경우입니다.

 

2. MVC란?

MVC라고 하면 Model, V iew, Controller의 앞글자를 따서 만든 단어입니다.

간단히 설명해보자면 Client의 입장에선 View에 해당하는 화면을 바라보며 조작합니다. 그리고 그 화면에 들어가는 데이터를 구현한 것이 Model입니다. Controller는 중간에서 client와 model 사이를 중개하는 중개자의 역할입니다.

사실 말로만 보면 잘 와닿지않습니다.  

 

위의 그림을 보면 좀 더 이해하기가 쉽습니다.

  • View에서 일어난 Client의 Action은 먼저 Controller로 전달됩니다
  • Controller는 그에 따른 변화를 Model에 전달합니다
  • Model은 Controller에게 받은 응답으로 발생한 변화의 결과를 Controller에게 다시 전달합니다.
  • 마지막으로 Controller는 변경된 최종 응답을 View에 전달합니다.

 즉 Controller는 View와 Model 사이의 '중개자'역할을 하고 있습니다.

 

여기서  "왜 굳이 Controller라는 중개자를 두어야할까?" 라는 의문이 들 수 있습니다.

그에대한 많은 답이 있겠지만 간단히 생각해보자면 "효율성, 편리함" 때문입니다.
중간단계 없이 View와 Model사이의 interaction은 프로젝트를 진행함에 있어 action의 처리와 Model의 데이터 정보를 동시에 처리하게되기 때문에 복잡함이 증가할 수 밖에 없습니다. 복잡해진다는건 물론 이후 유지, 보수 측면의 관리도 어려워지죠.

 

3. Spring MVC

Spring은 위의 MVC 디자인패턴을 그대로 도입하여 Spring MVC를 구성했습니다.

 

위에서 다뤘던 MVC패턴이 보입니다. 그외에 눈여겨볼것은 Service Layer, Persistence Layer입니다. (MVC는 Presentation Layer에 속한다고 보시면 됩니다..! 이에 관련된 내용은 J2EE 디자인패턴을 참고해주세요)

DB에 접근할때 Presentation Layer에 속하는 Controller에서 Service Layer로 Service call을 보냅니다. 그러나 Service Layer(Service)에선 직접적인 IO는 일어나지 않고 다시 Persistence Layer(Dao)에 요청하여 DB에 접근합니다.

 

4. Example

역시나 말로 설명하는것보단 직접 보는게 좋겠죠?

아래가 Spring MVC를 적용한 구조라고 보면 됩니다.

  • 프로젝트에서 다룰 데이터(객체)에 대한 정보를 담는 model
  • Client의 action을 중개하는 Controller
  • Service Call에 응답하고 Dao에게 요청을 보내는 Service
  • DB에 관한 IO를 처리하는 Dao

DB에 저장된 데이터를 Dao에서 조회 > Service로 호출 > Controller로 전달 하는 구조입니다.

제가 개발에 주로 사용하는 Java의 경우 Dao에서 JDBC를 이용해 DB와 연동합니다. 물론 JDBC 프로그래밍을 직접 구현할 수 있지만, ORM(대표적으로 JPA, Mybatis 등이 있죠)을 통해 보다 간단히 DB와의 연동되는 시스템을 안정적으로 개발 할 수 있습니다.

 

 

첨부. 전자정부 프레임워크

우리나라 공공관련 개발화 사업에서 기본 프레임워크가 되는 전자정부 프레임워크입니다. Spring MVC 프레임워크와도 유사한점이 많으니 참고해보세요

728x90

'Programming > Spring' 카테고리의 다른 글

[Spring JPA] Transactional Manager  (0) 2022.05.12
[Spring JPA] Entity lifecycle  (0) 2022.04.25
[Spring JPA] 영속성 컨텍스트  (0) 2022.04.24
SpringData JPA 기초  (0) 2022.02.23
[Spring boot] Spring Boot란  (0) 2021.06.20