강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

backendman님의 프로필 이미지
backendman

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 빈 자동주입 질문

작성

·

59

·

수정됨

0

안녕하세요.

 

제가 알기론 자동주입은 스프링 빈 클래스에서만 되는걸로 알고 있습니다.

근데 아래 소스를 보시면 ExtendsController 클래스에는 @Component 어노테이션이 붙지않아서

스프링 빈으로 관리되지않습니다. 근데 HomeController 에서 이를 상속받으면 ExtendsController 클래스에 CommonLoginc 이 자동주입이 됩니다.

 

그리고 home api 의 this.say 메서드가 NullpointException 오류가 나지않고 정상 호출됩니다.

이건 무슨 원리로 되는건지 알 수 있을까요?

 

package com.info.springboot.controller;

import com.info.springboot.model.ExtendsController;
import com.info.springboot.model.Sample;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController extends ExtendsController {

    @GetMapping("/home")
    public String home(){
        this.say();
        return "home";
    }

}

 

package com.info.springboot.component;

import org.springframework.stereotype.Component;

@Component
public class CommonLogic {

    public void logging(){
        System.out.println("logging 입니다.");
    }

}
package com.info.springboot.model;

import com.info.springboot.component.CommonLogic;
import org.springframework.beans.factory.annotation.Autowired;

public class ExtendsController {

    @Autowired
    private CommonLogic common;

    public void say(){
        common.logging();
        System.out.println("ExtendsController 입니다.");
    }

}

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
backendman님이 말씀하신 상황은 스프링에서 클래스 상속을 통해 빈이 자동 주입되는 케이스입니다. HomeController 클래스는 @RestController 어노테이션이 붙어 있으므로, 스프링 빈으로 자동 등록됩니다. 부모 클래스인 ExtendsController의 필드에 @Autowired가 붙어있는 CommonLogic은 의존성 주입을 통해 관리됩니다.

이 경우, HomeController가 스프링 빈으로 등록될 때, 실제로는 ExtendsController의 인스턴스가 포함된 HomeController 객체가 빈으로 등록됩니다. 그로 인해 부모 클래스의 필드에도 자동으로 주입됩니다. 이는 HomeController가 ExtendsController를 상속 받았기에 발생하는 점입니다.

따라서 home 메서드에서 this.say()를 호출할 때, CommonLogic 인스턴스가 이미 주입되어 있기 때문에 NullPointerException이 발생하지 않는 것입니다.

이와 같은 동작은 스프링의 상속 구조에 따라 빈 클래스의 부모 클래스 필드에도 주입이 이루어지는 점에서 설명할 수 있습니다. 이는 스프링의 의존성 주입 메커니즘의 특징 중 하나입니다. 추가적으로 @Autowired가 대상 빈을 클래스 내부에서 관리하는 데 중요한 역할을 합니다.

이러한 내용은 스프링 빈과 의존성 주입에 대한 이해를 돕는 중요한 개념입니다.
추가적인 정보는 다음 URL을 참고하시면 도움이 되실 수 있습니다: Spring Boot Reference Documentation - Spring Beans and Dependency Injection

backendman님의 프로필 이미지
backendman

작성한 질문수

질문하기