• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

ApplicationRunner 인터페이스 질문입니다!

20.07.07 14:44 작성 조회수 174

0

"5부 빈의 스코프" 강의를 보던 중 ApplicationRunner 인터페이스에 관해서 질문이 있습니다.

API를 찾아보면 ApplicationRunner는 반드시 실행시켜야 하는 빈을 등록하는 것이라고 이해를 했습니다. 근데 궁금한게 어차피 Demonspring51Application에서 run 메소드를 사용하는데, 굳이 클래스파일을 하나 더 만들어서 run 메소드를 사용하는 이유는 뭔가요??

아래와 같이 무식하게 코드를 집어 넣으니 static 필드가 아니라서 사용할 수 없다는 에러 메세지는 발생합니다...

근데 이유를 잘 모르겠습니다ㅠㅠ

@SpringBootApplication
public class Demospring51Application {

    @Autowired
    Single single;

    @Autowired
    Proto proto;

    public static void main(String[] args) {
        SpringApplication.run(Demospring51Application.class, args);

        System.out.println(single.getProto());
        System.out.println(proto);
    }
}

답변 5

·

답변을 작성해보세요.

0

잘하셨습니다.

0

YeonCheol Jang님의 프로필

YeonCheol Jang

2020.07.08

안녕하세요

말씀해주셔서 static 메소드와 인스턴스 필드를 다시 공부하고 왔습니다.

static 메소드는 클래스가 JVM에 로딩이 될 때 메모리에 올라오는데, 그 말은 인스턴스 생성을 하지 않아도 사용가능 하다는 말입니다. 하지만 인스턴스 필드는 인스턴스화 해서 메모리에 적재를 해야 하기 때문에, static 메소드에 사용할 수 없습니다. 

제가 공부해보고 정리를 했는데 혹시 틀린게 있을지 궁금합니다.

공부해야 될 것 알려주셔서 감사합니다

0

안됩니다. static 메소드에서 인스턴스 필드 접근이 왜 안되냐고 물어보시는건  자바 기초가 부족하다는 명백한 증거이기 때문에 이 강좌 수강을 멈추시고 자바 기초부터 공부하고 오시기 바랍니다. 스프링을 공부할 시간이 아닙니다. 자바부터 하세요.

0

YeonCheol Jang님의 프로필

YeonCheol Jang

2020.07.07

아 main 메서드에서 사용해볼까 해서 넣어봤습니다. 

사실 막상 적고 나니까 왜 저런 에러가 뜨는지 잘 모르겠습니다. 아직 객체화가 되지 않아서 그런건가요? 프로그램이 시작하면 main 메소드가 시작이 되는데, 메모리에 올라와 있지 않아서 그런건가요??

혹시 알려주시면 감사합니다ㅠㅠ

0

ApplicationRunner는 스프링 부트가 제공하는 인터페이스로 애플리케이션 구동 이후에 해당 인터페이스를 구현한 특정 빈을 실행시켜주는 건데요. 가끔 그런 동작이 유용할 때가 있습니다. 가령, 애플리케이션 구동 이후에 특정 기본 데이터를 생성한다거나 현재 시스템 리소스를 확인한다거나 등.. 

물론, 의도하신 것처럼 run 이후에 그런 일을 하는 코드를 넣어도 되긴하지만 클래스가 가지고 있는 본연의 역할에 따라 코드를 분리하는거죠. 

그 다음은 혹시 static 필드가 아니라서 사용할 수 없다는 에러가 발생하는 원인을 모르시겠다고 물으시는건가요?