[Spring] EJB, POJO 그리고 Spring

Spring에 대하여 좀 더 깊은 이해와  알아보기 위해 본 글은 작성 되었다. 먼저 EJB에 대한 내용과 POJO의 탄생 배경에 대해 설명하고 POJO을 깊이 다루어 보려고 한다.

EJB(Enterprise JavaBeans) 그리고 POJO의 탄생

EJB는 복작한 Enterprise 서비스를 개발하는데 있서 복잡한 비즈니스 로직Low-level의 처리를 분리시켜 개발자로 하여금 비즈니스 로직에만 집중할 수 있게 만들어 주었다.

이러한 철학을 가진 EJB의 가장 최악의 문제는 비즈니스 object 들은 JAVA본연의 객체지향의 특징과 장점을 포기해야 했다.

  • 상속과, 다형성 등 객체지향의 이점을 누릴 수 없다
  • 하나의 기능을 구현하기 위해서는 EJB에서 구현된 불필요한 object들부터 상속 받아야 했고 이렇게 함으로써 개발에서의 테스트가 용이하지 않고 문제점 찾기도 힘들다.

위에 나열한 문제보다 더 많은 문제 점 때문에 많은 개발자들은 POJO 방식을 선택하게 되고 그 설계원칙을 반영하여 만든 Framework가 Spring이다.(사실 POJO 철학을 가지고 만든 framework가 많지만 spring을 대표로 설명을 이어감.)

POJO

이에 대한 기본적인 설명은 다른 블로그에서 잘 정리하여서 여기에는 적지 않겠다. 그대신 테크업이 POJO에 대한 이해를 덧붙이자면 자바를 자바답게 OOP를 OOP 답게 쓰자는 것이 취지 인것 같다. 즉 EJB에서 복잡한 상속관게와 약간 꼬인 객체간의 관계를 풀어서 쉽게 사용하자는데 목적이 있는것 같다.

위의 POJO의 방식으로 하나의 기본적인 예제 코드를 보자

public class User {
    private long id;
    private String name;
    public void setId(long id) {
        this. id = id;
    }
    public void setName(String name) {
        this. name=name;
    }
    public long getId() {
        return id;
    }
    public String getName() {
        return name;
    }
}

위의 class에서 보면 기본적인 변수들과 그에 상응하는 get(), set() 밖에 제공 하지 않는다. 이런 Class를 이용하여 우리는 비즈니스 로직을 구현할 수 있다. 예를 들어 Spring Security을 이용하여 사용자에 대한 권한 관리를 할 수 있고 또한 바로 DATABASE를 접근 할 수 있는 base object로 사용할 수도 있다. 이런 방식은 Spring이 추구하는 개발 방식과 일맥상통하다.

POJO의 더 깊은 이해

SpringMVC중의 DispatcherServlet을 이용하여 POJO에 대한 더 깊게 이해 해 보려고 한다.

J2EE에서 Servlet에 관한 비즈니스 로직을 구현함에 있어서 종종 HttpServlet를 상속 받아서 구현 한다.

public class FooHttpServlet extends HttpServlet {
       @Override
       public void init() throws ServletException {
                // code 
       }
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
               // code
       }
       @Override
       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
               // code
       }
}

위 코드에서 FooHttpServlet은 HttpServlet을 상속받았기에 특정한 환경에서 밖에 사용할 수 없다.

이와 다르게 Spring MVC의 DispatcherServlet에서 위와 같은 기능을 구현하는 것을 살펴보자.

@Controller
public class FooController {
        @GetMapping("/test")
        public void methdA(){
            // code
        }
}

코드에서 먼저 Annotation들을 빼고 보면 일반적인 class이다. 이 class는 POJO방식을 따른다고 할 수 있다. 또한 SpringMVC에서 제공하는 Annotation을 사용함으로써 복잡한 내부구현은 Spring에서 처리하고(서비스 추상화를 통해서 doGet와 doPost를 구현,PSA) 개발자는 비즈니스 로직에만 집중할 수 있게 만드는 것이 Spring에서 추구하는 방향인것 같다.(위 코드는 엄격한 의미상에서 POJO가 아니지만 최소한으로 POJO를 준수하도록 만들어 졌다.)

 

https://velog.io/@dion/what-is-POJO

https://blog.naver.com/writer0713/220700687650

https://blog.csdn.net/weixin_46015825/article/details/113798732

'Spring boot' 카테고리의 다른 글

[Spring] Maven Wrapper  (0) 2022.01.03
[Spring]JobRunr libary 사용  (0) 2021.12.19
[Spring] Kotllin + Spring boot 시작하기  (0) 2021.12.08
[Spring] Transaction 정리  (0) 2021.11.24
[Spring] Logging 구성 및 구현  (0) 2021.11.22