프레임워크란?
- 개발자가 일정 규칙과 구조 안에서 코드를 작성하도록 돕는 도구
- 복잡한 로직을 단순화하거나 생략할 수 있도록 해 코드 재사용성, 유지보수성을 높임
- 객체 생성, 의존성 관리 등 잡다한 부분을 자동화하여 필요한 비즈니스 로직에 집중할 수 있게 해준다. (생산성 증가)
Spring 프레임워크 특징
- POJO (Plain Old Java Object)
특별한 인터페이스나 클래스를 상속받지 않고 순수한 자바 객체를 사용해 개발 진행한다.
이는 코드 재사용성, 독립성을 높임 - 의존성 주입
의존성 주입을 통해 객체 간 결합도를 낮춘다. - AOP (관점 지향 프로그래밍)
횡단 관심사 분리(Cross-Cutting Concerns)하여 핵싱 기능들이 수행될 때 수반해야할 부수 기능들을 모듈화할 수 있도록 도움 - 트랜잭션 관리
선언적 트랜잭션 관리를 통해 데이터의 무결성, 안정성을 유지할 수 있게 돕는다!
메서드가 수행되다가 예외가 발생하면 메서드 실행 전 상태로 데이터 상태를 복원해준다.
의존성 주입이란?
객체가 필요한 의존성을 직접 생성하지 않고, 외부 다른 클래스에서 주입받는 방식.
특정 구현체에 고정되지 않고, 다양한 구현체로 쉽게 변경이 가능해 유연성이 높아지고,
다른 환경에서도 재사용하기 쉽기 때문에 재사용성이 좋아진다.
의존관계 역전
상위 클래스가 하위 클래스에 의존하지 않고 인터페이스나 추상 클래스에 의존하도록 함으로써, 상위 모듈이 하위 모듈 변화에 영향을 덜 받도록 하는 방식
이 방식은 코드 유연성과 확장성을 높이고 의존성을 쉽게 관리할 수 있다.
// 인터페이스
public interface PaymentService {
void processPayment();
}
// 인터페이스를 구현한 클래스 A
public class CreditCardPaymentService implements PaymentService {
@Override
public void processPayment() {
System.out.println("Processing credit card payment...");
}
}
// 주문서비스
public class OrderService {
// 인터페이스에 의존
private PaymentService paymentService;
// 결제서비스를 신용카드 대신 현금으로 교체해도 해당 코드를 수정하지 않아도 됨!
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void placeOrder() {
System.out.println("Placing order...");
paymentService.processPayment();
}
}
위 코드에서 OrderService는 PaymentService 인터페이스에 의존하므로, 실제 구현을 쉽게 변경할 수 있음. CreditCardPaymentService 대신 다른 결제 서비스로 교체해도 OrderService의 코드는 수정할 필요가 없어진다!
Spring에서 의존성을 주입하는 방법
1. XML설정 파일을 통한 방법
<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans" ...>
<bean id="paymentService" class="com.example.CreditCardPaymentService"/>
<bean id="orderService" class="com.example.OrderService">
<constructor-arg ref="paymentService"/>
</bean>
</beans>
2. 어노테이션을 이용한 방법
@Service
public class OrderService {
private final PaymentService paymentService;
@Autowired
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
public void placeOrder() {
System.out.println("Placing order...");
paymentService.processPayment();
}
}
3. Java Config를 통한 방법
@Configuration
public class AppConfig {
@Bean
public PaymentService paymentService() {
return new CreditCardPaymentService();
}
@Bean
public OrderService orderService() {
return new OrderService(paymentService());
}
}