Spring Framework(스프링 프레임워크)는 자바(Java) 기반의 오픈소스 애플리케이션 프레임워크로, 대규모 웹 애플리케이션을 효율적으로 개발할 수 있게 도와주는 도구입니다. 핵심 목적은 개발자가 비즈니스 로직에 집중할 수 있도록 반복적이고 복잡한 작업을 줄여주는 것입니다.
스프링 프레임워크의 핵심 개념
1. IoC (Inversion of Control, 제어의 역전)
- 객체 생성과 의존성 관리를 개발자가 아닌 스프링 컨테이너가 대신 해주는 개념
- 대표 기술: DI (Dependency Injection, 의존성 주입)
@Component
public class UserRepository {
public String findUser() {
return "홍길동";
}
}
@Service
public class UserService {
private final UserRepository userRepository;
// 생성자 주입 (DI)
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public String getUserName() {
return userRepository.findUser();
}
}
설명: UserService는 UserRepository를 직접 생성하지 않고, 스프링이 자동으로 주입(DI) 해줍니다. 이게 바로 IoC의 핵심입니다. (제어권이 개발자 → 스프링으로 이동)
2. AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)
- 공통 기능(로깅, 보안, 트랜잭션 처리 등)을 핵심 로직과 분리해서 관리
- 코드 중복을 줄이고 유지보수를 쉽게 함
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore() {
System.out.println("메서드 실행 전 로그!");
}
@After("execution(* com.example.service.*.*(..))")
public void logAfter() {
System.out.println("메서드 실행 후 로그!");
}
}
설명: 서비스 로직에 전혀 손대지 않고도 공통 기능(여기선 로그 출력)을 분리하여 적용합니다. 이게 AOP의 핵심이며, 로깅, 트랜잭션, 보안 등 공통 처리가 필요할 때 유용합니다.
3. Transaction Management (트랜잭션 관리)
- 선언적으로 트랜잭션을 관리 가능 (복잡한 DB 처리 로직 간편화)
예시: 데이터 저장 중 오류가 발생하면 롤백
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
@Transactional // 트랜잭션 시작
public void placeOrder(Order order) {
orderRepository.save(order);
// 오류 발생 시 전체 작업 롤백됨
if (order.getTotalPrice() > 1000000) {
throw new RuntimeException("주문 금액이 너무 큽니다!");
}
}
}
설명: @Transactional 덕분에 예외가 발생하면 DB 작업이 자동으로 롤백됩니다. 복잡한 트랜잭션 코드를 직접 작성하지 않아도 됩니다.
4. MVC 아키텍처 지원
- Spring MVC는 웹 애플리케이션을 위한 구조화된 모델을 제공
- Controller, Service, Repository 계층 분리
예시: 게시글을 가져오는 컨트롤러, 서비스, 저장소
// Controller
@RestController
public class PostController {
@Autowired
private PostService postService;
@GetMapping("/posts/{id}")
public Post getPost(@PathVariable Long id) {
return postService.getPost(id);
}
}
// Service
@Service
public class PostService {
@Autowired
private PostRepository postRepository;
public Post getPost(Long id) {
return postRepository.findById(id).orElseThrow();
}
}
// Repository (Spring Data JPA)
@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
}
설명: 요청은 Controller → Service → Repository 구조로 흐릅니다. 이 구조가 MVC 아키텍처이며, 역할 분리를 통해 유지보수가 쉬워집니다.
주요 구성 요소
| 구성 요소 | 설명 |
| Spring Core | DI와 IoC 기능의 중심, 빈(Bean) 설정 |
| Spring AOP | 횡단 관심사 처리 (ex. 로깅, 트랜잭션) |
| Spring ORM | Hibernate, JPA 같은 ORM 연동 지원 |
| Spring JDBC | JDBC 작업 단순화 |
| Spring MVC | 웹 애플리케이션용 MVC 구조 제공 |
| Spring Security | 인증, 인가 등 보안 기능 지원 |
| Spring Boot | 설정 자동화 및 실행 간소화 (최근 가장 많이 사용됨) |
스프링을 사용하는 이유
- 생산성: 복잡한 설정을 줄이고 빠르게 개발 가능
- 유지보수성: 모듈화와 의존성 주입을 통해 코드 관리 용이
- 테스트 용이성: 객체 간 의존성이 낮아 단위 테스트 작성이 쉬움
- 확장성: 다양한 프로젝트에 맞게 유연하게 사용 가능
'웹' 카테고리의 다른 글
| WAS에 대하여 (2) | 2025.05.19 |
|---|---|
| 클라이언트-서버 구조에 대하여 (5) | 2025.05.15 |
| HTTP(HyperText Transfer Protocol) (0) | 2025.05.14 |
| MVC패턴 (0) | 2025.05.13 |