스프링은 스프링 컨테이너 또는 애플레이케이션 컨텍스트라고 불리는 스프링 런타임 엔진을 제공한다. 설정정보를 참고해서 애플리케이션을 구성하는 오브젝트를 생성하고 관리한다. 보통 웹 모듈에서 동작하는 서비스나 서블릿으로 등록해서 사용한다.
공통 프로그래밍 모델 - Ioc/DI, PSA, AOP Codestates
프레임워크는 애플리케이션을 구성하는 오브젝트가 생성되고 동작하는 방식에 대한 틀을 제공해줄 뿐만 아니라, 어떻게 작성돼야 하는지에 대한 기준도 제시해준다. 이런 틀을 보통 프로그래밍 모델이라고 한다. 스프링은 IoC/DI, PSA, AOP 이렇게 세가지 핵심 프로그래밍 모델을 지원한다.
스프링은 엔터프라이즈 애플리케이션을 개발의 다양한 영역에 바로 활용할 수 있는 방대한 양의 기술 API를 제공한다. UI작성은 물론이고, 웹 프레젠테이션 계층, 비즈니스 서비스 계층, 기반 서비스 계층, 도메인 계층, 데이터 엑세스 계층 등에서 필요한 주요 기술을 일관된 방식으로 사용할 수 있도록 지원해주는 기능과 전략 클래스 등을 제공한다.
스프링의 모든 기술은 자바 엔터프라이즈 플랫폼에 기반을 두고 있다.
💡 스프링을 사용한다는 것은 바로 이 세가지 요소를 적극적으로 활용해서 애플리케이션을 개발한다는 뜻이다. 클래스는 스프링 컨테이너 위에서 오브젝트로 만들어져 동작하게 만들고, 코드는 스프링의 프로그래밍 모델을 따라서 작성하고, 엔터프라이즈 기술을 사용할 때는 스프링이 제공하는 기술 API와 서비스를 활용해주면 된다.
스프링은 EJB라는 표준 기술을 비판하면서 등장했다. EJB는 불필요하게 복잡한 기술이었기 때문에 스프링이 지향하는 것은 목적을 이룰 수 있는 가장 단순하고 명쾌한 접근 방법이다. 스프링은 객체지향 언어의 장점을 살릴 수 있는 도구이다. 그래서 스프링이 강력히 주장하는 것은 가장 단순한 객체지향적인 개발 모델인 POJO 프로그래밍이다.
2. 유연성
스프링은 유연성과 확장성이 매우 뛰어나다. 스프링의 유연성으로 인해 스프링은 다른 많은 프레임워크와 편리하게 접목돼서 사용될 수 있다. 그래서 여러 프레임워크를 함께 사용하게 해주는 접착 프레임워크라고도 불린다. ex)JUnit, Mockito
스프링 기능의 대부분은 핵심 기능을 확장해서 발전시킨 결과물이다. 스프링은 개발자들에게 스프링을 확장해서 사용하도록 권장하고 있다.
💡POJO(Plain Old Java Object): 오래된 방식의 간단한 자바 오브젝트. 쉽게 말해 특정 자바 모델이나 기능,환경, 규약, 프레임워크 등을 따르지 않은 순수한 자바 오브젝트를 지칭한다.
진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트이다. 그런 POJO에 애플리케이션의 핵심 로직과 기능을 담아 설계하고 개발하는 방법을 POJO 프로그래밍이라고 할 수 있다.
객체지향적인 설계원칙에 충실하도록 만들게 하며, 테스트에 용이하니 POJO프로그래밍을 지향하도록 하자.
특정 기술과 함께 사용되는 경우?
하이버네이트를 사용하게 되는 경우 특정 기술에 종속적이게 되니, POJO가 아니잖아요!
스프링에선 POJO를 유지하면서 하이버네이트를 사용할 수 있다고 말할 수 있다. 스프링에서 정한 표준 인터페이스가 있기 때문이다. 스프링 개발자들은 ORM이라는 기술을 사용하기 위해서 'JPA'라는 표준 인터페이스를 정해두었다. 그리고 여러 ORM 프레임워크들은 이 JPA라는 표준 인터페이스 아래, 구현되어 실행된다. 이것이 스프링이 새로운 엔터프라이즈 기술을 도입하면서도 POJO를 유지하는 방법이다. 이런 방법을 스프링의 PSA라고 얘기한다.
POJO 프로그래밍을 위한 규칙
Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다.
getter, setter만 가지고 있는 코드는 특정 기술에 종속되어 있지 않아 POJO라고 부를 수 있다.
💡IoC(Inversion of Control): 제어의 역전이라는 의미로, 애플리케이션 흐름의 주도권이 뒤바뀐 것을 말한다. 쉽게 말해 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.
💡DI(Dependency Injection): 의존성 주입이라는 의미로, 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입 시켜주는 방법을 말한다.
보통 개발할 때 개발자가 프로그램의 흐름을 주도하기 마련이다. 하지만 스프링에서는 프로그램의 흐름을 프레임워크가 주도한다. 객체의 생성부터 생명주기를 스프링 컨테이너가 관리한다. 즉, 제어권이 넘어갔다하여 제어의 역전, IoC라고 한다. 그래서 스프링 컨테이너를 IoC컨테이너라고도 부른다.
제어권이 스프링 컨테이너로 넘어옴으로써 DI가 가능해진 것이다.
스프링에서의 IoC
객체생성
의존성 객체 주입(스스로 만드는 것이 아닌 제어권을 스프링에게 위임하여 스프링이 만들어 놓은 객체를 외부에서 주입)
의존성 객체 메소드 호출
이렇게 생성된 객체는 스프링에선 Bean이라 부른다. 스프링이 실행될 때 생성하며, 필요한 곳에 주입시켜준다. 이 Bean들은 컨테이너에서 싱글톤으로 관리된다.
IoC를 통해 객체끼리 느슨하게 결합될 수 있고, 유연한 코드를 작성할 수 있게 되었다.
DI를 하는 세가지 방법
DI방식을 사용하게 되면 개방 폐쇄 원칙(OCP)의 이점과 같은 이점을 얻을 수 있다. 확장에는 열려있고, 변경에는 닫혀있어 재사용이 가능한 것이다.
DI 방식에는 3가지가 있다. 생성자 주입, Setter주입, 필드 주입 이렇게 3가지이다.
위 코드로 JDBC 기반의 DB에 접근할 수 있고, JPA를 활용하여 ORM 접근을 할 수 있다. 하나의 추상화로 여러 서비스를 묶어둔 PSA 덕분이다.
PlatformTransactionManager이라는 최상위 Manager를 사용하고, 각각 사용자의 선언에 따라서 JPATransactionManger, DatasourceTransactionManager, HibernateTransactionManger 등을 상황에 맞게 의존성 주입을 받아 사용하게 된다.
따라서 개발자는 내부적으로 어떠한 Database Mapping전략을 사용하던지 관계없이 @Transactional이라는 어노테이션을 활용하면 Transaction 처리를 할 수 있게 된다.
스프링은 스프링 컨테이너 또는 애플레이케이션 컨텍스트라고 불리는 스프링 런타임 엔진을 제공한다. 설정정보를 참고해서 애플리케이션을 구성하는 오브젝트를 생성하고 관리한다. 보통 웹 모듈에서 동작하는 서비스나 서블릿으로 등록해서 사용한다.
공통 프로그래밍 모델 - Ioc/DI, PSA, AOP Codestates
프레임워크는 애플리케이션을 구성하는 오브젝트가 생성되고 동작하는 방식에 대한 틀을 제공해줄 뿐만 아니라, 어떻게 작성돼야 하는지에 대한 기준도 제시해준다. 이런 틀을 보통 프로그래밍 모델이라고 한다. 스프링은 IoC/DI, PSA, AOP 이렇게 세가지 핵심 프로그래밍 모델을 지원한다.
스프링은 엔터프라이즈 애플리케이션을 개발의 다양한 영역에 바로 활용할 수 있는 방대한 양의 기술 API를 제공한다. UI작성은 물론이고, 웹 프레젠테이션 계층, 비즈니스 서비스 계층, 기반 서비스 계층, 도메인 계층, 데이터 엑세스 계층 등에서 필요한 주요 기술을 일관된 방식으로 사용할 수 있도록 지원해주는 기능과 전략 클래스 등을 제공한다.
스프링의 모든 기술은 자바 엔터프라이즈 플랫폼에 기반을 두고 있다.
💡 스프링을 사용한다는 것은 바로 이 세가지 요소를 적극적으로 활용해서 애플리케이션을 개발한다는 뜻이다. 클래스는 스프링 컨테이너 위에서 오브젝트로 만들어져 동작하게 만들고, 코드는 스프링의 프로그래밍 모델을 따라서 작성하고, 엔터프라이즈 기술을 사용할 때는 스프링이 제공하는 기술 API와 서비스를 활용해주면 된다.
스프링은 EJB라는 표준 기술을 비판하면서 등장했다. EJB는 불필요하게 복잡한 기술이었기 때문에 스프링이 지향하는 것은 목적을 이룰 수 있는 가장 단순하고 명쾌한 접근 방법이다. 스프링은 객체지향 언어의 장점을 살릴 수 있는 도구이다. 그래서 스프링이 강력히 주장하는 것은 가장 단순한 객체지향적인 개발 모델인 POJO 프로그래밍이다.
2. 유연성
스프링은 유연성과 확장성이 매우 뛰어나다. 스프링의 유연성으로 인해 스프링은 다른 많은 프레임워크와 편리하게 접목돼서 사용될 수 있다. 그래서 여러 프레임워크를 함께 사용하게 해주는 접착 프레임워크라고도 불린다. ex)JUnit, Mockito
스프링 기능의 대부분은 핵심 기능을 확장해서 발전시킨 결과물이다. 스프링은 개발자들에게 스프링을 확장해서 사용하도록 권장하고 있다.
💡POJO(Plain Old Java Object): 오래된 방식의 간단한 자바 오브젝트. 쉽게 말해 특정 자바 모델이나 기능,환경, 규약, 프레임워크 등을 따르지 않은 순수한 자바 오브젝트를 지칭한다.
진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트이다. 그런 POJO에 애플리케이션의 핵심 로직과 기능을 담아 설계하고 개발하는 방법을 POJO 프로그래밍이라고 할 수 있다.
객체지향적인 설계원칙에 충실하도록 만들게 하며, 테스트에 용이하니 POJO프로그래밍을 지향하도록 하자.
특정 기술과 함께 사용되는 경우?
하이버네이트를 사용하게 되는 경우 특정 기술에 종속적이게 되니, POJO가 아니잖아요!
스프링에선 POJO를 유지하면서 하이버네이트를 사용할 수 있다고 말할 수 있다. 스프링에서 정한 표준 인터페이스가 있기 때문이다. 스프링 개발자들은 ORM이라는 기술을 사용하기 위해서 'JPA'라는 표준 인터페이스를 정해두었다. 그리고 여러 ORM 프레임워크들은 이 JPA라는 표준 인터페이스 아래, 구현되어 실행된다. 이것이 스프링이 새로운 엔터프라이즈 기술을 도입하면서도 POJO를 유지하는 방법이다. 이런 방법을 스프링의 PSA라고 얘기한다.
POJO 프로그래밍을 위한 규칙
Java나 Java의 스펙(사양)에 정의된 것 이외에는 다른 기술이나 규약에 얽매이지 않아야 한다.
getter, setter만 가지고 있는 코드는 특정 기술에 종속되어 있지 않아 POJO라고 부를 수 있다.
💡IoC(Inversion of Control): 제어의 역전이라는 의미로, 애플리케이션 흐름의 주도권이 뒤바뀐 것을 말한다. 쉽게 말해 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.
💡DI(Dependency Injection): 의존성 주입이라는 의미로, 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입 시켜주는 방법을 말한다.
보통 개발할 때 개발자가 프로그램의 흐름을 주도하기 마련이다. 하지만 스프링에서는 프로그램의 흐름을 프레임워크가 주도한다. 객체의 생성부터 생명주기를 스프링 컨테이너가 관리한다. 즉, 제어권이 넘어갔다하여 제어의 역전, IoC라고 한다. 그래서 스프링 컨테이너를 IoC컨테이너라고도 부른다.
제어권이 스프링 컨테이너로 넘어옴으로써 DI가 가능해진 것이다.
스프링에서의 IoC
객체생성
의존성 객체 주입(스스로 만드는 것이 아닌 제어권을 스프링에게 위임하여 스프링이 만들어 놓은 객체를 외부에서 주입)
의존성 객체 메소드 호출
이렇게 생성된 객체는 스프링에선 Bean이라 부른다. 스프링이 실행될 때 생성하며, 필요한 곳에 주입시켜준다. 이 Bean들은 컨테이너에서 싱글톤으로 관리된다.
IoC를 통해 객체끼리 느슨하게 결합될 수 있고, 유연한 코드를 작성할 수 있게 되었다.
DI를 하는 세가지 방법
DI방식을 사용하게 되면 개방 폐쇄 원칙(OCP)의 이점과 같은 이점을 얻을 수 있다. 확장에는 열려있고, 변경에는 닫혀있어 재사용이 가능한 것이다.
DI 방식에는 3가지가 있다. 생성자 주입, Setter주입, 필드 주입 이렇게 3가지이다.
위 코드로 JDBC 기반의 DB에 접근할 수 있고, JPA를 활용하여 ORM 접근을 할 수 있다. 하나의 추상화로 여러 서비스를 묶어둔 PSA 덕분이다.
PlatformTransactionManager이라는 최상위 Manager를 사용하고, 각각 사용자의 선언에 따라서 JPATransactionManger, DatasourceTransactionManager, HibernateTransactionManger 등을 상황에 맞게 의존성 주입을 받아 사용하게 된다.
따라서 개발자는 내부적으로 어떠한 Database Mapping전략을 사용하던지 관계없이 @Transactional이라는 어노테이션을 활용하면 Transaction 처리를 할 수 있게 된다.