영권's
TIL - 개발 환경(클래스패스) 본문
데브코스 백엔드 과정에서 공부하면서 JAVA 개발환경 세팅에 대해서 보다가 환경변수에 클래스패스 세팅하는 것을 보았는데 예전에 백기선님 온라인 스터디에서 공부하였을 때 환경변수에 시스템 변수로 설정하는것은 문제가 발생할 수 있다라고 공부한 기억이 있어서 어떻게 하는것이 맞을지 공부하고 흐려진 기억을 다시 되새기면서 정리하기로 하였습니다.
먼저 클래스패스에 대해서 알아보자
클래스패스란, JVM이나 Java 컴파일러에 사용자정의 클래스와 패키지의 위치를 지정해주는 파라미터이다.
쉽게 말해, 자바가 클래스를 찾아 사용을 해야하는데, 클래스들이 어디 있는지 위치를 지정해주는 값이다.
좀더 자바의 관점에서 말한다면 JVM이 프로그램을 실행할 때, 클래스 파일을 찾는 데 기준이 되는 파일 경로를 말합니다.
소스 코드(.java 파일)를 컴파일하면 소스 코드가 “바이트 코드”(바이너리 형태의 .class 파일)로 변환됩니다.
Java runtime(java 또는 jre)으로 이 .class 파일에 포함된 명령을 실행하려면, 먼저 이 파일을 찾을 수 있어야 합니다.
이 때 .class 파일을 찾을 때 CLASSPATH에 지정된 경로를 사용합니다.
JRE는 자바 API와 JVM으로 구성되며, JVM의 역할은 자바 애플리케이션을 클래스 로더(Class Loader)를 통해 읽어 들여서 자바 API와 함께 실행하게 됩니다.
BootStrap Class Loader
- 기본 클래스로더 중 최상위 클래스 로더
- jre/lib/rt.jar 에 담긴 JDK 클래스 파일을 로딩해준다.
- String 클래스나, Object 클래스를 사용할 수 있었던 이유가 바로 BootStrap Class Loader가 자동으로 메모리에 적재해주기 때문이다.
Extension Class Loader
- 익스텐션 클래스로더는 jre/lib/ext 폴더나 java.ext.dirs 환경 변수로 지정된 폴더에 있는 클래스 파일을 로딩한다.
System Class Loader
- 바로 System Class Loader 가 우리가 만든 Class를 메모리에 올리는 역할을 하는데, 그 때 classpath 기준으로 클래스들을 로드해준다.
다음과 같은 클래스가 있다고 했을 때
해당 파일의 루트 위치가 아닌 경로에서 커맨드 방식으로 실행 시키려고 하면 -cp(classpath) 옵션을 주어서 실행시킬 수 있다.
예를 들어 바탕화면에서 C:\dev\java\src에 있는 HelloWorld.class 파일을 실행시킨 것이다.
java 명령어와 -cp 옵션과 함께 클래스 파일의 FQCN(Fully Qualified Class Name)을 입력해주면 된다.
이것은 CLASSPATH를 지정해주어서 클래스 파일을 읽어들일 수 있게 하는것이다.
CLASSPATH 환경변수
환경변수는 운영체제에 지정하는 변수로 자바 가상머신과 같은 애플리케이션들은 환경변수 값을 참고해서 동작하게 된다.
자바는 클래스 패스로 환경변수 CLASSPATH를 사용하는데 이 값을 지정하면 실행할때마다 -cp(classpath) 옵션을 사용하지 않아도 된다.
하지만 운영체제를 변경하면 클래스 패스가 사라지기 때문에 이식성면에서 불리할 수 있다.
windows
시스템 설정 > 환경변수
리눅스, 유닉스 계열이 시스템
/etc/profile 에 추가
IDE의 자동 클래스패스 설정
그렇기 때문에 최근에는 운영체제 상의 환경변수로 클래스패스를 설정하는 것은 지양하고 IDE나 빌드도구를 통해 클래스패스를 설정한다고 한다.
아래 사진에서는 환경변수에 설정한 JDK 버전과 프로젝트에서 사용하는 JDK 버전이 다르게 설정할 수 있는 것을 볼 수 있다.
환경변수에 클래스패스를 설정하게 된다면 모든 프로젝트에 모두 적용이 될 수 있다.
때문에 잘못하면 라이브러리가 꼬이는 등의 문제가 발생할 수 있다.
만약 환경변수에 시스템 변수로 클래스패스를 설정하고 사용하려면 이러한 점을 잘 고려하여 사용해야 할 것 같다.
'데브코스 웹 백엔드 > TIL' 카테고리의 다른 글
2021-08-16 TIL (Build) (0) | 2021.08.16 |
---|---|
2021-08-13 TIL (데이터베이스 - 트랜잭션,VIEW) (0) | 2021.08.14 |
TIL - (데이터베이스) (0) | 2021.08.12 |
20210809 - TIL (데이터베이스) (0) | 2021.08.10 |
TIL - 인터페이스(함수형)와 람다 (0) | 2021.08.04 |