POJO란 무엇인가? (FEAT. 예제코드)

홍당무·2023년 2월 28일
0

Plain Old Java Object

등장배경

간단히 POJO는 말 그대로 해석을 하면 오래된 방식의 간단한 자바 오브젝트라는 말로서 Java EE 등의 중량 프레임워크들을 사용하게 되면서 해당 프레임워크에 종속된 "무거운" 객체를 만들게 된 것에 반발해서 사용되게 된 용어이다.

정의

이상적으로, POJO는 자바 언어 사양 외에 어떠한 제한에도 묶이지 않은 자바 오브젝트라고 할 수 있다. 이를테면 POJO는 다음과 같은 행동을 해서는 안된다.

  • 미리 정의된 클래스의 확장
public class Foo extends javax.servlet.http.HttpServlet { ...
  • 미리 정의된 인터페이스의 구현
public class Bar implements javax.ejb.EntityBean { ...
  • 미리 정의된 어노테이션을 포함
@javax.persistence.Entity public class Baz { ...

그러나 기술적 어려움이나 기타 이유로 인해 POJO 호환으로 기술하고 있는 수 많은 소프트웨어 제품이나 프레임워크들은 실제로 정상 동작을 위해 퍼시스턴스와 같은 기능을 위해 미리 정의된 어노테이션의 사용을 요구하고 있다.

예제 코드 (다목적 시퀀스 생성기)

  • prefix, suffix, initial 세 프로퍼티를 지닌 SequenceGenerator 클래스를 만들어 준다.
  • 이 때, getSequence()가 호출될 때마다 마지막 시퀀스를 생성해준다.
public class SequenceGenerator {
    private String prefix;
    private String suffix;
    private int initial;
    private final AtomicInteger counter = new AtomicInteger();

    public SequenceGenerator() {
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }

    public void setInitial(int initial) {
        this.initial = initial;
    }

    public String getSequence() {
        String builder = prefix +
                initial +
                counter.getAndIncrement() +
                suffix;
        return builder;
    }
}
  • 자바 POJO를 생성하기 위해 구성클래스를 만들어 보면,

    • 구성 클래스에 초깃값을 지정하면 IoC 컨테이너에서 POJO 인스턴스를 정의 할 수 있다.
  • @Configuration을 붙이면 스프링에 이 클래스가 구성 클래스임을 알려준다.

  • 이 때, 스프링은 그 안에서 빈(Bean) 인스턴스를 찾게 된다.

  • 따라서 빈 인스턴스를 찾을 수 있도록 @Bean 을 붙여준다.

  • @Bean을 붙여 메서드의 이름과 같은 빈 인스턴스가 생성된다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SequenceGeneratorConfiguration {

    @Bean
    public SequenceGenerator sequenceGenerator() {

        SequenceGenerator seqgen = new SequenceGenerator();
        seqgen.setPrefix("30");
        seqgen.setSuffix("A");
        seqgen.setInitial(100000);
        return seqgen;
    }
}
  • 이 후, Main 클래스에서 구성클래스를 스캔하기 위해 IoC컨테이너를 만들어준다.
    • 스프링은 IoC컨테이너로 기본 구현체인 빈 팩토리와 고급 구현체인 애플리케이션 컨텍스트를 제공해준다.
    • 애플리케이션 컨텍스트가 기본 기능에 충실하고, 빈 팩토리보다 발전되었기 때문에 가급적 애플리케이션 컨텍스트를 사용하는 것이 좋다.
   public static void main(String[] args) {
        ApplicationContext context =
                new AnnotationConfigApplicationContext(SequenceGeneratorConfiguration.class);

        SequenceGenerator generator = context.getBean(SequenceGenerator.class); 
        // IoC 컨테이너로 POJO 클래스의 빈 인스턴스를 가져오기위해 getBean()을 사용한다.
        // getBean()은 Object형이기 때문에 캐스팅 혹은 두 번째 인수에 빈 클래스명을 지정해줘야 한다.

        System.out.println(generator.getSequence());
        System.out.println(generator.getSequence());
    }
profile
공부하는 백엔드 개발자

0개의 댓글

관련 채용 정보