학습
Java Spring Framework 기본 개념
Java Spring Framework 기본 개념 — 고급
Spring Framework 기본 개념
1. 도입 (왜 배워야 하는가)
Spring Framework는 Java 기반의 애플리케이션 개발에 있어서 가장 널리 사용되는 프레임워크 중 하나입니다. 대규모 웹 애플리케이션 개발 시, Spring을 사용하면 코드의 재사용성과 관리 용이성을 높일 수 있습니다. 이를 통해 개발자는 비즈니스 로직에 집중할 수 있고, 유지보수 비용을 줄일 수 있습니다.
만약 Spring Framework를 모른다면, 의존성 관리, 트랜잭션 처리, 보안 등 다양한 기능을 수동으로 구현해야 하므로 개발이 복잡해지고, 코드 품질이 떨어질 수 있습니다. 즉, Spring Framework는 효율적인 개발을 위한 필수 도구입니다.
2. 핵심 개념 설명
2.1 IoC (Inversion of Control)
IoC는 제어의 역전이라는 의미로, 객체의 생성 및 관리 책임을 개발자가 아닌 프레임워크가 맡는 것을 말합니다. 마치 주인이 아닌 집주인이 집 열쇠를 관리하는 것과 비슷합니다.
2.2 DI (Dependency Injection)
DI는 의존성 주입으로, 객체가 필요한 의존성을 스스로 생성하는 것이 아니라, 외부에서 주입받는 방식입니다. 예를 들어, 커피 머신이 커피 원두를 스스로 구입하지 않고, 사용자에게서 받는 것처럼 이해할 수 있습니다.
| 용어 | 설명 |
|---|---|
| IoC | 객체의 제어권이 프레임워크에 있음 |
| DI | 의존성을 외부에서 주입받음 |
3. 기본 코드 예제
아래는 Spring Boot를 사용하여 간단한 IoC와 DI를 구현하는 예제입니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public CoffeeMachine coffeeMachine() {
return new CoffeeMachine(coffeeBeans());
}
@Bean
public CoffeeBeans coffeeBeans() {
return new CoffeeBeans("Arabica");
}
}
public class CoffeeMachine {
private CoffeeBeans coffeeBeans;
public CoffeeMachine(CoffeeBeans coffeeBeans) {
this.coffeeBeans = coffeeBeans;
}
public void brew() {
System.out.println("Brewing coffee with " + coffeeBeans.getType());
}
}
public class CoffeeBeans {
private String type;
public CoffeeBeans(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
- 실행 결과:
Brewing coffee with Arabica
- @Configuration: 이 클래스가 Spring의 설정 클래스임을 나타냅니다.
- @Bean: Spring이 관리할 객체를 생성하는 메서드에 붙이는 어노테이션입니다.
- CoffeeMachine 클래스는 CoffeeBeans 객체를 생성자 매개변수로 받습니다.
- brew() 메서드에서 커피를 추출할 때 사용하는 원두의 타입을 출력합니다.
4. 실전 활용 예제
4.1 웹 애플리케이션의 컨트롤러
쇼핑몰에서 장바구니를 구현할 때, 사용자가 추가한 상품을 관리하는 컨트롤러를 작성할 수 있습니다.
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/cart")
public class CartController {
@PostMapping("/add")
public String addItem(@RequestBody Item item) {
// 장바구니에 아이템 추가 로직
return "Item added to cart: " + item.getName();
}
}
4.2 서비스 레이어
주문 처리 시, 트랜잭션을 관리하는 서비스 클래스를 작성할 수 있습니다.
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class OrderService {
@Transactional
public void placeOrder(Order order) {
// 주문 처리 로직
}
}
5. 흔한 실수와 주의사항
실수 1: 의존성 주입을 잘못 이해하기
public class CoffeeMachine {
private CoffeeBeans coffeeBeans;
public CoffeeMachine() {
this.coffeeBeans = new CoffeeBeans("Arabica"); // 잘못된 예
}
}
public class CoffeeMachine {
private CoffeeBeans coffeeBeans;
public CoffeeMachine(CoffeeBeans coffeeBeans) { // 의존성 주입
this.coffeeBeans = coffeeBeans;
}
}
실수 2: @Autowired를 잊어버리기
public class CartController {
private OrderService orderService; // @Autowired를 잊음
public CartController(OrderService orderService) {
this.orderService = orderService;
}
}
@Autowired
public CartController(OrderService orderService) { // @Autowired 추가
this.orderService = orderService;
}