Spring

Spring MVC

NYoun 2021. 2. 16. 15:22

Spring MVC

  Spring MVC는 Web Application 개발을 위한 Framework로 architecture에는 MVC 패턴을 채택하고 있다.

  이와 비슷한 역할을 하는 프레임워크로는 스트럿츠(Struts)와 JSF(Java Server Faces)가 유명한데, 이러한 MVC 패턴을

  적용한 프레임워크들은 크게 액션기반 프레임워크와 컴포넌트 프레임워크로 나눌 수 있다.

 

  액션기반 프레임워크는 요청에 따라 실행할 처리행위(action)를 결정하고, 처리결과로 HTML과 같은 응답을 반환하는

  프레임워크다. Spring MVC나 스트럿츠가 액션기반의 프레임워크에 해당하며, 구조가 단순해서 이해하기가 쉽고

  확장성이 높다는 특징이 있다.

 

  반면 컴포넌트 기반 프레임워크는 요청과 응답을 추상화(은폐)하고, 화면을 구성하는 컴포넌트를 기반으로

  web Application을 개발하는 프레임워크다. JSF는 컴포넌트 기반의 프레임워크이며, 버튼이나 입력 필드 등의 화면

  부품을 공통화 할 수 있어 재사용하기 쉽다는 특징이 있다.

 

  Spring MVC는 3.0에서 크게 개선되었다. POJO(Plain Old Java Object)형태로 구현하는 방식이나

  Annotation 기반 설정, Servlet API의 추상화, Spring DI Container와의 연계, 풍부한 확장 기능을 지원하고, 

  각종 서드파티 라이브러리(3rd-party Library, Third party Library)와의 연계와 같은 다양한 특징과 함께

  엔터프라이즈 시스템 개발에 필요한 기능을 갖추고 있다.

 

  지원하는 서드파티 라이브러리로는 JSON을 다루기 위한 Jackson, 템플릿 엔진인 Apache Tiles와 FreeMarker,

  RSS나 Feed를 처리하기 위한 Rome, 보고서를 출력하기 위한 JasperReports, bean 검증을 위한

  Hibernate vaildator, 날짜나 시간 정보처리를 위한 Joda-Time등이 있다.

  그밖에도 템플릿엔진 역할을 하는 Thymeleaf같이 서드파티 라이브러리 자체가 Spring을 지원하는

  형태도 있다.

 

  MVC패턴을 적용한 Web Application은 Model, View, Controller와 같은 세가지 역할의 컴포넌트로 구성되어

  클라이언트의 요청을 처리한다.

  각 컴포넌트에 의한 일반적인 처리흐름은 다음과 같다.

  MVC 패턴에서 각 컴포넌트의 역할

컴포넌트명

설명

모델(Model)

Application 상태(데이터)나 비즈니스 로직을 제공하는 컴포넌트

데이터 디자인을 담당한다. ) 상품목록, 주문내역 등

(View)

모델이 보유한 Application 상태(데이터)를 참조하고 클라이언트에 반환할 응답 데이터를 생성하는 컴포넌트

실제로 렌더링되어 보이는 페이지를 담당한다. ) jsp, Html 파일들이 여기에 해당

컨트롤러(Controller)

요청을 받아 모델과 뷰의 호출을 제어하는 컴포넌트로 컨트롤러라는 이름처럼 요청과 응답의 처리 흐름을 제어한다.

사용자의 요청을 받고 응답해주는 로직을 담당한다. ) GET등의 uri매핑이 여기에 해당

 

  Spring MVC는 MVC 패턴을 채택한 프레임워크라고 했지만 정확히 말하면 프론트 컨트롤러(Front Controller)를 채택한

  것이다. 프론트 컨트롤러 패턴은 MVC 패턴이 가진 약점을 개선한 아키텍처 패턴으로서 많은 MVC 프레임워크에서

  사용된다. 프론트 컨트롤러 패턴은 다음 포스팅에 작성한다.

 

 

WebApplication개발의 특징

  Spring MVC는 Web Application 을 매우 편리하게 개발할 수 있는 프레임워크로 다음과 같은 특징이 있다.

  

  ● POJO(Plain Old Java Object) 구현

      컨트롤러나 모델등의 클래스는 POJO형태로 구현된다. 특정 프레임워크에 종속적인 형태로 구현할 필요가 없기

      때문에 단위 테스트를 하는 것이 상대적으로 수월해진다.

 

  ● Annotation을 이용한 정의 정보 설정

      요청 매핑과 같은 각종 정의 정보를 설정파일이 아닌 Annotation방식으로 설정할 수 있다.

      비즈니스 로직과 그 로직을 수행하기 위한 각종 정의 정보를 자바파일 안에서 함께 기술할 수 있기 때문에

      효율적으로 Web Application을 개발할 수 있다.

 

  ● 유연한 메서드 시그니처 정의

      컨트롤러 클래스의 메서드 매개변수에는 처리에 필요한것만 골라서 정의할 수 있다. 인수에 지정할 수 있는

      타입도 다양한 타입이 지원되며, 프레임워크가 인수에 전달하는 값을 자동으로 담아주거나 변환하기 때문에

      사양변경이나 리펙토링에 강한 아키텍처를 갖고 있다. 반환값도 다양한 타입을 지원한다.

 

  ● Servlet API 추상화

      Spring MVC는 Servlet API(HttpServletRequest, HttpServletResponse, HttpSession 등의 API)를 추상화 하는

      기능을 제공한다. Servlet API를 추상화한 구조를 이용하면 컨트롤러 클래스 구현에서 Servlet API를 직접

      사용하는 코드가 제거되기 때문에 컨트롤러 클래스의 테스트가 Servlet API를 사용할때보다

      상대적으로 쉬워진다.

 

  ● View 구현 기술의 추상화

      컨트롤러는 뷰 이름(뷰의 논리적인 이름)을 반환하고 Spring MVC는 뷰 이름에 해당하는 화면이 표시되게

      한다. 이처럼 컨트롤러는 뷰 이름만 알면 되기 때문에 그 뷰가 어떤 구현기술(JSP, Thymeleaf, Servlet API,

      FreeMarker 등)로 만들어졌는지 구체적인 내용을 몰라도 된다.

  

  ● Spring DI Container와의 연계

      Spring MVC는 Spring의 DI Container상에서 동작하는 프레임워크다.

      스프링의 DI Container가 제공하는 DI(Dependency Injection)나 AOP(Aspect Oriented Programming) 같은

      구조를 그대로 활용할 수 있어 Web Application을 효과적으로 개발할 수 있다.

 

  Spring MVC는 Servlet API를 추상화하는 메커니즘을 제공하는 반면에 Servlet API를 직접 사용할 수도 있다.

  쿠키(Cookie)에 데이터를 쓰는것과 같은 일부 작업은 Servlet API를 직접 사용하지 않으면 구현할 수 없는

  경우도 있다.

 

 

Spring MVC의 특징을 잘 살려서 만든 Controller 클래스의 예

 

@Controller
public class WelcomeController {
  
  @Autowired
  MyService myService;
  
  @RequestMapping("/")
  public String home(Model model) {
    Date now = myService.getCurrentDate();
    model.addAttribute("now", now);
    
    return "home";
  }
}

 

MVC Framework로서의 특징

  Spring MVC는 높은 확장성과 Enterprise Application이 필요로 하는 기능을 갖춘 MVC 프레임워크로서

  다음과 같은 특징이 있다.

 

  ● 풍부한 확장 포인트 제공

      Spring MVC에서는 컨트롤러나 뷰와 같이 각 역할별로 필요한 인터페이스를 제공한다. 그래서 기본 동작을

      확장하고 싶다면 인터페이스를 자신만의 방법으로 구현하면 된다. 이러한 인터펭이스는 커스터마이징을 유연하고

      쉽게 만들어주는 확장점이 된다.

 

  ● Enterprise Application에 필요한 기능 제공

      Spring MVC는 단순히 MVC 패턴의 프레임워크 구현만 제공하는 것이 아니다.

      메시지 관리, 세션 관리, 국제화, 파일 업로드와 같은 엔터프라이즈 애플리케이션 용 웹 애플리케이션을 개발할 때

      필요한 다양한 기능들도 함께 제공한다.

 

  ● 3rd-party Library와의 연계 지원

      Spring MVC는 서드파티 라이브러리를 이용할 때 필요한 각종 어댑터를 제공하며 다음과 같은 라이브러리를

      Spring MVC와 연계해서 사용할 수 있다.

       ○ Jackson(JSON / XML 처리)

       ○ Google Gson(JSON 처리)

       ○ Google Protocol Buffers(Protocol Buffers로 불리는 직렬화 형식 처리)

       ○ Apache Tiles(레이아웃 엔진)

       ○ FreeMarker(템플릿 엔진)

       ○ Rome(RSS/Feed 처리)

       ○ JasperReports(보고서 출력)

       ○ ApachePOI(엑셀처리)

       ○ Hibernate Validator(bean 유효성 검증)

       ○ Joda-Time(날짜 / 시간 처리)

      

      또한 서드파티 라이브러리 자체가 Spring MVC와의 연계를 지원하는 형태도 있다.

       ○ Thymeleaf(템플릿 엔진)

       ○ HDIV(보안 강화)

 

 

전반적인 모듈 구성

 

  ● Config

      각종 설정 클래스 파일을 담고 있다.

      클래스 앞에 @Configuration이 붙는다.

      WebMVC 설정 관련 Config를 제외하고 나머지는 모듈화 한 뒤 Application에서 모두 import한다.

 

  ● Controller

      각종 컨트롤러 클래스 파일들을 담고 있다.

      클래스 앞에 @Controller가 붙는다.

      각 컨트롤러 코드는 URI 매핑을 담당한다.

      Service 인스턴스를 가져와 로직을 실행하고 View단에 나가기 전후 작업을 담당한다.

 

  ● DAO(Data Access Object)

      DB에 대해 접근할 때 사용하는 클래스 파일들을 담고 있다.

      클래스앞에 @Repository가 붙는다.

      실제 DAO클래스와 사용할 SQL만을 담고 있는 클래스가 따로 모듈화해서 사용된다.

      DAO가 아닌 Mapper로 사용하는 경우도 있다.

      Mapper의 경우는 DAO와 차이가 있다.

 

  ● DTO(Data Transfer Object)

      데이터를 모델링한 클래스 파일들을 담는다.

      필드(프로퍼티)와 Getter, Setter를 갖는다.

      VO(Value Object)로 사용하는 경우도 많지만 둘은 차이가 있다.

 

  ● Service

      서비스 로직을 담는 클래스 파일들을 담고 있다.

      클래스앞에 @Service가 붙는다.

      Interface로 핵심 로직을 먼저 정의한 후에 클래스로 구현한다.

      필요한 경우네는 DAO를 직접 사용하는 클래스다.

 

 

 

레퍼런스

● 스프링 철저 입문

 dailyheumsi.tistory.com/159

 

 m.blog.naver.com/PostView.nhn?blogId=scw0531&logNo=220984890046&proxyReferer=https:%2F%2Fwww.google.com%2F