안녕하세요
220
2016-10-18 10:32:58 작성 2016-10-18 10:33:38 수정됨
5
2488

static 메소드 안에서의 service 호출


전자정부프레임워크 사용중입니다.


Controller 쪽에서


static으로 정의한 메소드를 호출하게 되는데


이 호출하는 메소드내에서 service를 호출하는 방법을 알고 싶습니다.


예를 들어서..


@Autowired

TestService testService;


public static void test(string a, string b){

 string c = testService.getId(a);

 System.out.println(" c val : " + c );

}


위와 같은 소스가 있다고 봤을 때 


testService를 부르는 부분에서 오류가 납니다.

( 발생하는 해당하는 라인에 java.lang.NullPointerException 부분입니다. )

( testService가 null로 인식이 됩니다. )


테스트해본 방법은

TestService 선언 부분에


@Autowired 

private static TestService testService;


혹은


private static TestService testService;


입니다.

0
1
  • 답변 5

  • fender
    14k
    2016-10-18 10:45:10

    스태틱과 싱글턴의 개념을 다시 정립해보셔야할 것 같습니다.

    질문하신 내용에 대해서는, 정 필요하면 인자로라도 서비스 인스턴스를 넘기면 되겠지만, 접근 자체가 잘못된 설계에서 비롯된 것일 가능성이 매우 높다는 조언을 드리고 싶습니다.


    0
  • 안녕하세요
    220
    2016-10-18 11:29:50

    답변 감사합니다.


    답변해주신 부분에 대해서 자료를 찾아봤는데 잘 이해가 가질 않네요

    ( 제가 이해한거라 틀린 부분이 있을 수도 있습니다. )


    static을 사용하는 이유 :

    값이 변하지 않는 정적인 데이터를 사용할 때 유용

    한번만 선언하면 되니까, 메모리에 대한 이점


    static method 사용하는 이유 :

    static으로 된 변수는 static 메소드 안에서만 사용

    ( 유틸리티 성 메소드 ( 시간 구하기, 날짜 구하기 등등 ) )

    ( 공용적으로 많이 사용하는 것 같습니다. 제가 구현하려고 하는 부분도 공통적으로 묶어놓고 쓸 부분인데 DB를 거쳐서 업데이트를 해줘야하는 부분이라 ... )


    싱글톤 패턴 : 

    프로그램종료 시점까지 오로지 단 하나의 클래스 객체를 생성

    ( 그럼 객체를 하나만 생성하고 사용함으로써 여러명의 사용자가 객체를 각자 하나씩만 생성된 객체를 사용하게 되는건가요 ??? ) 


    잘 이해가 가질 않네요..

    몇번 더 읽어봐야겠습니다.



    DB접근해서 가져오려는 데이터를 가지고 있는 메소드가 거의 Service안에 있어서

    static으로 했을때 DB쪽으로 어떻게 접근해서 데이터를 가져올지...고민이네요

    0
  • fender
    14k
    2016-10-18 11:52:13

    어디에 유용하거나 어떻게 사용해야한다는 것보다는 우선 정확하게 그 것이 무엇인지에 대한 개념을 정리하는 게 더 중요하다고 생각합니다.

    그리고 싱글턴 패턴과 스프링의 DI 개념과 스코프에 대한 기본적인 이해가 있어야지 정확한 설명이 가능한 내용인 듯 합니다.

    너무 복잡하게 이야기한다고 느끼실 지 모르겠지만 사실 스프링은 절대 객체지향에 대한 이해없이 배울 수 있는 프레임워크가 아니라서 그렇습니다.

    개념을 무시하고 답만 알려드리자면 아마도 언급하신 데이터베이스 관련 정적인 API들이 어떻게 생겼는지 보고 잘못된 설계라면 리팩터를 해야한다고 말씀드릴 것 같은데, 무엇이 왜 잘못된 설계인지 이해하려면 적어도 스태틱이 무엇인지, 싱글턴이나 스프링 빈의 스코프, DI 개념 같은 내용은 알아야 하니까 어쩔 수가 없네요.

    0
  • wishvoice
    75
    2016-10-18 13:32:28 작성 2016-10-18 14:14:03 수정됨

    질문하신분이  spring에서 DI로 정의된 클래스가 싱글턴이고 static도 하나의 인스턴스만 갖고

    그래서 기능상 공용으로 사용하는 것이니 service를호출할 때 static 메소드로 만들어서 호출하려는 의도로 보입니다.



    @Autowired

    TestService testService;


    public static void test(string a, string b){

     string c = testService.getId(a);

     System.out.println(" c val : " + c );

    }

    static메소드에서는 인스턴스 변수는 접근이 불가능합니다.

    testService 싱글콘 인스턴스입니다.


    @Autowired

    private static TestService testService;

    위에 static을 해주지 않아도 spring에서 싱글톤으로 인스턴스를 생성합니다.

     

    참고로 에러 메시지를 보니 TestService DI선언이 xml에 혹은 어노테이션 방법으로 생성이 잘 되어있는지 확인해보는게 필요할것 같습니다.


    static변수 static메소드 싱글톤 관련 링크 입니다.

    https://wikidocs.net/228

    0
  • 안녕하세요
    220
    2016-10-18 13:59:17

    답변 감사합니다.

    우선 각각 하는 일에 대해서 명확히 알아야 이해가 조금 더 잘가겠네요.

    조언해주신 부분에 대해서 자세히 알아봐야 할 것 같습니다.


    감사합니다. 열심히해볼게요!

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.