inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

스프링 빈 자동주입 질문

63

backendman

작성한 질문수 27

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 입니다.");
    }

}

java spring mvc spring-boot

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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

..

0

76

2

Unused property.....

0

99

2

project JDK is misconfigured

0

132

2

외부 API의 ID 타입(String/UUID)과 내부 도메인의 ID 타입(Long)이 불일치할 때의 설계 정석

0

83

2

단위/통합 테스트 버전충돌 문제

0

91

2

❗️springboot 4.0.2 버전 aspectj dependency 설정❗️

0

230

1

왜 컨트롤러는 변한게 없는데 새로 만든 html 파일이 뜨나요?

0

103

2

윈도우 build test오류 질문

1

102

2

테스트 관련 공부에 대한 조언을 얻고 싶습니다

0

99

2

테스트 실행 시 에러 질문

0

291

1

name을 통한 비교와 객체를 통한 비교

0

77

1

빌드 후 libs 없음

1

129

1

윈도우 gradlew.bat 에러

0

167

1

@PostMapping("/members/new")가 동작하지 않습니다

0

89

1

java static class와 kotlin class

0

79

1

스프링 DB연결

0

126

1

소요 시간

0

87

2

ddl.sql에 빨간 밑줄

1

102

2

welcome page 에러

0

183

3

잘 모르겠습니다.

0

164

2

fail을 똑같이 쳤는데 오류가 발생해요

0

156

2

index.html Welcome page

0

124

1

프로젝트 gradle-groovy ?

0

369

1

테스트코드 메서드명 한글

0

202

2