프레임워크 (Framework)
프레임워크(Framework)란 애플리케이션을 개발할 때 필요한 구조와 기능을 미리 정의해 놓은 일종의 뼈대이다.
프레임워크를 이용하여 기본 흐름이나 구조를 정하고, 해당 구조에 자신의 코드를 추가하는 방식으로 진행된다.
이를 통해 개발자는 기본적인 구조나 반복적인 작업을 직접 구현할 필요 없이 프레임워크가 제공하는 기능을 활용해
더욱 효율적으로 개발을 진행할 수 있다.
프레임워크(Framework) 특징
1. 빠른 구현 시간
프레임워크는 기본적인 구조와 자주 사용하는 기능을 미리 구현해 두어 개발자가 반복적인 작업을 하지 않아도 된다.
이러한 특징 덕분에 코드 작성 시간과 디버깅 시간을 크게 줄일 수 있다.
2. 쉬운 관리
프레임워크는 일관된 코드 구조와 패턴을 따르도록 설계되어 코드의 가독성을 높이고 유지보수성을 향상시킨다.
또한, 프레임워크는 문서화된 규칙과 관례를 제공하여 협업 상황에서 코드 품질을 유지하는 데 도움이 된다.
이러한 특징 덕분에 유지보수에 들어가는 인력과 시간을 절약할 수 있다.
3. 재사용성
프레임워크는 모듈화된 구조를 가지고 있어 특정 기능을 개발하고 다른 프로젝트에서 재사용할 수 있다.
이러한 특징 덕분에 개발 시간을 단축하고 코드의 일관성을 유지할 수 있다.
스프링 프레임워크 (Spring Framework)
스프링 프레임워크(Spring Framework)란 자바(Java) 기반의 오픈 소스 애플리케이션 프레임워크이다.
스프링은 모듈화된 구조를 가지고 있으며, 여러 가지 핵심 컴포넌트를 통해 효율적이고 생산적인 개발 환경을 제공한다.
스프링 프레임워크는 IoC, AOP, 웹 MVC 프레임워크 등의 핵심 요소를를 지원하는 경량 프레임워크이다.
※ 경량 프레임워크 (light-weight Framework)
과거 J2EE 기술은 너무나 복잡하고 방대했기 때문에, 전체를 이해하고 개발하기에는 어려움이 많았다.
경량 프레임워크는 이러한 어려움에 반대되는 개념으로 등장했다.
즉, 경량 프레임워크란 메모리 소비가 적고 설치 및 설정이 간단하며, 빠르게 배포 가능한 프레임워크이다.
스프링 프레임워크(Spring Framework) 특징
1. POJO (Plain Old Java Object)
스프링은 다른 프레임워크와 달리 객체 간의 관계를 구성할 때 별도의 API 등을 사용하지 않는다.
즉, 일반적인 Java 코드를 이용해서 객체를 구성하는 방식 그대로 스프링에서 사용할 수 있다.
2. IoC (Inversion of Control)
IOC는 제어의 역행이라는 의미로 객체의 생성과 흐름을 개발자가 아닌 프레임워크나 컨테이너가 제어한다.
일반적으로 객체는 스스로 필요한 의존성을 생성하거나 관리했으나 IoC에서는 프레임워크나 컨테이너가 대신한다.
3. DI (Dependency Injection)
DI는 IoC의 대표적인 형태로 스프링에 대해 이야기를 하면서 빠질 수 없는 개념이 의존성 주입이라는 개념이다.
의존성(Dependency)이란 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것을 의미한다.
주입(Injection)이란 단어 그대로 외부에서 밀어 넣는 것을 의미한다.
즉, 의존성 주입(Dependency Injection)이란 객체가 필요한 의존성을 외부에서 주입받는 방식이다.
DI는 주로 세 가지 방법으로 구현된다.
- 생성자 주입 : 객체가 생성될 때 생성자를 통해 의존성을 주입받는다.
- 세터 주입 : 객체가 생성된 후 세터 메서드를 통해 의존성을 주입받는다.
- 인터페이스 주입 : 객체가 특정 인터페이스를 구현함으로써 의존성을 주입받는다.
다음은 생성자 주입 방법을 활용한 DI 예제이다.
// MyDao 클래스
// Repository 어노테이션을 통해 데이터 접근 계층을 담당
@Repository
public class MyDao {
public String getDate() {
return "Hello from DAO";
}
}
// MyService 클래스
// MyDao 클래스에 의존하고 있으며, 생성자를 통해 MyDao 객체 주입 받음
@Service class MyService {
private final MyDao myDao;
@Autowired
public MyService(MyDao myDao) {
this.myDao = myDao;
}
public String porcessData() {
return myDao.getDate();
}
}
// MyController 클래스
// MyService 객체에 의존하고 있으며, 생성자를 통해 MyService 객체 주입 받음
@RestController
public class MyController {
pricate final MyService myService;
@Autowired
public MyController(MyService myService) {
this.MyService = myService
}
@GetMapping("/data")
public String getDate() {
return myService.processDate();
}
}
MyController는 MyService에, MyService는 MyDao에 의존한다.
각 클래스는 직접적으로 다른 클래스를 생성하지 않고 의존성 주입을 통해 외부에서 주입 받는다.
이렇게 함으로써 클래스 간의 결합도가 낮아지고, 변경이 용이하며 테스트 가능성이 높아진다.
4. AOP (Aspect Oriented Programming)
AOP는 횡단 관심사를 모듈로 분리하는 프로그래밍 패러다임이다.
이를 통해 개발자는 핵심 비즈니스 로직에만 집중할 수 있고, 관심사의 유지 보수가 수월한 코드 구성이 가능하며,
각 프로젝트마다 다른 관심사를 적용할 때 코드의 수정을 최소화 시킬 수 있다.
※ 횡단 관심사 (cross-concern)
대부분의 시스템이 곹옹으로 가지고 있는 보안이나 로그, 트랜잭션과 같이 비즈니스 로직은 아니지만,
반드시 처리가 부분을 횡단 관심사라고 한다.
스프링 프레임워크(Spring Framework)의 장점
1. 유연성
스프링은 다양한 모듈로 구성되어 있어, 개발자는 필요에 따라 특정 모듈만 선택해서 사용할 수 있다.
예를 들어, 스프링 데이터는 데이터 접근에 중점을 두고 스프링 시큐리티는 보안에 집중한다.
이 모듈화된 접근은 애플리케이션의 구조를 유연하게 조정할 수 있게 해준다.
2. 테스트 용이성
DI를 통해 객체를 주입받아 테스트할 수 있으므로 유닛 테스트와 통합 테스트가 쉬워진다.
테스트 목적에 따라 Mock 객체를 사용하거나 실제 객체를 주입받아 테스트할 수 있다.
3. 효튤적인 트랜잭션 관리
스프링은 트랜잭션을 선언적으로 관리할 수 있는 기능을 제공한다.
이를 통해 코드에 트랜잭션 처리를 명시하지 않고도 어노테이션을 통해 트랜잭션을 관리할 수 있다.
스프링 프레임워크(Spring Framework)에서 사용되는 디자인 패턴
패턴명 | 목적 | 적용 예시 |
Singleton | 객체의 인스턴스를 하나만 생성하고 공유 | 빈의 기본 스코프로 사용 |
Factory | 객체 생성을 캡슐화하여 생성 로직을 숨김 | BeanFactory를 통한 빈 생성 관리 |
Proxy | 대리 객체를 통해 원본 객체 접근 제어 | AOP를 통한 트랜잭션 관리 |
Template Method | 알고리즘의 골격 정의하고 하위 클래스에 위임 | JdbcTemplate, HibernateTemplate |
Dependency Injection | 객체 간 의존성을 외부에서 주입하여 결합도 낮춤 | 객체 생성과 의존성 관리 |
'Framework > Spring' 카테고리의 다른 글
[Spring] 06. 스프링(Spring) MVC (0) | 2024.08.21 |
---|---|
[Spring] 05. 스프링(Spring) 개발 환경 구축 - 라이브러리 설정 (0) | 2024.08.21 |
[Spring] 04. 스프링(Spring) 개발 환경 구축 - 프로젝트 생성 및 실행 (0) | 2024.08.21 |
[Spring] 03. 스프링(Spring) 개발 환경 구축 - 필수 소프트웨어 설치 (0) | 2024.08.21 |
[Spring] 02. 스프링 아키텍처(Spring Architecture) (1) | 2024.08.21 |