IT•개발 끄적/Spring

[SPRING][Java] Utility Class에서 static, properties 값 선언

소다맛사탕 2023. 10. 30. 19:16
반응형

안녕하세요. 소다맛사탕 입니다.

Spring Framework 프로젝트에서 properties 파일을 읽어와 사용하는 경우가 있습니다.

  • @PropertySource
  • @Value
Spring xml 설정파일에서 bean을 선언한 것과 동일하게 어노테이션을 선언하여 사용 가능.

common.test.test01=테스트01
common.test.test02=테스트02

testInfo.properties(.properties)

public class CommonUtil {

    // @Value("#{testInfo['common.test.test01']}")
    @Value("${common.test.test01}")
    private static String testKey;

    public static String printStr(){
        String getStr = "";

        if(testKey != null && !"".equals(testKey)){
            getStr = testKey;
        }
        return getStr;
    }
}

CommonUtil.java(.class)

@Controller
public class HomeController {
	
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String mainHome(HttpSession session, Model model) {
    	String printStr = CommonUtil.printStr();
        model.addAttribute("outPrint", printStr);
    	
    	return "index";
    }
}

HomeController.java(.class)

 

위의 코드는 .properties 파일에 선언된 값을 Utility Class을 통해 스프링 환경에서 뷰까지 보여주기 위한 과정입니다.

 

공통 선언 클래스인 CommonUtil.java에서 Static 메서드에 선언된 @Value 어노테이션을 사용해 값을 가져올 수 있을거라 생각했지만,

 

CommonUtil.java에서 호출되는 값은 null 이 나오게 된다...

위의 코드에서 잘못된 부분은 CommonUtil.java에서 Bean객체를 호출하지 않았기 때문이다.

Static 메소드는 인자가 동일할 경우 항상 동일한 결과를 리턴하는데, 이 규칙을 지킬 수 없으면 Bean으로 만들어야 한다.

또한, Spring의존성 주입이라하여, 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 주입 받아 사용하는 방식입니다.

 

그렇기 때문에 의존성 주입이 필요한 Bean 객체를 선언해야 하므로...

 

아래와 같이 Bean 객체를 대신할 @Component 선언

@Component
public class CommonUtil {

    // @Value("#{testInfo['common.test.test01']}")
    @Value("${common.test.test01}")
    private static String testKey;

    public static String printStr(){
        String getStr = "";

        if(testKey != null && !"".equals(testKey)){
            getStr = testKey;
        }
        return getStr;
    }
}

수정된 CommonUtil.java(.class)

 

@Component 어노테이션을 사용하면 Bean configuration 파일에 Bean을 따로 선언하지 않아도 사용할 수 있습니다.

(스프링의 @Autowired, @Resource와 비슷한 기능을 수행)

 

따라서 빈 클래스를 만들어 .properties 파일에 선언된 값을 들고 오는 것

@Component는 기본적으로 다른 클래스에 종속성이 있을때 사용.

 

 

참고:

https://stir.tistory.com/291

https://programmingrecoding.tistory.com/13

https://devlog-wjdrbs96.tistory.com/165