
Spring이란 무엇인가?
'자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크' 라고 가장 잘 알려져있다.
Java/Kotlin 기반의 웹 프레임워크로서, 로드 존슨이 2002년에 출판한 저서 Expert One-on-One J2EE Design and Development에서 선보인 소스 코드를 시작으로 점점 발전하게 되었다. '스프링'이라는 이름의 유래는 이전에 Java EE의 스펙을 구현한 EJB가 기술의 복잡도가 증가해서 성능이 느렸던 것을 탈피하여, EJB 시절을 “겨울”에 빗대어 겨울 후의 “봄”으로 새로운 시작한다는 것을 의미하는 스프링(봄)이 되었다. Java Virtual Machine에서 작동하며, 아파치 라이선스 2.0을 따르는 오픈 소스 프레임워크이다.
Spring의 주요특징
- POJO(Plain Old Java Object) 방식 : POJO는 Java EE의 EJB 를 사용하면서 해당 플랫폼에 종속되어 있는 무거운 객체들을 만드는 것에 반발하며 나타난 용어다. 별도의 프레임워크 없이 Java EE를 사용할 때에 비해 특정 인터페이스를 직접 구현하거나 상속받을 필요가 없어 기존 라이브러리를 지원하기가 용이하고, 객체가 가볍다.
- 관점 지향 프로그래밍(Aspect Oriented Programming, AOP) : 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할 수 있다. AspectJ를 포함하여 사용할 수 있고, 스프링에서 지원하는 실행에 조합하는 방식도 지원한다. 이 분리 관리한다는 게 개념이 처음에 이해해기가 어려운데, 추상/부모/클래스나 인터페이스로 관리된다는 게 아니라 모듈을 관리해주는 모듈을 상하/인터페이스 관계없이 따로 마련한다는 개념에 가깝다. 전공자들을 위해서 더 쉽게 설명하자면 C언어에서는 중복할당을 줄이기 위해서 간접적으로 값을 가리키는 포인터로 가리키는데, Spring에서는 반복할당을 줄이기 위해 포인터를 대신하여 스프링 어노테이션을 사용하는 것이라고 보면 된다.
쉽게 말하자면 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 '공통적'으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있도록 하는 것이다. - 의존성 주입(Dependency Injection, DI) : 프로그래밍에서 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부에서 설정을 통해 정의되는 방식이다. 코드 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있으며 모듈간의 결합도도 낮출 수 있다. 계층, 서비스 간에 의존성이 존재하는 경우 스프링 프레임워크가 서로 연결시켜준다.
- 제어 역전(Inversion of Control, IoC) : 전통적인 프로그래밍에서는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출해서 이용했다. 제어 역전은 이와 반대로 외부 라이브러리 코드가 개발자의 코드를 호출하게 된다. 즉, 제어권이 프레임워크에게 있어 필요에 따라 스프링 프레임워크가 사용자의 코드를 호출한다.
- 생명주기 관리 : 경량 컨테이너(크기와 부하의 측면)로서 자바 객체를 직접 관리한다. 스프링 프레임워크는 Java 객체의 생성, 소멸을 직접 관리하며 필요한 객체만 사용할 수 있다.
- MVC패턴 : 웹 프로그램밍 개발 시 거의 표준적인 방식인 "Spring MVC"라 불리는 모델-뷰-컨트롤러(MVC) 패턴을 사용한다. DispatcherServlet이 Controller 역할을 담당하여 각종 요청을 적절한 서비스에 분산시켜주며 이를 각 서비스들이 처리를 하여 결과를 생성하고 그 결과는 다양한 형식의 View 서비스들로 화면에 표시될 수 있다.
- 배치 프레임워크 : 스프링은 특정 시간대에 실행하거나 대용량의 자료를 처리하는데 쓰이는 일괄 처리(Batch Processing)을 지원하는 배치 프레임워크를 제공한다. 기본적으로 스프링 배치는 Quartz 기반으로 동작한다.
- 애플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 "컨테이너"(Container)라고 할 수 있다. 또한 iBatis, myBatis나 Hibernate 등 완성도가 높은 데이터베이스처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.
Spring의 구조
스프링은 Core, DAO, ORM, AOP, Web, JEE, 총 6개의 모듈로 구성이 되어있다.
- Core: 제어 역전(IoC)과 의존성 주입(DI) 기능을 제공한다. 생소한 용어일 수 있으나 제어 역전은 전체적인 프로세스의 흐름이 개발자가 아니라 프레임워크(여기서는 Spring)에 의해 결정된다는 뜻이다. 개발자는 프레임워크가 정한 틀에 따라 적절한 코드를 작성해 넣기만 하면 되기 때문이다. 의존성 주입은 객체 생성에 관한 뜻이다. 클래스 A와 B가 있다고 할 때, A 클래스의 메소드 내에서 B 클래스의 객체를 생성하여 비즈니스 로직에 사용하면 A는 B에 '의존'하는 관계가 된다. 그리고 A, B 클래스가 아닌 외부에서 A 클래스의 메소드를 호출하고, 파라미터 값으로 B 클래스의 객체를 전달한다면 이것은 '주입'이 된다. 그렇다면 의존성 주입은? 이 두 상황을 합치면 된다. 파라미터 값으로 전달받은 B 객체를 A 클래스의 메소드 내에서 비즈니스 로직에 사용하는 것을 의미한다. 즉 A와 B의 '의존' 관계가 외부에서의 '주입'을 통해 이루어진 것이다.
- DAO: JDBC 추상 계층을 제공한다. JDBC는 자바의 데이터베이스 커넥터이다. 데이터가 담겨있는 VO(Value Object) 클래스를 이용해 사용한다.
- ORM: JPA, Hibernate와 같은 ORM이나 MyBatis 같은 데이터베이스 API 등과 통합할 수 있는 기능을 제공한다.
- AOP: 스프링 프레임워크에서 제공하는 AOP 패키지를 제공한다. 공통로직을 한군데서 관리해서 공동으로 사용한다는 개념 자체는 어렵지 않으나. 데이터와 변수가 어디서 어디로 오고가는지를 따지면 머리통이 돌아버리게 된다. 스프링 공부하는 도중 최악의 난이도를 지닌 구간이라고 할 수 있다. 처음 공부할 때는 대충 보고 뒤의 내용을 계속 공부하는 것을 추천한다. 실질적으로는 로그찍기용이 대부분이다.
- Web: Spring Web MVC, Struts, WebWork 등 웹 어플리케이션 구현에 도움되는 기능을 제공한다.
- JEE: EJB, JMX 등의 엔터프라이즈 J2EE 스펙에 관한 기능을 제공한다.
참고
* https://namu.wiki/w/Spring(%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC)
* https://velog.io/@shlee327/%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B8%B0%EC%B4%88%EC%99%80-%EC%9B%90%EB%A6%AC%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
* https://goddaehee.tistory.com/156

Spring이란 무엇인가?
'자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크' 라고 가장 잘 알려져있다.
Java/Kotlin 기반의 웹 프레임워크로서, 로드 존슨이 2002년에 출판한 저서 Expert One-on-One J2EE Design and Development에서 선보인 소스 코드를 시작으로 점점 발전하게 되었다. '스프링'이라는 이름의 유래는 이전에 Java EE의 스펙을 구현한 EJB가 기술의 복잡도가 증가해서 성능이 느렸던 것을 탈피하여, EJB 시절을 “겨울”에 빗대어 겨울 후의 “봄”으로 새로운 시작한다는 것을 의미하는 스프링(봄)이 되었다. Java Virtual Machine에서 작동하며, 아파치 라이선스 2.0을 따르는 오픈 소스 프레임워크이다.
Spring의 주요특징
- POJO(Plain Old Java Object) 방식 : POJO는 Java EE의 EJB 를 사용하면서 해당 플랫폼에 종속되어 있는 무거운 객체들을 만드는 것에 반발하며 나타난 용어다. 별도의 프레임워크 없이 Java EE를 사용할 때에 비해 특정 인터페이스를 직접 구현하거나 상속받을 필요가 없어 기존 라이브러리를 지원하기가 용이하고, 객체가 가볍다.
- 관점 지향 프로그래밍(Aspect Oriented Programming, AOP) : 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할 수 있다. AspectJ를 포함하여 사용할 수 있고, 스프링에서 지원하는 실행에 조합하는 방식도 지원한다. 이 분리 관리한다는 게 개념이 처음에 이해해기가 어려운데, 추상/부모/클래스나 인터페이스로 관리된다는 게 아니라 모듈을 관리해주는 모듈을 상하/인터페이스 관계없이 따로 마련한다는 개념에 가깝다. 전공자들을 위해서 더 쉽게 설명하자면 C언어에서는 중복할당을 줄이기 위해서 간접적으로 값을 가리키는 포인터로 가리키는데, Spring에서는 반복할당을 줄이기 위해 포인터를 대신하여 스프링 어노테이션을 사용하는 것이라고 보면 된다.
쉽게 말하자면 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 '공통적'으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있도록 하는 것이다. - 의존성 주입(Dependency Injection, DI) : 프로그래밍에서 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부에서 설정을 통해 정의되는 방식이다. 코드 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있으며 모듈간의 결합도도 낮출 수 있다. 계층, 서비스 간에 의존성이 존재하는 경우 스프링 프레임워크가 서로 연결시켜준다.
- 제어 역전(Inversion of Control, IoC) : 전통적인 프로그래밍에서는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출해서 이용했다. 제어 역전은 이와 반대로 외부 라이브러리 코드가 개발자의 코드를 호출하게 된다. 즉, 제어권이 프레임워크에게 있어 필요에 따라 스프링 프레임워크가 사용자의 코드를 호출한다.
- 생명주기 관리 : 경량 컨테이너(크기와 부하의 측면)로서 자바 객체를 직접 관리한다. 스프링 프레임워크는 Java 객체의 생성, 소멸을 직접 관리하며 필요한 객체만 사용할 수 있다.
- MVC패턴 : 웹 프로그램밍 개발 시 거의 표준적인 방식인 "Spring MVC"라 불리는 모델-뷰-컨트롤러(MVC) 패턴을 사용한다. DispatcherServlet이 Controller 역할을 담당하여 각종 요청을 적절한 서비스에 분산시켜주며 이를 각 서비스들이 처리를 하여 결과를 생성하고 그 결과는 다양한 형식의 View 서비스들로 화면에 표시될 수 있다.
- 배치 프레임워크 : 스프링은 특정 시간대에 실행하거나 대용량의 자료를 처리하는데 쓰이는 일괄 처리(Batch Processing)을 지원하는 배치 프레임워크를 제공한다. 기본적으로 스프링 배치는 Quartz 기반으로 동작한다.
- 애플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 "컨테이너"(Container)라고 할 수 있다. 또한 iBatis, myBatis나 Hibernate 등 완성도가 높은 데이터베이스처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.
Spring의 구조
스프링은 Core, DAO, ORM, AOP, Web, JEE, 총 6개의 모듈로 구성이 되어있다.
- Core: 제어 역전(IoC)과 의존성 주입(DI) 기능을 제공한다. 생소한 용어일 수 있으나 제어 역전은 전체적인 프로세스의 흐름이 개발자가 아니라 프레임워크(여기서는 Spring)에 의해 결정된다는 뜻이다. 개발자는 프레임워크가 정한 틀에 따라 적절한 코드를 작성해 넣기만 하면 되기 때문이다. 의존성 주입은 객체 생성에 관한 뜻이다. 클래스 A와 B가 있다고 할 때, A 클래스의 메소드 내에서 B 클래스의 객체를 생성하여 비즈니스 로직에 사용하면 A는 B에 '의존'하는 관계가 된다. 그리고 A, B 클래스가 아닌 외부에서 A 클래스의 메소드를 호출하고, 파라미터 값으로 B 클래스의 객체를 전달한다면 이것은 '주입'이 된다. 그렇다면 의존성 주입은? 이 두 상황을 합치면 된다. 파라미터 값으로 전달받은 B 객체를 A 클래스의 메소드 내에서 비즈니스 로직에 사용하는 것을 의미한다. 즉 A와 B의 '의존' 관계가 외부에서의 '주입'을 통해 이루어진 것이다.
- DAO: JDBC 추상 계층을 제공한다. JDBC는 자바의 데이터베이스 커넥터이다. 데이터가 담겨있는 VO(Value Object) 클래스를 이용해 사용한다.
- ORM: JPA, Hibernate와 같은 ORM이나 MyBatis 같은 데이터베이스 API 등과 통합할 수 있는 기능을 제공한다.
- AOP: 스프링 프레임워크에서 제공하는 AOP 패키지를 제공한다. 공통로직을 한군데서 관리해서 공동으로 사용한다는 개념 자체는 어렵지 않으나. 데이터와 변수가 어디서 어디로 오고가는지를 따지면 머리통이 돌아버리게 된다. 스프링 공부하는 도중 최악의 난이도를 지닌 구간이라고 할 수 있다. 처음 공부할 때는 대충 보고 뒤의 내용을 계속 공부하는 것을 추천한다. 실질적으로는 로그찍기용이 대부분이다.
- Web: Spring Web MVC, Struts, WebWork 등 웹 어플리케이션 구현에 도움되는 기능을 제공한다.
- JEE: EJB, JMX 등의 엔터프라이즈 J2EE 스펙에 관한 기능을 제공한다.
참고
* https://namu.wiki/w/Spring(%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC)
* https://velog.io/@shlee327/%EC%8A%A4%ED%94%84%EB%A7%81-%EA%B8%B0%EC%B4%88%EC%99%80-%EC%9B%90%EB%A6%AC%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90
* https://goddaehee.tistory.com/156