Spring Framework

교과목 내용을 정리하기 위한 글입니다. 틀린 내용이 있을 수 있으니 참고하세요
사전지식
1. 웹 시스템 - 웹에서 서로 다른 호스트의 상호 작용을 위한 소프트웨어 시스템
- 클라이언트-서버 기반
- HTTP, 메시지 지향적(xml,json)
- 플랫폼 중립적, 독립적
2. 프레임워크
- 소프트웨어 품질에는 기능 품질, 구조 품질이 있다.
- 프레임워크란 구조 품질을 보장한다.
- 프레임워크는 반제품으로 애플리케이션 구조 및 코드의 상당 부분을 제공, 개발자는 핵심 로직 개발에 집중 가능하다.
이를 통해 높은 생산성과 코드 품질이 보장된다.
3. 라이브러리 ↔ 프레임워크
중요한 차이점은 제어의 역전 (Inversion of Controll)이다.
라이브러리 | 프레임워크 | |
---|---|---|
차이 | 제어의 주체: 개발자(호출) 클래스의 집합: 코드 재사용 ↑ | 제어의 주체 : 프레임워크 (IoC) 프레임워크의 구조에 따라 코드 작성하면 프레임워크에서 호출 |
스프링이란?
Light weight JavaApplication Framework
POJO 기반의 앤터프라이즈 애플리케이션 개발을 쉽고 편하게 함
- 자바 애플리케이션을 개발하는데 필요한 하부구조 (infrastructure)를 포괄적으로 제공
- 스프링이 하부 구조를 처리하므로 개발자는 애플리케이션 개발에 집중
POJO란 특정 인터페이스 구현이나 특정 클래스 상속 없이 사용할 수 있는 단순 Java 클래스이며, 스프링 컨테이너에 의해 구성 및 관리됨
스프링의 주요 특징
- 의존 관계 주입 (Dependency Injection)
- 관점 중심 프로그래밍 (Aspect Oriented Programming)
- 이식 가능한 서비스 추상화 (Portable Service Abstraction)
1. DI
- 객체간의 의존성을 낮추기 위함
- 객체와 그 의존성을 직접 생성하는 대신, 외부 엔티티(즉, Spring IoC Container)에 의해 객체가 생성 및 구성된다
@Component
public class PersonService {
private Person person;
@Autowired
public PersonService(Person person) {
this.person = person;
}
public void printPerson() {
System.out.println("Name: " + person.getName() +
", Age: " + person.getAge());
}
}
- PersonService는 Person에 의존한다
- Spring Container에 의해 생성된 Person 객체는 생성자를 통해 주입된다.
2. AOP
애플리케이션의 핵심 비즈니스 로직과 공통적으로 필요한 부가 기능(예: 로깅, 보안, 트랜잭션 관리 등)을 분리하여 모듈화하는 프로그래밍 패러다임
- 관심사의 분리: 비즈니스 로직과 부가 기능을 분리하여 각각의 역할을 명확히 함
- 재사용성 증가, 유지보수 용이
public class UserService {
public void addUser(User user) {
// Log information about adding the user
System.out.println("Adding user: " + user.getUsername());
// Add the user to the database
}
}
비즈니스 로직과 로깅 로직 혼재
@Aspect
public class LoggingAspect {
@Before("execution(* kr.ac.hansung.UserService.addUser(..)) && args(user)")
public void logBefore(JoinPoint joinPoint, User user) {
System.out.println("Adding user: " + user.getUsername());
}
}
Aspect (LoggingAspect) 로깅 기능을 별도의 클래스로 분리하여 관리
3. PSA
애플리케이션 코드가 다양한 서비스 제공자와 상호작용할 수 있도록 공통 인터페이스를 제공하는 추상화 계층
+----------------------------------+
| Application Code |
+----------------------------------+
| +-----------+
+---| **PSA** |
+-----------+
| +---------------------+
+-------| Service Provider 1 |
+---------------------+
| +---------------------+
+-------| Service Provider 2 |
+---------------------+
- 공통 인터페이스 제공:
- PSA 계층은 여러 서비스 제공자(구체적인 서비스 구현체)와 애플리케이션 코드 사이에 일관된 인터페이스를 제공. 애플리케이션 코드는 이 공통 인터페이스를 통해 서비스와 상호작용하므로, 개별 서비스 제공자의 세부 구현에 신경 쓸 필요가 없음
- 유연한 서비스 전환:
- PSA를 사용하면 서비스 제공자를 변경할 때 애플리케이션 코드를 수정할 필요 없이 PSA 계층이 제공하는 인터페이스만 준수하면 됩니다. 이로 인해 서로 다른 서비스 제공자 간의 전환이 매우 용이해짐.
- Spring과의 통합:
- Spring 환경에서 PSA를 도입하면, 의존성 주입 등과 같은 Spring의 기능을 활용하여 PSA 계층을 관리할 수 있고, 이를 통해 보다 모듈화된 설계와 유지보수가 용이한 코드를 작성 가능.
결론
스프링을 통해 Java Enterprise 시스템 개발이 용이
- 비즈니스 로직에 집중 가능하여 생산성 증대
- 재사용 및 유지 보수 용이, 확장성을 가진 코드 설계