본문 바로가기
IT 공부/Visual Studio 툴 사용하기

[Visual Studio] - Ctrl+F5 실행과, 직접 실행의 차이 (작업 디렉터리 설정)

by exdus3156 2025. 1. 3.

 

▷ 프로그램이 사운드나 픽셀 스프라이트 등 외부 에셋을 사용하는 경우, 에셋의 경로를 설정해야 한다. 프로그래밍 언어와 상관 없이 많은 프로그램이 디스크에서 파일을 읽어올 때 파일 위치의 경로를 문자열로 전달해 파일을 Load한다. 

 

이때 절대 경로가 아닌 상대 경로로 파일의 위치를 지정하는 경우가 보편적인 것 같다. 절대 경로로 설정해버리면 사용자가 프로그램을 정확한 위치에 둬야 하기 때문이다. 하지만 상대 경로의 문제는 어디를 시작 디렉터리로 생각하느냐에 따라 결과가 달라지기 때문에 주의를 기울여야 한다.

 

특히 디버깅을 하거나 Visual Studio에서 Ctrl + F5 단축키로 실행할 때는 잘 되는데, 빌드된 결과물(exe)을 더블 클릭하면 에셋을 불러오지 못하는 경우가 있다. 왜냐하면 전자와 후자가 작업 디렉터리를 서로 다르게 받아들이기 때문이다.

 

VS에서 바로 실행했을 경우는 성공.

 

위 프로그램은 Visual Studio에서 Ctrl + F5 단축키로 실행한 결과다. 그러나 빌드된 결과물을 직접 더블 클릭해서 실행하면 어떻게 될까?

 

 

더블 클릭하면 에셋(이미지)을 찾지 못했다고 콘솔에 로그를 출력하고 있다. (_여담이지만 이래서 로그를 찍는 코드를 넣어야 한다...! 오류를 발견하기 쉽게..!_) 

 

 

이유는 위와 같다. 이 프로그램의 코드는 스프라이트 이미지(png 파일)을 위와 같이 상대 경로로 찾고 있다. 그런데 빌드된 결과가 생성되는 디렉터리에는 Asset 폴더와 그 이미지들이 없으니 오류를 뱉어낸 것이다. 빌드 디렉터리에 Assets 폴더를 복사해서 넣으면 정상 실행된다.

 

그렇다면 왜 Ctrl+F5 실행은 성공하는 것일까? 그 이유는 바로 Visual Studio에서는 [작업 디렉터리]가 설정되기 때문이다. 

 

 

Visual Studio는 디버깅의 편의성을 위해서 기본적으로 프로젝트 실행에 필요한 외부 리소스들이 현재 프로젝트의 디렉터리에 있다고 가정해준다. 

 

이렇게 설정해주는 이유는 개발을 할 때는 프로젝트에 필요한 소스코드와 리소스 파일을 한 프로젝트 폴더에 두고 개발을 하는 것이 편하기 때문이다. 일반적으로, 빌드를 하고 나면 빌드 결과물은 프로젝트 디렉터리가 아니라 다른 위치의 디렉터리에 저장한다. 소스코드를 관리하는 디렉터리 안에 빌드 결과물이 있으면 굉장히 난잡해지기 때문이다. 그런데 빌드된 결과를 실행해볼 때, 외부 리소스를 이 빌드 디렉터리에 일일이 옮기는 작업은 매우 번거롭다. 따라서 VS는 코딩하는 도중에는 프로그램이 프로젝트 디렉터리에 있는 리소스를 찾을 수 있도록 [작업 디렉터리]를 설정해주는 것이다.

 

문제는 최종적으로 빌드를 하고 배포할 때다. 빌드된 결과물인 exe 실행 파일은 내부적으로 현재 자신이 있는 디렉터리를 시작 위치로 고려한다. 프로젝트의 소스코드 디렉터리와 상관이 없다. 만약 VS로 디버깅을 하면서 외부 리소스 파일을 잘 찾는 것을 보고 착각을 해버려서, 배포를 할 때 Assets 디렉터리를 함께 배포해주지 않으면 결국 리소스를 찾지 못한다는 에러를 뱉어내는 것이다.

 

 

위와 같이 최종 실행 파일이 있는 디렉터리에 Assets를 복사해주면... 

 

 

잘 실행된다....!