안녕하세요! 오늘은 자바의 스프링 프레임워크에 대해 알아보겠습니다.

스프링 프레임워크

자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션입니다. 

이렇게 나오는데요 쉽게말해 기업용 소프트웨어를 쉽게 개발,배포 하기위한 도구들을 제공한다 라고 생각해주시면 됩니다.

등장배경

자 스프링 프레임워크는 어떻게 등장하게 됐냐, 기존의 엔터프라이즈 개발은 J2EE를 사용했는데 이는 개발을 위한 다양한 기능을 제공했지만 동시에 그 기능에 대한 과도한 의존성, 복잡한 설정을 동반했기에 확장성이 떨어지고 재사용성이 부족해지는 문제가 발생했고 이를 극복할 수 있는 유연한 프레임워크의 필요성이 대두되며 스프링 프레임워크가 등장하게 됩니다.

스프링

경량 프레임워크

스프링의 주요 개념 중 하나인 POJO(Plain Old Java Object)입니다. 자바의 특정 표준이나 외부 프레임워크에 의존하지 않고 단순한 자바 객체로 프로그램을 개발하여 단순하고 가벼운 구조로 만들게 됩니다.


EJB vs POJO

EJB

EJB(Enterprise JavaBeans)는 Java EE 환경에서 엔터프라이즈 개발을 위한 표준 컴포넌트로 트랜잭션 관리, 보안 관리 같은 엔터프라이즈 요구 기능들을 처리하기 위해 설계된 자바 컴포넌트 입니다.

이 기능을 처리하기 위해 EJB는 자바의 애플리케이션 서버라는 실행 환경에 종속됩니다.

 

POJO와의 차이를 자세히 보겠습니다.

// EJB
public class addEJB {
    public int add(int a, int b) {
        return a + b;
    }
}

public class ClientApp {
    public static void main(String[] args) throws Exception {
        InitialContext ctx = new InitialContext();
        addEJB calculator = (CalculatorEJB) ctx.lookup("java:global/addEJB");
        System.out.println("Addition: " + calculator.add(5, 3));
    }
}

// POJO
public class addPOJO {
    public int add(int a, int b) {
        return a + b;
    }
}

public class ClientApp {
    public static void main(String[] args) {
        addPOJO calculator = new addPOJO();   
        System.out.println("Addition: " + calculator.add(5, 3));
    }
}

EJB 에서 addEJB 객체를 활용하기 위해선 컨텍스트에 있는 EJB 객체를 JNDI (Java Naming and Directory Interface) 를 통해 객체를 주입하고 활용한데 비해 POJO의 경우 단순 객체를 new 선언을 통해 주입하는 모습을 볼 수 있습니다.

 

이렇게 POJO를 기반으로 간단한 설정 방법을 사용하면서도 EJB의 트랜잭션, AOP 같은 기능을 사용할 수 있게 된것이죠

 

특징

IOC(Inversion of Control)

스프링 프레임워크의 특징 중 하나인 IOC(제어의 역전) 입니다. 기존 객체의 생성과 의존성 관리를 개발자가 직접 하는것에서 프레임워크나 컨테이너가 담당하도록 제어권을 넘겨주는 것. 제어의 역전이 일어나는 것이 IOC 입니다. 이를 통해서 객체간의 결합도를 낮추거나 애플리케이션의 유연성이 향상하게 되는 것이죠.

 

자 예시를 보며 확인해 보겠습니다.

// 기존
public class Chef {
    private Oven oven;

    public Chef() {
        this.oven = new Oven();
    }

    public void bakeBread() {
        oven.bake();
    }
}

// 스프링
public class Chef {
    private Oven oven;

    public Chef(Oven oven) {
        this.oven = oven;
    }

    public void bakeBread() {
        oven.bake();
    }
}

 

기존 의 객체 주입을 보게되면
Chef는 New()를 이용 Oven 객체를 직접 선언 했습니다. 이런 상황을 Chef와 Oven이 강한 결합을 맺고 있다고 합니다. 만약 다른 Oven을 사용하려고 한다면 Chef를 수정해줘야 겠죠? 하지만 스프링의 방식은 다릅니다. 

oven을 매개변수로 넣어주기에 Oven형태의 인터페이스를 구현한 클래스를 Chef는 사용할 수 있고 이를 스프링이 관리해서 주입시켜주기에 Chef와 Oven간의 결합도가 떨어진 것을 확인할 수 있습니다.

 

이렇게 IOC를 통해 객체의 생성관리를 스프링이 전담하며 객체간 유연성을 확보할 수 있고 이는 코드의 재사용성이 높아지는 결과를 얻게되는거죠!

DI(Dependency Injection)

IOC의 핵심 목적은 모듈간의 결합도를 낮춰 유연성, 재사용성 등을 확보하는 것인데요. 이를 구현하기 위한 방법 중 하나로 DI(의존성 주입)를 이용합니다.

 

IOC에서 우리는 강한 결합에 대해 이야기 했습니다. 이렇게 개발자가 직접 의존성을 부여하는게 아니라. 스프링이 생성자를 통한 의존성 주입이나 @Autowired 필드 주입을 활용해 객체에 동적으로 의존성을 주입해줌으로서 IOC의 핵심목적인 결합도 감소를 구현할 수 있는것이죠.

AOP(Aspect-Oriented Programming )

AOP는 프로그램에서 비즈니스 로직과는 별개로, 반복적, 공통적으로 발생하는 측면을 기준으로 분리하여 관리하는 프로그래밍 방법 입니다. 주로 로깅, 트랜잭션, 보안 같은 영역이 포함됩니다.

 

예시를 확인해 보겠습니다.

// AOP 적용 전
public class OrderService {
    public void placeOrder() {
        System.out.println("Logging: Order placed.");
        System.out.println("Order placed successfully.");
    }
}
public class PaymentService {
    public void processPayment() {
        System.out.println("Logging: Payment processing.");
        System.out.println("Payment processed successfully.");
    }
}

// AOP 적용 후
public class OrderService {
    public void placeOrder() {
        System.out.println("Order placed successfully.");
    }
}
public class PaymentService {
    public void processPayment() {
        System.out.println("Payment processed successfully.");
    }
}

// 로깅 분리
@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example..*(..))")
    public void logBefore() {
        System.out.println("Logging: Method execution started.");
    }
}

AOP 적용 전을 확인해보면 모든 메소드를 실행하며 Logging... 문구를 실행하는 것을 볼 수 있습니다. 지금은 한 줄이지만

중간 값 로깅, 결과 값, 종료 이런 로그들을 모든 메소드마다 사용해야 할텐데 이렇게 되면 굉장히 비즈니스 로직이 복잡해질겁니다.

 

그래서 우리는 AOP를 활용하여 로깅 영역을 별도로 분리하여 메서드가 실행 되기 전 실행 되도록 설정을 해주는데요 이렇게 됐을 때 중복으로 사용하는 코드도 줄일 수 있고 실제 비즈니스 로직에서도 불필요한 내용이 사라지며 좀 더 비즈니스 로직에 집중할 수 있겠습니다.

 

최종정리

스프링 프레임워크는 POJO를 기반으로 기존의 엔터프라이즈 개발에 비교해 가볍고 유연한 프레임워크를 제공하고 IOC/DI, AOP를 사용해 재사용성, 확장성, 유지보수성을 높이며 개발자가 더 간편하게 개발을 할 수 있도록 도와주는 프레임워크 입니다.

 

 

 

+ Recent posts