인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

건강한 말미잘's profile image
건강한 말미잘

asked

Spring Core Principles - Basics

Option handling

섹션 8 - 옵션처리 (TestBean)

Written on

·

94

0

=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
안녕하세요, "섹션8 - 옵션처리 " 강의 관련하여 질문합니다.

먼저 AutowiredTest 코드 공유합니다

package hello.core.autowired;

import hello.core.member.Member;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.lang.Nullable;
import java.util.Optional;

public class AutowiredTest {

    @Test
    void AutowiredOption() {
        ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
    }

    static class TestBean {

        @Autowired(required = false)
        public void setNoBean(Member noBean1) {
            System.out.println("noBean1 = " + noBean1);
        }

        @Autowired
        public void setNoBean2(@Nullable Member noBean2) {
            System.out.println("noBean2 = " + noBean2);
        }

        @Autowired
        public void setNoBean3(Optional<Member> noBean3) {
            System.out.println("noBean3 + " + noBean3);
        }
    }
}

ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class); 를 통해 TestBean을 등록하고

위와같이 Autowired관련 테스트를 위한 코드를 강의 내용과 같이 작성하였습니다.

하지만 @Autowired 어노테이션에 붉은줄이 생기며 "Autowired members must be defined in valid Spring bean"라는 에러가 발생합니다.

동일한 파일에서 아래와 같은 TestCofig 클래스 코드를 추가해주면 에러가 사라집니다. 제가 작성한 코드에 어떠한 문제가 있는지 아직 파악하지 못하여 의문을 풀지 못하였습니다.

@Configuration
    static class TestConfig {
        @Bean
        public TestBean testBean() {
            return new TestBean();
        }
    } 
spring객체지향

Answer 2

1

yh님의 프로필 이미지
yh
Instructor

안녕하세요. 건강한 말미잘님

혹시 실행할 때는 문제가 없고, 단순히 IDE 오류일까요?

만약 그렇다면 IDE의 버그로 보시면 됩니다. IDE에서 스프링 빈으로 등록되었는지 확인하는 과정이 100% 정확하지는 않아서, 실행에 문제가 없다면 해당 메시지를 무시하셔도 괜찮습니다.

만약 실행 오류가 아니라면 예제 코드를 포함해서 전체 내용을 다시 올려주세요.

실제 동작하는 전체 프로젝트를 ZIP파일로 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

 

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명 (오류 화면, 오류 로그 포함)

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

말씀해주신대로 IDE에서만 발생하는 버그인 것 같습니다.
테스트코드 실행은 잘 됩니다!

답변 감사합니다!!

0

안녕하세요, 인프런 AI 인턴입니다. 건강한 말미잘님께서 질문해주신 내용은 TestBean이 왜 스프링 빈으로 제대로 등록되지 않는지와 관련된 문제입니다.

문제 설명 및 해결

애플리케이션 컨텍스트에 TestBeanAnnotationConfigApplicationContext로 등록할 때, @Configuration이 없는 클래스가 빈으로 등록될 수 있습니다. 하지만 @Configuration이 없는 경우, 해당 클래스는 일반적인 스프링 빈이 아닌 ‘lite mode’로 작동합니다. 이 모드에서는 모든 메서드 및 필드가 스프링 빈으로 등록되지는 않습니다.

  • 에러 메시지 원인: Autowired가 적용된 필드나 메서드를 실행하려면, 이들이 반드시 스프링 빈이어야 합니다. AnnotationConfigApplicationContext에 클래스만 넘겨주는 경우, @Configuration 없이 TestBean을 빈으로 사용할 때 및 @Autowired를 사용하면, IDE에서 경고가 발생할 수 있습니다.

  • 문제 해결 방법: @Configuration 어노테이션을 사용한 TestConfig 클래스에 TestBean을 빈으로 등록하는 메서드를 추가하면, 명시적이고 정식으로 TestBean이 스프링 빈으로 등록됩니다. 이는 @Bean 어노테이션으로 구체적으로 빈을 정의하기 때문입니다.

추가 정보

  1. 스프링 빈 등록: ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class); 이 코드는 TestBean을 스프링 컨텍스트에 등록하려고 시도합니다. 그러나, @Configuration 없이, TestBean은 스프링의 정규적인 빈 방식으로 등록되지 않을 수 있습니다.

  2. 솔루션 확인: TestConfig 클래스의 @Configuration 어노테이션과 @Bean을 사용하면, TestBean 클래스는 스프링에서 요구하는 형태로 빈이 되어, 관련 오류가 해소됩니다.

비슷한 질문들이 많아 좀 더 명확한 강의 이해를 위해 다음 링크들을 참고하실 수 있습니다:

  1. @Component 가 없는데 @Autowired를 어떻게 쓸 수 있는 거죠?
  2. TestBean 클래스 관련 질문입니다.

저는 질문자님의 이해를 돕고자 기존 지식공유자의 답변을 바탕으로 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

건강한 말미잘's profile image
건강한 말미잘

asked

Ask a question