해당 프로젝트는 OTT 플랫폼을 CLI 프로그램으로 Java를 사용해 만드는 프로젝트이다.
아래의 GIF와 같이 유저와 관리자는 CLI에 입력을 하여 Action을 하는 것으로 구성을 했다.
| 영상 시청 | 시청 기록 | |
|---|---|---|
| 유저 | ![]() | ![]() |
| 영상 등록 | 영상 삭제 | |
|---|---|---|
| 관리자 | ![]() | ![]() |
입력을 받는 예시는 다음 코드와 같다.
public Media createMedia(Scanner input) {
System.out.println("| 📢 일반 드라마를 등록합니다.");
System.out.print("| 🫧 제목을 입력해주세요: ");
String title = input.nextLine();
System.out.print("| 🫧 영상 시간을 입력해주세요 (단위: 분) : ");
int duration = input.nextInt();
System.out.print("| 🫧 몇부작인지 입력해주세요: ");
int episodes = input.nextInt();
System.out.print("| 🫧 평점이 몇점인지 입력해주세요: ");
double rating = input.nextDouble();
return new Drama(title, duration, episodes, rating);
}
이렇게 코드를 짠다면, 정수를 입력하는 곳에서 문자열을 입력한다면 예외가 발생하면서 프로그램이 종료된다.
하지만, 이 프로그램이 실제 서비스가 되고 있다면 예외로 인한 프로그램은 종료는 사용자 경험을 해칠 것이다.
그렇기 때문에 위와 같이 입력을 받는 곳에서 예외 처리를 할 것이다.
위에서 언급한 정수를 입력하는 곳에서 문자열을 입력한다면 InputMismatchException 이라는 예외가 발생한다.
그렇다면 이 예외를 처리하는 방법은 무엇일까?
바로 Java의 try { ~ } catch { ~ } 문을 사용하면 된다.
try ~ catch 문은 예외 발생 가능성이 있는 위치에 사용하여 예외를 처리하는 구문이다.
그렇다면 InputMismatchException 예외를 처리하는 try~catch문을 작성해보자
public static int getUserInput(String message, int min, int max) {
Scanner input = new Scanner(System.in);
int result;
while (true) {
System.out.print(message);
try {
result = input.nextInt();
break;
} catch (InputMismatchException e) {
printInputError();
input.next();
}
}
return result;
}
위의 코드는 본인이 프로젝트에 적용한 input에서 발생할 수 있는 예외 처리를 한 것이다.
코드를 보면 catch (InputMisamatchException e)를 사용한 것을 볼 수 있다.
만약 InputMismatchException이 발생한다면 저 catch 문이 해당 에러를 캐치하고, catch 문내에 있는 printInputError()이 실행된다.
만약 원하는 입력이나 원하는 결과가 발생하지 않았을 때도 예외를 발생해서 처리를 한다면 효율적이지 않을까 ? 라고 생각을 해봤다.
매번 입력을 받거나 할 때 조건문을 통해서 검사하고, 로직을 다시 적어야 하니 코드의 길이가 길어질 뿐만 아니라 스파게티 코드가 되어 가는 것 같아서 본인만의 예외 클래스를 생성해서 예외처리를 해보자고 다짐했다.
본인은 사용자가 원하는 action의 번호를 입력하면 그 번호에 맞게 action을 할 수 있도록 로직을 구현했다.
System.out.print("| 🫧 무엇을 하시겠습니까? (1: 시청하기, 2: 시청기록 보기, 3: 로그아웃, 0: 프로그램 종료): ");
int action = input.nextInt();
저 경우에서 만약 사용자가 0, 1, 2, 3 이외의 번호를 입력한다면 본인이 예상하지 못한 번호가 입력이 되고 마지막에는 프로그램이 제대로 동작을 하지 않을 것이다.
위와 같은 경우에서 본인은 주어진 번호 이외의 입력이 들어온다면 예외를 발생시키도록 하여 처리를 하겠다.
public static int getUserInput(String message, int min, int max) {
Scanner input = new Scanner(System.in);
int result;
while (true) {
System.out.print(message);
try {
result = input.nextInt();
if (result < min || result > max) {
throw new InvalidInputException();
}
break;
} catch (InputMismatchException e) {
printInputError();
input.next();
} catch (InvalidInputException e) {
printInputError();
}
}
return result;
}
이런 식으로 getUserInput을 만들고 최소 번호, 최대 번호를 인자로 넘겨주어 해당 구간 이외의 번호를 입력받으면 InvalidInputException( )예외를 발생시키게 했다.
아래는 InvalidInputException( ) 예외 코드이다
public class InvalidInputException extends Exception{
public InvalidInputException() {
super();
}
}
이렇게 코드를 작성하고 프로젝트에 적용을 해보았다.
int actionType = getUserInput("| 🫧 무엇을 하시겠습니까? (1: 시청하기, 2: 시청기록 보기, 3: 로그아웃, 0: 프로그램 종료): ", 0, 3);
적용을 하니 본인이 원하는 입력값을 받게 될 수 있었고, 예외가 발생하지 않아 프로그램이 강제 종료되는 일이 없게 되었다.
프로젝트 코드: Github 바로가기