-
SpringBackEnd/Java 2025. 2. 14. 18:37
Spring
History
EJB -> Spring Framework -> Spring Boot
- EJB (Enterprise JavaBeans)
- Java EE (Enterprise Edition), 서버측 컴포넌트 구축에 중점
- 모듈화, 분산시스템, 복잡성
- Spring Framework
- EJB 복잡성을 피함, 유연하고 간결한 개발환경, 오픈 소스 프레임워크
- DI, AOP, POJO, IoC 등
- Spring Boot
- Spring Framework 확장, 빠른 독립형 실행 Application 개발이 가능한 오픈소스 프레임워크
- Standalone Application : 내장서버 (Tomcat)을 포함하여, 별도의 서버 없이 독립형으로 실행
- 자동구성 (keyword : Auto Configuration) : 대부분의 설정을 자동으로 처리
- 간단한 설정 : 복잡한 XML 설정이 없음 Anotation으로 간단하게 처리 (개발생산성 향상)
- 배포용이성 : Jar 파일로 패키징 및 배포
특징
- Dependency Injection (DI)
- 객체의 생성과 관리가 프레임워크에 의해 자동으로 이루어짐 (코드의 유지보수성, 확장성, 테스트 용이성)
- 의존성 주입을 통해 객체 간의 결합도를 낮추고, 객체를 외부에서 주입받는 방식으로 설계
- Aspect-Oriented Programming (AOP)
- 코드의 재사용성을 높이고, 관심사 분리 (단일 책임 원칙 준수)
- 핵심 비즈니스 로직과 공통적인 관심사 (예: 로깅, 트랜잭션 처리 등)를 분리
- Plain Old Java Object (POJO)
- 간단하고 가벼운 객체
- POJO는 특별한 상속이나 인터페이스 구현 없는 기본적인 Java 클래스
- 다른 프레임워크나 라이브러리에 의존하지 않으며, 추가적인 규약이나 기능을 강제 X
- 무상속 클래스 : POJO는 상속이 없거나, 최소한의 상속만을 사용 (즉, 특정 클래스를 상속받지 않고 독립적인 형태로 존재)
- 기본적으로 getter/setter 메서드를 제공하여 객체의 필드 값을 가져오거나 설정할 수 있음
- toString(), equals(), hashCode() 같은 메서드를 오버라이드 할 수도 있지만, 기본적으로는 별도의 규칙 X
- Inversion of Control (IoC)
- 개발자가 직접 제어 흐름을 작성하는 대신, 제어 흐름을 외부에서 관리하게 되는 방식
- 기존의 제어 방식 : 일반적으로 애플리케이션의 흐름을 개발자가 직접 제어 (특정 객체를 생성하고 메서드를 호출하는 방식)
- 역전된 제어 방식 : 제어 흐름이 외부로부터 주어지고, Application 은 그 흐름에 따라 동작 (프레임워크나 컨테이너가 관리하며, 개발자는 필요한 작업만 정의)
- Dependency Injection : Spring Framework에서 Spring IoC 컨테이너는 객체의 생성과 의존성 주입을 담당하며, 개발자는 필요한 객체를 명시하기만 하면 됨
- Event-driven : 특정 이벤트 (외부)가 발생하면 시스템이 반응하도록 설계하는 방식
- 유연성, 테스트용이, 결합 감소 (독립적으로 유지보수)
- 객체의 생명주기 관리
- 객체의 생성, 초기화, 소멸 등을 Spring 컨테이너가 담당 (객체 간의 의존 관계를 설정하는 데 필요한 코드를 줄임)
- Bean 을 관리하는 IoC(제어의 역전) 컨테이너를 통해 객체의 생명주기를 관리
- 모듈화 (Modularity)
- Spring은 다양한 모듈을 제공하여, 필요한 기능만 선택해서 사용
- Spring Web, Spring Data, Spring Security 등 각각의 기능이 분리되어 있어, 필요에 따라 원하는 모듈만 사용
- 객체지향 설계에서 중요한 모듈화 원칙을 따르며, 필요 없는 기능을 최소화
- 유연한 설정 방식
- 객체지향에서 중요한 캡슐화와 다형성을 지원하는 방식으로, 상황에 따라 다양한 방식으로 객체를 설정하고 사용
- XML 설정, 자바 기반 설정 (Java Configuration), Anotation 기반 설정 등을 지원
- 테스트 용이성 (Testability)
- DI와 AOP를 활용한 Mock 객체나 가짜 구현체를 쉽게 주입하여 테스트에 용이
- 객체지향 설계 원칙 중 변경에 폐쇄적, 확장에 개방적(OCP) 구조로 설계되어 있기 때문에, 단위 테스트 및 통합 테스트를 쉽게 작성
- 트랜잭션 관리
- 책임 분리의 원칙을 잘 따르는 방식으로, 데이터베이스 트랜잭션 처리가 코드와 분리되어 더 깔끔하게 관리
- 선언적 트랜잭션 관리를 제공하여, 비즈니스 로직에서 트랜잭션을 쉽게 관리
- EJB (Enterprise JavaBeans)