[Java] 절대 경로, 상대 경로(Absolute path, Relative path)

델버·2022년 5월 19일
0

Java

목록 보기
4/8
  • 코딩하면서 예를 들어 C:\Users\Desktop\etc\text.txt라는 경로를 찾거나 Absolute path를 묻는 메소드를 써 본 적이 있을 것이다. 파일의 경로라는 것을 알지만 왜 그냥 경로가 아닌 절대 경로라는 이름이 붙었는지, 상대 경로는 뭔지에 대해선 가물가물하다. 그래서 조금이나마 정리 해 둔다.

절대 경로 (Absolute path)

  • 파일의 절대적인 경로라는 의미로 C:\Users\Desktop\etc\text.txt와 같이 해당 경로만 있으면 컴퓨터가 파일을 찾을 수 있다. 컴퓨터의 시작점(최상위 폴더)부터 파일까지의 모든 경로를 표시한다. Mac의 경우 /Users/User_name/Desktop/etc/text.txt 가 된다.
  • 참고로 Mac의 디렉토리 구분은 / 이고, Window는 \ 이다.
  • 만약 파일의 경로를 etc\text.txt만 가지고 있다면 컴퓨터는 이걸 보고 찾아갈 수 없다. 하지만 이렇게 일부 경로만 가지고 기준 경로를 잡아 파일을 찾는 방식이 있다.

상대 경로 (Relative path)

  • 어떤 기준 경로(아니면 현재 디렉토리를 기준으로)를 잡아서 그곳에서부터 파일을 찾는 방식이다. 기준 경로가 C:\Users\Desktop이면 etc\text.txt의 경로만 가지고 파일을 찾아갈 수 있다. 여기서 컴퓨터는 C:\Users\Desktop\etc\text.txt로 찾아서 가는 것이다.
  • / 표기법
    • / : 최상위 경로
    • ./ : 현재 디렉토리 경로
    • ../ : 상위 디렉토리 경로

차이

  • 절대 경로는 소스 코드에서 한 번 지정해주면 나중에 경로가 바뀌게 되면 오류가 난다는 것이다. 하지만 상대경로는 기준 디렉토리만 바뀌고 소스 코드 내에선 현재 디렉토리 경로에서 찾을 파일의 경로만 설정되어 있어 기준 경로가 바뀌더라도 수정할 필요가 없게 된다.

  • 어찌하든 상황에 맞게 설정하는 거라 보면 된다.

  • 좋은 예인지는 모르겠지만 Java lib를 말하자면, Library에 jar을 import할 때 경로를 외부 경로로 지정해줄지 아니면 내부 경로로 지정해줄지 방법이 2가지다. 이때 외부로 지정해주면 프로젝트 파일이 다른 컴퓨터로 또는 위치가 이동할 때 경로가 바뀌어 오류가 날 수 있다. 하지만 내부 경로로 하게 되면 상위 디렉토리는 움직여도 내부의 디렉토리를 기준으로 jar파일을 찾기 때문에 영향이 가지 않는다.

  • 이런 부분을 아는 이유는, 길지만 눈물 젖은 이야기가 있읍니다. 들어보시렵니까?

눈물 젖은 다른 이야기

  • 기초적인 DB, 네트워크(TCP)와 swing을 기반으로 게임 프로젝트를 했다. 나는 로그인과 회원가입에 역할을 맡아서 여러 김칫국을 마시며 여러 기능들을 생각하다 Java에서 email을 보내는 jar를 쟁여 둔 것이 생각났다. 옳다구나, 회원 가입에서의 이메일 인증을 내 프로젝트 첫 API로 삼았다. 하지만 순순히 될 리는 없다.
  • Library에 제대로 적용해도 참조는 되지만 classException 오류를 계속 냈다. 구글에 email.jar 예제는 싹싹 긁어 모아 봤다. email도 google, naver, daum 등 바꿔보았지만 소용 없이 빨간줄로 Exception.
    메일은 안 받아지는데 예외처리는 기가막히게 잘 받는다.
  • 4시간 정도 방법을 찾다가 포기할 즈음 아는 자바 개발자에게 물어보았다. 돌아온 답변을 그대로 쓰기엔 워딩이 거칠어 순화해서 말하면 “M1에서 자바는 나빠! 제길! 그럴 줄 알았어. 아마 Window에선 될 걸? 확장자 문제 아니면 외부 경로로 추가해봐”
  • 이후 Mac M1에서 jar 확장자를 가진 파일을 다르게 인식하는 건지, Window에서 확장자를 인식하는 프로그램을 모두 해제하였더니 정상적인 작동을 확인했다. 하지만 Mac M1에서는 어떤 방식으로 해결할지 도저히 방법을 찾지 못했다. 확장자 문제인지도 확실하지 않다.
  • 참조는 되지만 소스 코드를 실행하면 jar의 클래스를 찾지 못한다는 건데, 두 번째 조언을 받아 외부로 jar를 적용시켜줬더니 작동했다. 이때 이 프로젝트 파일을 배포할 때 문제가 된다는 게 큰 단점이 있었다. 모든 사용자의 jar 경로를 매번 잡아줘야한다는 것. 시간은 시간대로 엄청 썼고 이메일 인증과 코드는 다 완성해 놓은 상태에서 정작 중요한 기능은 잘 돌아가지 않았다. 마음 아프지만 그렇게 첫 API는 묻어뒀다.
  • Library path를 상대 경로에서 절대 경로로 변경하여 해결했지만 사용치 못한 가슴 아픈 이야기였다.
    (이후에도 Library 오류는 계속 찾고 있긴하지만 아직까지도 시원하게 해결하지 못했다.)는 현재 해결하여 성공했다! 추후에 작성할 예정...

참고

1개의 댓글

comment-user-thumbnail
2022년 7월 22일

저도 눈물나요....흑흑...

답글 달기