IT/JAVA

MVC 패턴 - 유효성 검사/예외처리

_KH_ 2025. 1. 31. 19:07

MVC 패턴 프로젝트 중 유효성 검사, 예외 처리를 하던 중 알게 된 점 정리

 

[클라이언트뷰 메서드 목록]

클라이언트뷰 메서드 목록
1) inputNum() // 메뉴 번호 입력  √ 
2) printPopularList() // 인기 대출 도서 출력  √ 
3) inputBookName() // 책 검색 시 이름 입력 √ 
4) addToCart() // 장바구니 담기 결과 출력 √ 
5) borrowFormCart() // 장바구니 책 대여 √ 
6) printReturnBook() // 책 반납 결과 출력 √ 
7) printCartEmpty() // 장바구니 비우기 성공 안내 √ 
8) printDatas() // 대여한 책 목록 출력 -> 오버로딩 √
9) checkBorrow() // 대여 확인 문구 √
10) chechReturn() // 반납 확인 문구 √
11) printCheckMode() // 관리자가 회원 모드에서 로그인 시도 √

 

Scanner를 사용한 입력을 받는 코드가 있다면, InputMismatchException 등의 예외를 고려해야 한다.

 

① InputMismatchException

 정수로 입력해야 하는데 문자를 입력한 경우 예외 발생

 

② isEmpty() 함수

: List 인터페이스에서 제공하는 메서드

 

③ View 클래스에서 유효성 검사 처리 및 예외처리

- 유효성 검사는 목록 출력에서 ArrayList의 요소에 null이 있을 경우 "비어있는 책장입니다!" 라고 출력문 추가

 

※ 수정 전

	public void printDatas(ArrayList<BookDTO> datas) { // 목록 출력
		if(datas == null || datas.size() <= 0 ) {
			System.out.println("책이 없습니다!");
			return;
		}
		for(BookDTO book : datas) {
			System.out.println(book);
		}
	}

 

※ 수정 후

	public void printDatas(ArrayList<BookDTO> datas) { // 목록 출력
		if(datas == null || datas.isEmpty() ) {
			System.out.println("책이 없습니다!");
			return;
		}
		for(BookDTO book : datas) {
			if(book != null) {
				System.out.println(book);
			} else { // 추가
				System.out.println("비어있는 책장입니다.");
			} 
		}
	}

 

④ ClientView 유효성 검사 + 예외처리 추가

④-1. inputNum()

※ 추가 전

public int inputNum() { // 번호 입력
		
		System.out.print("번호를 입력해주세요 >>");
		return sc.nextInt();
	}

 

※ 추가 후

	public int inputNum() { // 번호 입력
		int num;
		while(true) {
			try {
				System.out.print("번호를 입력해주세요(0-8) >>");
				num = sc.nextInt();

				if(num >= 0 && num <=8) { // 0부터 8 사이로 입력하면 입력값 반환
					return num; 
				} else {
					System.out.println("0부터 8 사이의 숫자만 입력해주세요."); // 0-8 외 숫자 입력
				}
			} catch (InputMismatchException e) { // 정수가 아닌 경우
				System.out.println("[로그] : ClientView inputNum 함수에서 예외 발생 ");
				sc.nextLine(); // 입력 버퍼 지우기 ★ 
			} 
		}
	}

 

 

// sc.nextLine()에 대해서.

 

nextInt()로 입력을 받을 때 사용자는 숫자를 입력한 후 Enter를 누르게 된다.

이때 입력된 숫자는 값으로 들어가지만 Enter는 지워지지 않고 버퍼에 그대로 남게된다. (\n)

왜냐하면 버퍼에 사용자가 입력한 정보를 저장해놓고 scanner가 메모리로 하나씩 불러오는데 필요한 정보만 처리하고 필요없는 \n는 그대로 놔두기 때문.

이때, 사용자가 잘못된 번호를 입력해서 다시 입력받아야 할 경우 버퍼에 있던 \n를 그대로 가져오게 되는 것! (입력조차 x)

그러므로 문자열을 입력받는  sc.nextLine(); 을 사용해서 버퍼에 남 \n를 없애주는 것이다.

 

NullPointerException 예외 

: 실제 값이 아닌 null을 가지고 있는 객체/변수를 호출할 때 발생하는 예외.

printPopularList() 메서드에서 book == null 로 유효성 검사를 한 번 거치기 때문에  try-catch문이 없더라도 NullPointerException은 괜찮다고 생각.

 

⑥ nextLine()  / next() 차이□ next() : 단어를 입력받음. 공백 이후는 버린다.□ nextLine() : 문자열을 입력받음. 공백 포함해서 입력받는다.

 

 

// ArrayList 요소 저장될 때 어떻게 되는지 그림 찾아보고 작성하시오!! 삭제하거나 추가할 때 요소가 어떻게 빠지고 들어오는지

// try-catch문이 필요한 경우 (유효성 검사 말고)

 

이 목록들 더 공부하기

 

뷰는 출력만 해주면 되는데 자꾸 모델이 짜야할 로직을 같이 짜고 있다... 뷰는 출력만!!! 역할 분담 확실히!!! 인기대출도서에서 나는 출력만 해주면 되는데 자꾸 대여횟수가 같을 때 먼저 등록된 데이터부터 출력하는 로직, 대여횟수가 0이라면 출력하지 않는 로직.. 이런 걸 고민하고 있었다. 아직 MVC 패턴에 익숙하지 않아서 발생하는 일 같다. 그리고 코드 작성하는 것보다 유효성 검사/예외처리 하는 게 더 힘든 것 같다,,

'IT > JAVA' 카테고리의 다른 글

파일 입출력  (0) 2025.02.04
유효성 검사, 예외처리 전 코드  (1) 2025.02.03
Java Section 19 : 파일 입출력  (2) 2025.01.27
Java Section 18 : 스레드  (1) 2025.01.25
Java Section 17 : 람다식  (0) 2025.01.24