본문 바로가기

Back-End/Spring

POJO(plain old java object)란?

POJO(Plain old java object)란 무엇인가?

스프링 개발을 하면서 POJO 프로그래밍이라는 용어를 자주 접한다.


이제까지 느낌적으로 특정 규약에 종속되지 않는 자바 객체 정도로 이해해왔다.


이 포스팅에서 POJO의 조건과 POJO 프로그래밍의 장점에 대해 예시를 통해 알아볼 것이다.


POJO 개념을 사용하지 않은 예시 ( 특정 환경에 결합도가 높은 코드 ) 

 JMS로부터 메시지를 받는 경우

JMS를 사용하기 위해 MessageListener 인터페이스를 상속받아야 한다. 

하지만, 다음과 같이 구현하면 JMS라는 특정 환경에 종속되게 되고 다른 메시징 솔루션을 적용하기 어려워 진다. 

단순한 예제와 달리 Listener가 많은 경우, AMQP나 다른 솔루션으로 교체할 경우 더더욱 어려울 것이다.
public class ExampleListener implements MessageListener {

public void onMessage(Message message) {
if (message instanceof TextMessage) {
try {
System.out.println(((TextMessage) message).getText());
}
catch (JMSException ex) {
throw new RuntimeException(ex);
}
}
else {
throw new IllegalArgumentException("Message must be of type TextMessage");
}
}

}


POJO 개념을 사용한 예시 ( 특정 환경에 결합도가 낮은 코드 )

@Component
public class ExampleListener {

@JmsListener(destination = "myDestination")
public void processOrder(String message) {
System.out.println(message);
}
}

위의 코드는 어떠한 인터페이스에 종속되지 않는다. @JmsListenr라는 어노테이션을 이용하여 JMS 서비스와 연동한다. 다른 솔루션을 사용하고 싶은 경우, @RabbitListener 로 바꿔주기만 하면 된다. 


스프링 프레임워크는 위의 예제처럼 우리의 코드와 라이브러리와의 결합성을 줄이도록 도와준다.  


POJO(Plain old java object)에 대해 제대로 알아보자.

스프링의 핵심 : POJO

 위 그림은 스프링 소스 CTO가 스프링의 핵심 개념을 설명하기 위해 만든 그림이다. 



스프링 애플리케이션 = POJO를 이용해서 만든 애플리케이션 로직 + POJO가 어떻게 관계를 맺고 동작하는지 정의해놓은 설계정보

스프링의 주요 기술인 IoC/DI, AOP, PSA는 애플리케이션을 POJO로 개발할 수 있게 해주는 기술들이다.


그래서 POJO의 개념은 무엇일까?


POJO의 조건 

1. 특정 규약에 종속되지 않는다.

위의 예제처럼 JMS를 사용하기 위해 MessageListener를 상속받아서는 안된다. 

  • 단일 상속 제한 때문에 객체지향적인 설계기법 적용하기 어려워짐
  • 다른 환경으로의 이전이 어려움

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

예를 들어 웹환경에 종속되는 HttpServletRequest나 HttpSession와 관련된 API를 직접 이용해서는 안된다.
  • 다른 환경에서 사용하기 어려움
  • 비즈니스 로직과 기술적인 내용을 담은 웹정보 코드가 섞여 이해하기 어려워짐
  • 웹서버에 올리지 않고 독립적으로 테스트하기 어려워짐

3. 단일 책임 원칙을 지키는 클래스

단순히 1,2번을 지켰다고 POJO라 할 수 없다. 책임과 역할이 각기 다른 코드를 하나의 클래스에 넣는 경우 진정한 POJO라 할 수 없다.

즉, POJO란 객체지향적인 원리에 충실하면서, 특정 환경과 규약에 종속되지 않아 필요에 따라 재사용될 수 있는 방식으로 설계된 오브젝트라 할 수 있다.


 POJO의 장점

위에서 살펴본 조건이 바로 장점이 된다.
  • 특정 규약에 종속되지 않아 객체지향 설계를 할 수 있게 됨. 
  • 특정 환경에 종속되지 않아 테스트 하기 좋음
  • 특정 규약에 종속되지 않아 로우레벨 코드와 비즈니스 코드가 분리되어 깔끔한 코드 작성이 가능

POJO 프레임워크

스프링은 POJO를 이용한 엔터프라이즈 애플리케이션 개발을 목적으로 하는 프레임워크라 한다. 


엔터프라이즈 애플리케이션 개발 중 하나의 예를 들면 DB 이용 기술이 있다.


DB 이용 기술에 관련된 코드를 객체지향적인 POJO를 기반으로 깔끔하게 구현할 수 있다.