backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • 의존관계 주입 (Dependency Injection)
  • 1. 생성자 주입
  • 2. 세터 주입
  • 3. 필드 주입 (권장하지 않음)
  • 4. 롬복을 활용한 생성자 주입
  • 5. 조회한 모든 빈이 필요할 때
  1. 스프링
  2. Spring Boot
  3. 07 스프링 빈 자동설정

스프링 빈 자동설정 보충자료

의존관계 주입 (Dependency Injection)

스프링에서 의존관계 주입은 객체 간의 관계를 설정하고 관리하기 위해 사용됩니다. 의존관계 주입 방법으로는 생성자 주입, 세터 주입, 필드 주입 등이 있으며, 각각의 특징과 적합한 사용 사례가 있습니다.


1. 생성자 주입

특징

  • 불변 및 필수 의존 관계에 적합합니다.

  • 생성자 호출 시점에 의존 관계를 설정하며, 이후 변경할 수 없습니다.

  • 스프링이 @Autowired를 생략하더라도 자동으로 의존성을 주입합니다.

장점

  • 의존성이 명확하게 보장됩니다.

  • 객체 생성 시 반드시 필요한 의존성을 주입하므로 NPE(NullPointerException) 위험이 줄어듭니다.

  • 테스트 시 Mock 객체를 쉽게 주입할 수 있습니다.

예시 코드

@Component
public class OrderService {
    private final ProductRepository productRepository;

    // 생성자 주입
    public OrderService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }
}

2. 세터 주입

특징

  • 선택적이고 변경 가능성이 있는 의존 관계에 적합합니다.

  • 세터 메서드에 @Autowired를 사용하여 의존성을 주입합니다.

  • 주입할 대상이 없어도 동작해야 한다면 @Autowired(required = false)를 설정할 수 있습니다.

단점

  • 생성 후 의존 관계를 변경할 수 있어, 불변성을 해칩니다.

  • 모든 의존성을 반드시 필요로 하지 않을 때 사용해야 합니다.

예시 코드

@Component
public class CustomerService {
    private ProductRepository productRepository;

    @Autowired(required = false) // 주입 대상이 없으면 null로 설정
    public void setProductRepository(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }
}

3. 필드 주입 (권장하지 않음)

특징

  • 클래스의 필드에 직접 @Autowired를 선언하여 의존성을 주입합니다.

  • 테스트 코드에서만 제한적으로 사용을 권장합니다.

단점

  • 객체 생성 후 의존성을 변경할 수 없어 테스트가 어렵습니다.

  • DIP(Dependency Inversion Principle)를 위반할 가능성이 높습니다.

  • 스프링 외부에서 의존성을 주입하기 어렵습니다.

예시 코드

@Component
public class PaymentService {
    @Autowired
    private ProductRepository productRepository; // 권장하지 않음
}

4. 롬복을 활용한 생성자 주입

특징

  • 롬복(Lombok)의 @RequiredArgsConstructor를 사용하면 생성자를 직접 작성하지 않아도 됩니다.

  • final로 선언된 필드를 대상으로 자동으로 생성자를 생성합니다.

설정

  1. Lombok 의존성 추가 (Maven)

// 롬복
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
  1. Lombok 플러그인 설치

    • IntelliJ IDEA 또는 Eclipse에서 Lombok 플러그인을 설치하고 활성화합니다.

  2. 애플리케이션 클래스에서 사용

@Component
@RequiredArgsConstructor
public class ShippingService {
    private final ProductRepository productRepository;
    private final OrderRepository orderRepository;
}
  • 위 코드에서 롬복은 ProductRepository와 OrderRepository를 파라미터로 받는 생성자를 자동으로 생성합니다.


5. 조회한 모든 빈이 필요할 때

상황

  • 특정 타입의 빈이 여러 개 존재하며, 이들을 모두 주입받아야 할 때 사용합니다.

  • 스프링은 List나 Map으로 빈을 주입받을 수 있습니다.

예시 코드

@Component
public class NotificationService {
    private final List<MessageSender> messageSenders;

    // 모든 MessageSender 타입 빈 주입
    @Autowired
    public NotificationService(List<MessageSender> messageSenders) {
        this.messageSenders = messageSenders;
    }

    public void notifyAll(String message) {
        for (MessageSender sender : messageSenders) {
            sender.send(message);
        }
    }
}

@Component
public class EmailSender implements MessageSender {
    @Override
    public void send(String message) {
        System.out.println("Email sent: " + message);
    }
}

@Component
public class SmsSender implements MessageSender {
    @Override
    public void send(String message) {
        System.out.println("SMS sent: " + message);
    }
}
  • 위 코드에서 NotificationService는 MessageSender 타입의 모든 빈을 List로 주입받습니다.

  • 이를 통해 이메일과 SMS 발송 로직을 한 번에 처리할 수 있습니다

Previous07 스프링 빈 자동설정Next08 빈 생명주기

Last updated 4 months ago