카테고리 없음

심화과제 트러블 슈팅

kwontete 2025. 10. 12. 19:10


이번 과제는 Dart 언어를 사용하여 학생 점수를 관리하는 프로그램을 만드는 것이었습니다.
Score 클래스를 만들고, 이를 상속받은 StudentScore 클래스를 통해 학생 이름과 점수를 출력하도록 구성했습니다.
또한 students.txt 파일에서 데이터를 불러와 사용자가 이름을 입력하면 해당 점수를 보여주고,
결과를 다시 result.txt 파일에 저장하는 기능을 구현했습니다.

처음에는 금방 끝낼 줄 알았지만, 막상 해보니 생각보다 어려운 점이 많았습니다.
특히 파일을 불러오는 부분이 처음이라 많이 헤맸고,
import 'dart:io'; 코드가 정확히 어떤 역할을 하는지 완전히 이해하지 못해 공부가 더 필요하다고 느꼈습니다.

 

(1) 배경
처음에는 단순히 파일을 읽고 입력을 받으면 되는 줄 알고 시작했습니다.
아래는 처음 작성한 코드의 일부입니다.

 
import 'dart:io'; void main() { final file = File('students.txt'); final lines = file.readAsLinesSync(); print("어떤 학생의 점수를 확인하시겠습니까?"); String? input = stdin.readLineSync(); }

하지만 실행하자마자 여러 가지 오류가 발생했습니다.

 

(2) 발단

  1. 파일 경로 오류
    FileSystemException: No such file or directory 라는 에러가 발생했습니다.
    같은 폴더에 파일이 있었는데도 프로그램이 파일을 찾지 못했습니다.
    경로 문제를 처음 겪어봐서 원인을 이해하기 어려웠습니다.
  2. 한글 입력 깨짐
    콘솔에 “홍길동”을 입력했는데 “???”로 출력되는 문제가 생겼습니다.
    인코딩 문제라는 걸 몰랐기 때문에 처음에는 Dart의 오류라고 생각했습니다.
  3. 디버그 콘솔 입력 불가
    VS Code의 디버그 콘솔에서 입력이 전혀 되지 않았습니다.
    프로그램이 멈춘 것처럼 아무 반응이 없어서 어디가 문제인지 몰랐습니다.

(3) 전개
처음에는 여러 방법을 시도했지만 해결이 되지 않아서 ChatGPT에게 물어봤습니다.
GPT가 “디버그 콘솔에서는 입력이 안 된다. 터미널에서 실행해야 한다”고 알려주었고,
터미널에서 dart run main.dart로 실행하자 입력이 정상적으로 작동했습니다.
그때 처음으로 디버그 콘솔과 터미널의 차이를 이해하게 되었습니다.

그 외 문제들은 아래와 같이 해결했습니다.

  • 파일 경로 오류 → 절대경로 사용 (File('C:/Users/.../students.txt'))
  • 한글 깨짐 → stdin.readLineSync(encoding: utf8)로 수정
  • CSV 파싱 오류 → line.split(',').map((e) => e.trim()).toList()로 공백 제거

(4) 위기
문법적인 오류는 해결했지만, 존재하지 않는 이름을 입력하면 프로그램이 멈추는 문제가 생겼습니다.
예를 들어 “이몽룡”을 입력하면 Null check operator used on a null value 라는 에러가 발생했습니다.
또 result.txt 파일을 저장할 때 이미 파일이 존재하면 덮어쓰기 오류가 발생했습니다.

 

(5) 절정
입력과 저장 부분 모두 예외처리를 추가했습니다.
입력을 잘못했을 때는 다시 입력받도록 while 문을 사용했고,
파일 저장은 try-catch 문으로 감싸서 프로그램이 중단되지 않게 했습니다.

 
while (true) { print("어떤 학생의 점수를 확인하시겠습니까?"); String? input = stdin.readLineSync(encoding: utf8); var target = students.firstWhere( (s) => s.name == input, orElse: () => null, ); if (target != null) { target.showInfo(); break; } else { print("잘못된 학생 이름을 입력하셨습니다. 다시 입력해주세요."); } }

파일 저장 부분

 
try { File('result.txt').writeAsStringSync("이름: ${target.name}, 점수: ${target.score}"); print("저장이 완료되었습니다."); } catch (e) { print("저장 중 오류 발생: $e"); }

 

(6) 결말
최종적으로 프로그램은 정상 작동했습니다.
디버그 콘솔에서 입력이 안 되던 문제도 터미널 실행으로 해결됐고,
입력 오류와 파일 저장 오류도 모두 처리할 수 있었습니다.
다만 import 'dart:io';가 정확히 어떤 역할을 하는지는 아직 완전히 이해하지 못했습니다.
파일, 입력, 출력, 네트워크 관련 기능들이 포함되어 있다고 하는데 더 공부가 필요하다고 느꼈습니다.

  1. 느낀 점
    이번 과제는 생각보다 훨씬 어려웠습니다.
    특히 파일을 불러오는 것이 처음이라 감을 잡는 데 시간이 많이 걸렸고,
    환경 설정이나 경로 문제, 인코딩 문제 등 코드 외적인 부분에서 막히는 경험을 처음 해봤습니다.

하지만 ChatGPT에게 도움을 받으면서 문제를 해결하는 과정에서
오류를 분석하고, 실행 환경을 이해하는 게 얼마나 중요한지 배웠습니다.
앞으로는 dart:io와 파일 입출력 관련 내용을 더 공부해서
다음에는 이런 문제를 스스로 해결할 수 있도록 연습하고 싶습니다.