CS/프레임워크

Spring이란?

glorypang 2025. 9. 8. 18:06
728x90
반응형
SMALL

Spring 이란?

Spring은 JAVA 기술들을 더 쉽게 사용할 수 있게 해주는 오픈소스 프레임워크입니다.

왜 Spring이 필요할까?

Java 개발의 현실을 생각해보세요:

  • 프로젝트 규모가 커졌습니다: 옛날과 달리 지금의 Java 프로젝트는 훨씬 복잡하고 큽니다
  • 다양한 기술들이 등장했습니다: JSP, MyBatis, JPA 등 수많은 기술들을 프로젝트에서 함께 사용해야 합니다
  • 중복 코드가 발생합니다: 아무리 팀으로 분업해도 비슷한 코드들이 반복적으로 나타납니다
  • 복잡한 설정들: 각 기술을 연동하려면 복잡한 설정과 코드가 필요합니다

객체 생성, 설정 파일 작성, 기술 연결과 같은 부수적인 일에 많은 시간 소비

 

Spring은 이런 문제들을 해결해줍니다:

  1. 중복 코드 줄이기: 반복되는 패턴을 프레임워크가 처리해줍니다
  2. 비즈니스 로직에 집중: 복잡한 기술적 처리는 Spring이 맡고, 개발자는 핵심 로직에 집중할 수 있습니다
  3. 오픈소스 활용 용이: 다른 개발자의 코드나 라이브러리를 쉽게 가져다 쓸 수 있는 구조를 제공합니

Spring의 핵심 특징

그렇다면 스프링 프레임워크의 특징에 대해 살펴보도록 하겠습니다.

1. 경량 컨테이너 (Lightweight Container)

객체를 대신 만들어주고 생성주기를 관리해주는 박스

// 전통적인 방식: 개발자가 직접 객체 생성/관리
UserService userService = new UserService();
userService.doSomething();
// 언제 객체를 삭제해야 할까? 메모리는 괜찮을까?

// Spring 방식: 컨테이너가 객체 관리
@Autowired
UserService userService; // Spring이 알아서 생성하고 주입해줌
  • 객체의 생성부터 소멸까지의 전체 생명주기를 Spring이 관리해줍니다.
  • 개발자는 "이런 객체가 필요해"라고만 말하면 됩니다.

2. 제어의 역전 (IoC: Inversion of Control)

객체 생성·수명 관리를 컨테이너가 담당

기존 방식 (개발자가 제어):

public class OrderService {
    private PaymentService paymentService;
    
    public OrderService() {
        // 개발자가 직접 생성하고 관리
        this.paymentService = new PaymentService();
    }
}

Spring 방식 (프레임워크가 제어):

@Service
public class OrderService {
    @Autowired
    private PaymentService paymentService; // Spring이 알아서 생성해서 넣어줌
    
    // 개발자는 비즈니스 로직에만 집중!
    public void processOrder() {
        // 핵심 로직 작성
    }
}

 

왜 좋을까?

  • 개발자는 "어떻게 객체를 만들고 관리할까" 대신 "이 기능은 어떻게 동작해야 할까"에 집중할 수 있습니다.

3. 의존성 주입 (DI: Dependency Injection)

구현 대신 역할(인터페이스) 에 의존하고, 구현은 외부에서 주입

문제 상황:

// 강한 결합 - 수정이 어려움
public class OrderService {
    private KakaoPayService paymentService = new KakaoPayService(); // 카카오페이에 고정됨
}

DI해결책

// 약한 결합 - 유연함
public class OrderService {
    private PaymentService paymentService; // 인터페이스 사용
    
    // 외부에서 구체적인 구현체를 주입받음
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}

 

장점:

  • 결합도 낮아짐: 카카오페이에서 토스페이로 바꿔도 OrderService 코드는 변경 없음
  • 유연성 높아짐: 새로운 결제 서비스 추가가 쉬움
  • 테스트 용이: Mock 객체로 쉽게 테스트 가능

4. 관점지향 프로그래밍 (AOP: Aspect-Oriented Programming)

트랜잭션·로깅·보안 등 반복되는 관심사를 어노테이션/규약으로 일괄 처리

모든 서비스에서 반복되는 코드들:

public void saveUser() {
    log.info("사용자 저장 시작"); // 로깅
    // 권한 체크 코드
    // 트랜잭션 시작
    
    // 실제 비즈니스 로직 (핵심 관심사)
    userRepository.save(user);
    
    // 트랜잭션 커밋
    log.info("사용자 저장 완료"); // 로깅
}

AOP로 분리

@Transactional  // 트랜잭션은 Spring이 처리
@Loggable      // 로깅도 자동 처리
@Secured       // 보안도 자동 처리
public void saveUser() {
    // 오직 핵심 비즈니스 로직만!
    userRepository.save(user);
}

 

결과: 개발자는 정말 중요한 비즈니스 로직에만 집중할 수 있습니다.

728x90
반응형
LIST