스프링 컨텍스트: 추상화

김우진·2026년 2월 17일

Spring

목록 보기
4/17
post-thumbnail

[Spring] 04. 스프링 컨텍스트: 추상화 (Abstraction)

객체지향 설계의 꽃인 추상화를 스프링 컨텍스트에서 어떻게 활용하고, 의존성 주입과 결합하여 유연한 코드를 만드는지 정리했습니다.


1. 인터페이스를 통한 계약 정의

추상화로 구현을 분리하는 것은 클래스 설계의 핵심입니다.

  • 객체 분리의 장점: 특정 구현체에 의존하지 않으므로, 애플리케이션의 다른 부분에 영향을 주지 않고도 구현을 쉽게 변경할 수 있습니다.
  • 유지 관리: 시스템의 확장성이 좋아지고 유지 관리가 훨씬 수월해집니다.

2. 추상화와 의존성 주입(DI)

스프링은 인터페이스를 타입으로 하여 의존성을 주입받는 방식을 권장합니다.

  • 빈 등록: 실제 구현 클래스에 스테레오타입 애너테이션(@Service, @Repository 등)을 붙여 빈으로 등록합니다.
  • ⚠️ 주의: 인터페이스 자체에는 스테레오타입 애너테이션을 사용하지 않습니다.

3. 여러 구현체가 있을 때의 모호함 해결

하나의 인터페이스에 두 개의 구현 클래스가 빈으로 등록되어 있다면, 스프링은 어떤 것을 주입할지 몰라 예외를 발생시킵니다.

해결 방법

  1. @Primary 사용: 여러 후보 중 기본적으로 사용할 구현체에 우선순위를 부여합니다.
  2. @Qualifier 사용: 주입받는 시점(생성자나 필드)에 명시적으로 빈의 이름을 지정합니다.
    • 서비스 객체의 의존성으로 주입할 때 매개변수 바로 앞에도 작성해 주어야 합니다.

4. 책임에 따른 스테레오타입 애너테이션

단순히 @Component를 쓰는 것보다 객체의 역할(책임)에 맞는 애너테이션을 사용하는 것이 좋습니다.

  • @Service: 비즈니스 로직을 담당하는 서비스 레이어 컴포넌트에 사용합니다.
  • @Repository: 데이터베이스와의 상호작용(영속성 계층)을 담당하는 컴포넌트에 사용합니다.
  • @Component: 그 외에 특정한 책임이 명확하지 않은 일반적인 컴포넌트에 사용합니다.

💡 요약

  • 인터페이스를 사용해 구현과 설계를 분리하자.
  • 주입받을 때는 구현체가 아닌 인터페이스 타입으로 주입받아 유연성을 높이자.
  • 객체의 역할(Service, Repository 등)에 맞는 애너테이션을 사용하여 가독성과 명확성을 높이자.

#Spring #Abstraction #Interface #Service #Repository #백엔드공부

0개의 댓글