IMCAT.DEV
로그인 가입
Java 고급 프레임워크

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();
        }
    }
  • 상황 설명: 사용자가 장바구니에 상품을 추가할 때, 해당 API를 호출하여 상품 정보를 서버에 전송합니다.
  • 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;
        }
    }
  • 설명: 의존성 주입을 통해 객체의 생성 책임을 프레임워크에 넘겨야 하며, 직접 생성하면 IoC의 이점을 잃게 됩니다.
  • 실수 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;
    }
  • 설명: Spring이 자동으로 의존성을 주입하기 위해 @Autowired를 사용해야 합니다.
  • 6. 정리

  • Spring Framework는 Java 기반 애플리케이션 개발에 필수적인 도구입니다.
  • IoC와 DI를 통해 코드의 재사용성과 유지보수성을 높일 수 있습니다.
  • RESTful API와 서비스 레이어의 트랜잭션 관리를 통해 실무에서 유용하게 활용할 수 있습니다.
  • 추천 학습 주제

  • Spring Boot의 고급 기능
  • Spring Security를 통한 애플리케이션 보안 강화
  • Spring Data JPA를 활용한 데이터베이스 접근 관리