POJO란 무엇인가?

스프링의 목적은 애플리케이션 개발의 복잡함을 줄여주는 것 또는 효과적으로 대응하게 해주는 것입니다.
스프링이 지향하는 목적은 스프링은 엔터프라이즈 서비스 기술과 POJO라는 애플리케이션 로직을 담은 코드를 분리했다는 뜻입니다.
분리됐지만 반드시 필요한 엔터프라이즈 서비스 기술을 POJO방식으로 개발된 애플리케이션 핵심 로직을 담은 코드에 제공한다는 것이 스프링의 가장 강력한 특징과 목표입니다.

 

스프링의 핵심 POJO

스프링은 애플리케이션은 POJO를 이용해서 만든 애플리케이션 코드와, POJO가 어떻게 관계를 맺고 동작하는지를 정의해놓은 설계정보로 구분됩니다.
DI의 기본 아이디어는 유연하게 확장 가능한 오브젝트를 만들어두고 그 관계는 외부에서 다이내믹하게 설정해준다는 것입니다.
이런 DI의 개념을 애플리케이션 전반에 걸쳐 적용하는 것이 스프링의 프로그래밍 모델입니다.
스프링의 주요 기술인 IoC/DI, AOP와 PSA는 애플리케이션을 POJO로 개발할 수 있게 해주는 가능 기술이라고 불립니다.

 

 

POJO란 무엇인가?

POJO는 Plain Old Java Object의 첫 글자를 따서 만든 약자입니다.
최근 몇 년간 자바에서 유행어처럼 사용되고 있는 이 단어는 마틴 파울러가 2000년에 컨퍼런스 발표를 준비하다가 만들어낸 용어라고 합니다.
당시 인기가 있던 EJB는 복잡하고 제한이 많은 기술이었습니다.
EJB를 사용하는 것보다 자바의 단순한 오브젝트를 이용해 애플리케이션의 비즈니스 로직을 구현하는 편이 낫다고 판단한 마틴 파울러는 개발자들이 왜 자바의 단순한 오브젝트를 사용하지 않는지 찾아보았습니다.
이유는 단순히 EJB와 같은 이름이 없어서였습니다.
그래서 POJO라는 이름을 붙인 후 POJO프로그래밍에 대한 개발자들의 관심이 높아졌고 POJO를 지원한다는 걸 장점으로 내세우는 많은 프레임워크와 기술들이 나오기 시작했습니다.

 

POJO의 조건

특정 규약에 종속되지 않는다.
POJO는 자바 언어와 꼭 필요한 API 외에는 종속되지 않아야 합니다.
스트럿츠 1과 같이 특정 클래스를 상속해서 만들어야 하는 규약이 있는 경우에도 POJO가 아닙니다.
스트럿츠는 MVC 패턴에서 Controller 역할을 하는 웹 애플리케이션 프레임워크입니다. 
특정 규약을 따라 만들게 한다면 규약에서 제시하는 특정 클래스를 상속해야 합니다.
그럴 경우 자바의 단일 상속 제한 때문에 더 이상 해당 클래스에 객체지향적인 설계 기법을 적용하기 어려워지는 문제가 생깁니다.
또한 이미 특정 규약에 종속되어 있기 때문에 다른 환경으로 이전이 힘들어지는 문제점이 생깁니다.

 

특정 환경에 종속되지 않는다.

특정 환경에 종속적이어야만 동작하는 오브젝트도 POJO라고 할 수 없습니다.
JNDI가 없는환경에서 그대로 사용하기 힘든 EJB처럼 특정 환경이 의존 대상 검색 방식에 종속적이라면 POJO라고 할 수 없습니다.
비즈니스 로직을 담고 있는 POJO 클래스는 웹이라는 환경정보나 웹 기술을 담고 있는 클래스나 인터페이스를 사용해서는 안 됩니다.
웹이라는 환경으로 제한해버리기 때문입니다.
그리고 웹 서버에 올리지 않으면 독립적으로 테스트하기 어려워집니다.

 

어노테이션을 사용하면?

XML에 담겨있는 설정정보를 자바 코드로 가져왔어도, 그 때문에 환경에 종속되지 않는다면 POJO라고 할 수 있습니다.
하지만 어노테이션이나 엘리먼트 값에 특정 기술과 환경에 종속적인 정보를 담고 있다면 그때는 POJO라고 할 수 없습니다.

 

특정 기술이나 환경에 종속적이지 않다면 모두 POJO일까?

POJO는 객체지향적인 자바 언어의 기본에 충실하게 만들어져야 합니다.
그것이 POJO라는 이름을 붙이면서까지 단순한 자바 오브젝트에 집착하는 이유입니다.
자바 언어와 문법만 사용했다고 해서 객체지향적으로 만들어졌다고 볼 수는 없습니다.
재사용이 불가능할 정도로 다른 레이어와 영역의 코드와 강한 결합을 가지고 만들어진 경우와 OOP를 생각하지 않고 단순 if/switch 문으로 만들었다면, 객체지향적인 자바 오브젝트라고 할 수 없습니다.
이런 식으로 개발이 진행된다면 특정 기술과 환경에 종속적이지 않았지만, POJO라고 부를 수 없습니다.

 

그럼 POJO라고 부를려면 어떻게 해야 할까?

객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 재사용이 될 수 있는 방식으로 설계된 오브젝트를 말합니다.

POJO의 장점 

POJO의 장점은 POJO조건 그대로가 장점이 됩니다.
특정 기술과 환경에 종속되지 않는 오브젝트는 깔끔한 코드가 될 수 있습니다.
매우 유연한 방식으로 원하는 레벨에서 코드를 빠르고 명확하게 테스트할 수 있습니다.
객체지향적인 설계를 자유롭게 적용할 수 있습니다.

 

POJO 프레임워크

스프링은 POJO를 이용한 엔터프라이즈 애플리케이션 개발을 목적으로 하는 프레임워크라고 했습니다.
POJO 프로그램이 가능하도록 기술적인 기반을 제공하는 프레임워크를 POJO 프레임워크라고 합니다. 
스프링 프레임워크와 하이버네이트가 대표적인 POJO 프레임워크로 볼 수 있습니다.

 

후기

POJO에 나온 특정 기술이나 환경에 종속되지 않게 프로그래밍하는 것은 예전부터 계속 들어왔던 말입니다.
스프링을 사용하고, 더 나은 프로그래밍을 하고싶다면 POJO의 개념을 알고 있을 필요가 있다고 생각합니다.

 

참조 자료: 토비의 스프링 3.1 vol.1

컴포넌트 의미

 

컴포넌트(component)란 여러 개의 프로그램 함수들을 모아 하나의 특정한 기능을 수행할 수 있도록 구성한 작은 기능적 단위를 말한다. 컴포넌트를 이용하면 소프트웨어 개발을 마치 레고(Lego) 블록을 쌓듯이 조립식으로 쉽게 할 수 있다. 모듈(module)이라고도 한다. 상용 컴포넌트에는 DextUpload, r-Mate Chart 등이 있다. 컴포넌트 기반의 개발 방법론을 CBD 방법론이라고 한다.

소프트웨어는 독립적으로 개발되지 않은 경우가 많고, 독립적으로 개발되어도 다른 모듈과의 호환을 생각하지 않고 개발한다. 이는 소프트웨어의 재사용을 어렵게 하고 유지보수 비용이 크게 증가하는 원인이 된다. 이러한 상황에서 소프트웨어의 재사용의 중요성과 필요성을 위해 나온 기술이 컴포넌트 기술이다.

 


 

기본 흐름과 주요 컴포넌트

 

스프링 MVC를 이용해서 서비스를 개발하려면 스프링 MVC가 어떤 식으로 동작하는지 이해하고 있어야 합니다.

기본적인 이해없이 개발하게 된다면 여러 응용 단계에서 더 나은 방안을 생각하기 어렵습니다.

이러한 문제를 해결하기 위해 기본 흐름과 주요 컴포넌트에 대해 알고 있을 필요가 있습니다.

 

최초에 사용자가 웹으로 요청을 하게되면 DispatcherServlet이 요청을 받으며, 밑의 이미지와 같은 과정을 거쳐 사용자 웹으로 응답을 전송하게 됩니다.

 

 

*순서

1. 요청전송

2. 요청 URL과 매칭 되는 컨트롤러 검색

3. 처리 요청

4. 실행

5. 결과

6. 컨트롤러 실행 결과를 ModelAndView로 리턴

7. 컨트롤러의 실행 결과를 보여줄 View 검색

8. 응답 생성 요청

9. 응답 생성

 


 

*DispatcherServlet

클라이언트의 요청을 전달받습니다. 컨트롤러에게 클라이언트의 요청을 전달하고, 컨트롤러가 리턴한 결괏값을 View에 전달하여 알맞은 응답을 생성하도록 합니다.

*HandlerMapping

클라이언트의 요청 URL을 어떤 Controller가 처리할지를 결정합니다.

*HandlerAdapter

DispatcherServlet의 처리 요청을 변환해서 Controller에게 전달하고, Controller의 응답 결과를 DispatcherServlet이 요구하는 형식으로 변환합니다.

웹브라우저 캐시 등의 설정도 담당합니다.

*Controller

클라이언트의 요청을 처리한 뒤, 결과를 리턴합니다.

응답 결과에서 보여줄 데이터를 모델에 담아 전달합니다.

*ModelAndView 

Controller가 처리한 결과를 정보 및 뷰 선택에 필요한 정보를 담습니다.

*ViewResolver

Controller의 처리 결과를 보여줄 뷰를 결정합니다.

*View

Controller의 처리 결과 화면을 생성합니다.

JSP나 Velocity 템플릿 파일 등을 이용해서 클라이언트에 응답 결과를 전송합니다.

 

참조자료 : 웹 개발자를 위한 SPRING 4.0 프로그래밍

 


 

후기

 

스프링을 사용할 때 어떤 흐름으로 요청과 응답이 나오는지 모른다면 응용하기 힘들 것입니다.

요즘에는 스프링 부트를 사용하는데, 스프링 부트 장점 중 하나는 개발자가 기본적인 설정에 덜 신경 써도 된다는 것입니다.

그러다 보니 스프링 부트로 프로젝트를 만들고 요청받을 컨트롤러에 경로를 적어주면 만들어 놓은 비즈니스 로직대로 흘러간다 정도만 알 수도 있습니다.

하지만 명확하게 어떤 방식으로 동작하는지 알고 있어야 응용할 때 더 나은 방법으로 접근할 수 있습니다. 

참조 자료: 웹 개발자를 위한 Spring 4.0 프로그래밍

'스프링 > Spring' 카테고리의 다른 글

[Spring] POJO란 무엇인가?  (0) 2022.01.17
[Spring] 스프링 DI란?(Dependency Injection)  (0) 2022.01.14
[스프링] 트랜잭션이란?  (0) 2022.01.12
[Spring] 스프링이란 무엇인가?  (0) 2022.01.10

+ Recent posts