본문 바로가기

#Java

Spring에 대해 알아보자 (#MVC패턴? / #Spring의 계층 구조?)

반응형

Spring에 대해 알아보자  (#MVC패턴? / #Spring의 계층 구조?)

 

 

 

 

 

 

 

 

[작성자의 다른 글 보러가기: 'Ajax란 무엇일까? (+ 비동기 프로그래밍에 대해)']

 


 

#개요

 Spring MVC패턴을 실습해보고나서 다시 한번 리뷰해보면서 정리해보고자 이번 피드를 작성하게 되엇습니다. 이번 글에는 크게 두가지 정도의 주제를 다루면서 조금 더 깊이있게 Spring에 대해 공부해보고자 하는데요 그 두가지 주제는 아래와 같습니다.

 

1. Spring의 기본 3가지 계층에는 어떠한 것이 있을까?

2. 위 3가지 계층을 대입해보면서 Spring MVC패턴이 무엇인지 다시금 리뷰해보자.

 

그럼 같이 한번 살펴보도록 할까요?

 

 

 


 

 

 

1. Spring 기본 3가지 계층

 

Spring에서는 기본적으로 3가지의 계층화가 되어있다고 합니다. 이렇게 계층화 하여 나누는 이유는 세분화함으로서 보다 효율적으로 개발을 하고자 함인데요, 기본적인 계층으로는 프리젠테이션 계층(Presentation Layer), 서비스 계층(Service Layer), 데이터액세스 계층(Data Access Layer) 이렇게 3가지 계층과 모든 계층에서 사용되는 도메인 모델 클래스로 구성되어있습니다.

 

각각의 계층은 계층마다 독립적으로 분리하여 구현하는것이 가능해야하고, 각 계층에서 담당해야 할 기능들이 있습니다. 그리고 각 계층사이에는 인터페이스를 이용하여 통신하는 것이 일반적입니다.

 

 

 

 

 

 


 

 

 

# 프리젠테이션 계층 (presentation Layer)  

 

  • 프리젠테이션 계층은 브라우저상의 웹 클라이언트의 요청 및 응답을 처리합니다.
  • 서비스 계층과 데이터 액세스 계층에서 발생하는 Exception에 대한 처리를 하고, 최종 UI에서 표현해야할 도메인 모델을 사용합니다.
  • 최종 UI에서 입력한 데이터에 대한 유효성 검증 기능을 프리젠테이션 계층에서 제공합니다.
  • 비즈니스 로직과 최종 UI를 분리하기 위해서 컨트롤러 기능을 제공합니다.
  • @Controller 어노테이션을 사용합니다.

 


 

 

# 서비스 계층 (Service Layer) 

 

  • 서비스 계층은 애플리케이션 비지니스 로직 처리와 비지니스와 관련된 도메인 모델의 적합성을 검증 합니다.

   (**비즈니스로직이 무엇인지 명확하게 이해가 가지 않는다면, 비즈니스 로직에 대해서 필히 따로 구글링볼 필요가 있다)

  • 트랜잭션(데이터베이스의 상태를 변화시키기 위해 수행하는 작업단위) 처리를 담당합니다.
  • 서비스 계층은 프리젠테이션 계층 데이터 액세스 계층 사이를 연결하는 역할을 합니다.
  • 따라서 다른 계층들과 통신하기 위한 인터페이스를 제공합니다.
  • Service 인터페이스와 @Service 어노테이션을 사용합니다.

 

 


 

# 데이터 액세스 계층 (Data Access Layer)

 

  • 데이터 액세스 계층은 영구 저장소의 데이터를 조작하는 데이터 액세스 로직을 객체화 합니다.
  • 데이터의 CRUD(등록,조회,수정,삭제)를 수행합니다.
  • ORM(Object Relational Mapping) 프레임워크(Mybatis, Hibernate)를 주로 사용하는 계층 @Repository 어노테이션을 사용합니다.

 

 


 

 

# 도메인 모델 클래스

 

  • 관계형 데이터베이스의 엔티티와 비슷한 개념을 가지는 것으로 VO(Value Object) 또는 DTO(Data Transfer Object)객체에 해당합니다.
  • 도메인 모델 클래스는 3개의 계층 전체에 걸쳐 사용됩니다.
  • private로 선언된 멤버변수와 getter,setter 메소드를 가진 클래스를 의미합니다.

 

 


 

 

2. MVC 패턴이란 무엇일까?

 

기본적으로 위키백과사전을 인용해 아래에 있는 MVC패턴의 기본 개념을 살펴보도록 하겠습니다.

모델-뷰-컨트롤러(model–view–controller, MVC)는 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다. 이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다. MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리한다.


출처: MVC - wikipedia

 

 

여기에서 핵심은 MVC 패턴을 사용하면 사용자 인터페이스로부터 비즈니스 로직을 분리하여 비즈니스 로직을 쉽게 고칠 수 있는 애플리케이션이 된다는 것입니다.

 

그리고 과거에는 View에 모든 비즈니스 로직까지 넣어 코드의 길이가 길어지고 유지보수가 힘들었으나 최근에는 MVC모델은 코드를 3가지 형태로 나누어 개발을 하는 MVC가 기본적인 디자인패턴이 되어 사용되고 있다고 합니다.

 

Model, View, Controller 각각 요소에 대해 조금 더 살펴보도록 합니다.

 

 

 


 

# MODEL 

 

  •  Model은 Data와 애플리케이션이 무엇을 할 것인지를 정의하는 부분으로 내부 비즈니스로직을 처리하기 위한 역할을 합니다.
  • 모델은 컨트롤러가 호출을 하면 DB와 연동하여 사용자의 입출력 데이터를 다루는 일과 같은 데이터와 연관된 비즈니스로직을 처리하는 역할을 합니다.
  • 데이터 추출,저장,삭제, 업데이트 등의 역할을 수행합니다.

 

모델은 다음과 같은 규칙을 갖고 있습니다.

 

  • 사용자가 편집하기를 원하는 모든 데이터를 가지고 있어야 합니다.
  • View나 Controller에 대해서 어떤 정보도 알지 말아야 합니다.
  • 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야만 합니다.

 


 

# View 

 

  •  View는 사용자에게 보여주는 화면(UI)이 해당됩니다.
  • 사용자와 상호작용을 하며 컨트롤러로부터 받은 모델의 결과값을 사용자에게 화면으로 출력하는 일을 합니다.
  • MVC에서는 여러개의 View가 존재할 수 있습니다.
  • Model에서 받은 데이터는 별도로 저장하지 않습니다.

 

View는 다음과 같은 규칙을 갖고 있습니다.

 

  • Model이 갖고 있는 정보를 따로 저장해서는 안됩니다.
  • Model이나 Controller와 같이 다른 구성요소들을 몰라야 합니다.
  • 변경이 일어나면 변경 통지에 대한 처리방법을 구현해야만 합니다.

Model과 View는 서로의 존재를 몰라야 합니다.

 

 

 


 

 

 

# Controller 

 

  • Controller는 Model과 View사이를 이어주는 인터페이스 역할을 합니다.
  • Model이 데이터를 어떻게 처리할지 알려주는 역할을 합니다.
  • 사용자로부터 View에 요청이 있으면 Controller는 해당 업무를 수행하는 Model을 호출하고 Model이 업무를 모두 수행하면 다시 결과를 View에 전달하는 역할을 합니다.

 

Controller는 다음과 같은 규칙을 갖고 있습니다.

 

  • Model이나 View에 대해서 알고 있어야 합니다.
  • Model이나 View의 변경을 모니터링 해야 합니다.

 

 

 


 

 

 

# MVC의 구동원리

 

MVC패턴은 Spring 프레임워크와 JSP를 사용하는 웹 애플리케이션 개발에 많이 사용되고 있습니다. 이때의 웹 애플리케이션에서의 MVC 구동원리는 다음과 같습니다.

 

1.웹 브라우저가 웹 서버에 웹 애플리케이션 실행을 요청한다. (MVC구조가 WAS라고 보면 된다.)

 

2. 웹 서버는 들어온 요청을 처리할 수 있는 서블릿을 찾아서 요청을 전달한다. (Matching)

 

3. 서블릿은 모델 자바 객체의 메소드를 호출한다.

 

4. 데이터를 가공하여 값 객체를 생성하거나, JDBC를 사용하여 데이터베이스와의 인터랙션을 통해 값 객체를 생성한다.

 

5. 업무 수행을 마친 결과값을 컨트롤러에게 반환한다.

 

6. 컨트롤러는 모델로부터 받은 결과값을 View에게 전달한다.

 

7. JSP는 전달받은 값을 참조하여 출력할 결과 화면을 만들고 컨트롤러에게 전달한다.

 

8. 뷰로부터 받은 화면을 웹 서버에게 전달한다.

 

9. 웹 브라우저는 웹서버로부터 요청한 결과값을 응답받으면 그 값을 화면에 출력한다.

 

 

 

 


 

 

 

 

# MVC의 장점

 

  • 기능별로 코드를 분리하여 하나의 파일에 코드가 모이는 것을 방지하여 가독성과 코드의 재사용이 증가한다

 

  • 각 구성요소들을 독립시켜 협업을 할 때 맡은 부분의 개발에만 집중할 수 있어 개발의 효율성을 높여준다.

 

  • 개발 후에도 유지보수성과 확장성이 보장된다.

 

 

 


 

 

# MVC의 한계

 

Model과 View는 서로의 정보를 갖고 있지 않는 독립적인 상태라고 하지만 Model과 View사이에는 Controller를 통해 소통을 이루기에 의존성이 완전히 분리될 수 없습니다. 그래서 복잡한 대규모 프로그램의 경우 다수의 View와 Model이 Controller를 통해 연결되기 때문에 컨트롤러가 불필요하게 커지는 현상이 발생하기도 합니다. 이러한 현상을 Massive-View-Controller현상이라고 하며 이를 보완하기 위해 MVP,MVVM,Flux,Redux등의 다양한 패턴들이 생겨났습니다.

 

 

 


 

# Service와 dao의 차이

 

 

두가지 차이에 대해 생각해보기위해 앞서 언급했던 Controller를 포함한 각 영역별 주요 역할을 쉽게 정리해보면

 

 

Controller :

      - 사용자의 Request를 전달받아 요청의 처리를 담당하는 Service를 호출

 

Service :

     -  Controller에 의해 호출되어 실제 비즈니스 로직과 트랜잭션을 처리

     -  dao를 호출하여 DB CRUD를 처리 후 Controller로 반환

 

dao :

      - Service에 의해 호출되어 DB CRUD를 담당

 

mapper :

      - dao에서 요청하는 실제 쿼리문이 위치하는 곳

 

 

단순하게 페이지를 불러오고 DB정보를 한번에 불러오는 간단한 프로젝트의 경우 Service와 dao의 차이가

거의 없을 수 있다. 

 

Service는 사용자가 요청한 작업을 처리하는 과정을 하나의 작업으로 묶은 것이고,

dao는  CRUD작업을 하나씩 분할해 놓은 것이다.

 

사용자가 한번의 요청으로 단순히 페이지 이동이 필요하다면 select와 같은 단순히 하나의 dao만 작동하기 때문에 Service와 dao를 나눌 필요가 없는 것처럼 보이지만, 사용자가 글을 작성하거나 수정하는 것과 동시에 페이지가 이동되어야 한다면 update, select가 작동하기 때문에 여러 dao를 Service안에 조립하는 로직을 갖게 된다.

 

 

 

 

 

 

 

 

 


 

'#Java' 카테고리의 다른 글

JSON / XML 이란 무엇일까? (부제: literal / property란 무엇일까?)  (0) 2022.12.30
Java란 무엇인가?  (0) 2022.12.22