인프런 커뮤니티 질문&답변

dev.taeyeong님의 프로필 이미지
dev.taeyeong

작성한 질문수

백엔드 프레임워크 만들기 (개정판)

MVC 아키텍쳐 스타일로 리펙토링 합니다. - MasterController

MasterController에서 ResourceBundle.getBundle() 질문입니다!

작성

·

316

·

수정됨

0

안녕하세요 제로님 강의 잘 듣고 있습니다!

다른 분이 질문 남겨주신 것처럼 저도 세팅 후 하나씩 추가해보고 싶어서 그렇게 진행하고 있습니다.

MasterController에서 ResourceBundle init = ResourceBundle.getBundle("com.code5.fw.init");

부분이 어떻게 동작되는 것인지 이해가 잘 가지 않아 질문드립니다.2023-02-15_01-42-47.png제 폴더 구조는 위 사진과 같고 classpath는 아래와 같이 강의에서 나온 것과 크게 다르지 않습니다.

2023-02-15_01-46-35.png컴파일 했을 때, WEB-INF 하위에 클래스만 생기고 init.properties 파일은 생기지 않는 것 같은데 강의에서 어떻게 톰캣이 com.code5.fw.init을 찾을 수 있는 건가요?

제 로컬 환경에서는 Can't find bundle for base name com.code5.fw.init 이라고 오류가 발생하네요.

WEB-INF 하위에 있는 fw 폴더 하위에 init.properties를 넣어주는 경우에는 잘 동작 했습니다!

답변 1

1

제로님의 프로필 이미지
제로
지식공유자

안녕하세요. 제로입니다.

 

ResourceBundle init = ResourceBundle.getBundle("com.code5.fw.init");

동작 과정을 설명드리겠습니다.

 

우리가 프로그램을 개발할 때 사용하는 통합개발환경(IDE, 인텔리제이, 이클립스)은

많은 기능을 제공하고 있는데 그 중 자주 사용하는 기능은 자원관리와 빌드 그리고 실행 기능 입니다.

 

자원관리는 내가 만든 소스코드를 쉽게 찾고 수정할 수 있게 해주고

빌드는 만들어진 소스코드를 컴파일 하고 실행 가능한 위치에 복사시켜주는 기능입니다.

실행은 빌드된 자원을 기준으로 실행하게 되구요.

 

물어보신 내용을 이해하려면 빌드와 실행을 이해하시면 됩니다.

 

자원관리를 통해 init.properties 는 만들어지고 내용이 수정되고

빌드를 통해 init.properties 자원이 특정 위치로 복사됩니다.

인텔리제이 프로젝트 구성을 보면 빌드패스가 있을텐데

빌드 패스는 [프로젝트루트]/WEB-INF/classes 로 설정이 되어 있고

빌드 대상인 init.properties[프로젝트루트]/WEB-INF/classes/com/init.properties 로 복사된다고 보시면 됩니다.

물론 자원관리 기능이 있는 IDE 에 init.properties 자원이 2개가 있으면 불편하기 때문에

IDE 에선 빌드 디렉토리 [프로젝트루트]/WEB-INF/classes 는 조회되지 않습니다.

 

빌드가 잘 되었으니 아래 코드가 실행을 합니다.

ResourceBundle init = ResourceBundle.getBundle("com.code5.fw.init");

IDE 는 프로젝트 구성에 사용된 CLASSPATH 를 찾고 JVM 에 넘겨줍니다.

그리고 JVM 은 ResourceBundle.getBundle("com.code5.fw.init"); 컴파일된 바이트 코드를 이해하고

/com/code5/fw/init.properties 자원을 찾습니다.

자원을 찾기 위해 CLASSPATH 의 정보를 결합 /com/code5/fw/init.properties 를 찾게 되는데

 

이미지로 캡쳐해 주신 디렉토리 중 첫번째(0) 디렉토리 와 /com/code5/fw/init.properties 를 결합 파일을 찾고 init.properties 를 읽게 되는 겁니다.

 

개발자가 가장 고민하는 것 중 하나는 내가 만든 소스코드를 어떻게 하면 잘 찾게 하는 것에 있는데

ResourceBundle 클래스는 이를 위해 클래스패스를 활용한다고 보시면 됩니다.

 

"Can't find bundle " 오류가 발생하면

제일 먼저 클래스패스를 확인하고 클래스 패스 경로에 해당 properties 자원이 있는지 확인하면 됩니다.

 

질문 감사하구요. 도움이 되었길 바랍니다.

 

* 질문을 잘못 이해 했네요. 빌드는 java 파일일경우 컴파일 후 복사돠고 java 파일이 아닐경우 복사만 되는 과정입니다.

클래스는 복사되는데 프로퍼티파일이 없는 경우라 하면 인텔리제이 빌드 설정에서 복사 예외 자원이 있는지 확인해 보시겠어요.

dev.taeyeong님의 프로필 이미지
dev.taeyeong

작성한 질문수

질문하기