classpath 란?
classpath 는 어플리케이션이 실행될 때 참조하는 리소스 및 클래스 파일의 경로를 의미한다.
Spring 에서 application.properties, application.yml, 템플릿 데이터, 정적 자원 등을 찾아야 할 때 사용하는
기준 경로이다.
Gradle 프로젝트의 경우
build/
└── classes/
└── java/
└── main/
└── com/example/...
Maven 프로젝트의 경우
target/
└── classes/
└── com/example/...
Spring 빌드 시 src/main/java 의 컴파일된 .class 파일 뿐만이 아니라 src/main/resources/ 에 위치한 파일들도
자동으로 classes 디렉토리에 포함된다.
Maven 빌드 시 프로젝트 폴더 내 target/ 이라는 폴더가 생긴다. (본인은 Spring Boot 3, Java17 이다)
target 하위에 classes 내용안에 src/main/java 내의 컴파일된 .class 파일과
src/main/resources 내 정적파일 등 classpath 에 추가된걸 확인할 수 있다.
WAR 파일 확인
빌드된 WAR 파일의 압축을 풀게되면 아래와 같이 폴더 구조이다.
WAR 파일/WEB-INF/classes/ 경로에 위 /target/classes 처럼 .class 파일 및 정적파일이 생성되어 있다.
classpath 설정 방법
보통은 빌드 도구(Gradle/Maven) 에 의해 자동 설정되지만, 수동으로도 classpath 를 설정할 수 있다.
Gradle 일 경우
sourceSets {
main {
resources {
srcDirs = ['src/main/resources', 'src/main/extra-resources']
}
}
}
Maven 일 경우
pom.xml 폴더 내 <resources></resources> 태그를 사용하여 설정할 수 있다.
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/extra-resources</directory>
</resource>
</resources>
</build>
Spring Boot Thymeleaf 설정
Spring 에서 설정파일을 보면 classpath:/templates/ 처럼 classpath: 를 경로에 사용하는걸 볼 수 있다.
위 예시는 application.yml 파일이고 Spring Boot 에서 thymeleaf 를 설정하는 소스이다.
prefix 인 .html 파일의 경로를 설정하는데 classpath 를 사용했다.
pom.xml 파일 내 resources 설정
위처럼 src/main/resources 와 환경마다 resources 경로를 다르게 분리할 maven profile 설정(src/main/resource-profile명)
그리고 임의로 src/main/test-resources 를 생성했다.
이렇게 경로를 설정할때 사용하는 classpath 의 경로위치는 어디에서 확인할 수 있는지 보자
프로젝트 > 마우스 오른쪽 클릭 > Build Path > Configure Build Path > Java Build Path > Source 탭 클릭
아래 이미지처럼 Source filders on build path: 에 나오는 폴더들이 classpath 경로 위치에 해당한다.
Spring 빌드 시 아래의 소스폴더들은 classpath 에 빌드된다.
thymeleaf 의 설정에서 classpath:/templates 를 prefix 로 설정하게 되면 /src/main/resources 하위에 있는
templates 폴더에 html 파일들을 넣어놓으면 된다.