본문 바로가기

Advanced java/T Academy

[3일차] JAVA API 사용 및 JDBC 프로그래밍



3일차에는 예외관리와 JDBC를 다뤄보려고 한다. 


학부에서 프로그래밍을 배우고 나서, 모든 예외가 될만한 상황들은 if then else 구문으로 해결해 왔다. 그러다 보니 코드가 길어지고, 코드가 꼬이기도 하는 상황이 발생한다. 자바에서는 에러를 포함한 예외상황을 효과적으로 처리하기위한 예외 처리 클래스들을 제공한다.


예외관리까지 끝나면 객체지향에 대한 대부분의 개념들을 진행했다고 봐도 무방하다. 추상화 상속 오버로딩 오버라이딩 다형성. 그리고 이 모든 개념이 녹아있는 API가 JDBC라고 한다.


<예외관리>



예외관련 API들은 우리가 자바프로그래밍을 할 때 조금더 세련된 프로그래밍을 하도록 도와준다. 프로그래밍을 하기 전, 예외상황들을 미리 예측하고, 클래스로 만들어 두면 어떤예외인지, 어떤상황에서 벌어진 예외인지 조금 더 정확히 파악이 가능하다. 위의 예외API 다이어그램을 보자. 맨처음 Throwable에서 Error와 Exception으로 나누어진다. Error은 우리가 직접 프로그래밍 하지 않은 부분에서 나타난다. Exception은 또 두부분으로 나뉘며, RuntimeException은 프로그램 실행중에 나타나는 예외이며, IO Exception은 I/O관련 예외상황들을 처리한다. 예외 클래스들은 크게 두 부분으로 나뉠수 있다.


1. Checked Exception : 이 예외상황들을 처리하지 않으면 안되므로 강제적으로 예외를 처리하게 하는 Exception 예전 API들은 대부분 Checked Exception을 throw 했다. RuntimeException을 제외한 Exception들이 여기에 속한다.


2. Non-Checked Exception : 이 예외상황은 굳이 예외상황을 처리하지 않아도 되는 예외들이다. 요새 API들은 그 API를 쓰는 프로그램들의 유지보수를 생각해서 이 Exception을 throw 한다고 한다. RuntimeException이 이에 해당한다.


우리는 이런 예외 API를 사용하기도 하고, 만약 자신이 생각한 예외가 없다면, 예외클래스를 만들어 사용하기도 한다. 프로젝트 시작 전, 요구사항을 파악하면서 예외상황을 정리 해 두고, 예외상황에 맞는 이름을 가지는 예외클래스들을 만들어 두면, 예외도 명확하고 유지보수도 쉬워진다. 


예외를 처리 할 때는 중간객체에서는 throws, main이나 UI 클래스에선 try - catch - finally를 써서 한다.


자 그러면 예외 예제를 살펴보자.



int num에 실수를 대입했다면, 컴파일 오류가 날 것 이다. 이런 컴파일 오류와 같은 것들을 문법오류 라고 하며, 코딩 상단에서부터 제거해 나가면서 처리 해 주면 된다.


System.out.println(args[0]);는 컴파일 오류는 나지 않지만, Runtime시에 오류가 발생한다. 이와같은 것들을 실행오류라고 하며, 여기서는 실행했을때, ArrayIndexOutOfBoundsException이 발생하게 된다. 이와같은 실행오류들로 인해 프로그램이 정지되지 않아야 한다면, 프로그래머가 직접 예외처리를 해 주어야 한다.


프로그램이 정상실행되서 end 까지 온다면 예외처리가 끝난것이다.



이제 사용자 정의 예외를 살펴보자. UserObjectMethodBException을 먼저 선언해 놓고, UserObject를 만들었다.

UserObject의 생성자에서 methodA()를 호출하며, methodA에서 methodB를 선언한다. 그리고 methodB에서 예외를 throw하도록 한다. 초보 개발자들은 대부분 if문을 사용할 때, true조건만 체크해서 처리한다. 그러나 false문을 처리하도록하면 더욱 효과적이고, 예외클래스들을 잘 활용 할 수 있는 환경이 된다. 지금은 CheckedException으로 처리해서 throws가 인터페이스부분에 계속 추가가 되지만, Nonchecked Exception을 활용한다면 ㅇㄴ터페이스 변화 없이 예외를 처리 할 수 있게 된다.


<JDBC>



자바 응용프로그램과 DBMS를 연결하기 위한 인터페이스이다.


DB의 규칙을 Interface 만들어 놓음 + Class로 Interface구축 = 디비와 연결


DQL : select

DML : insert, delete, update

DDL : create alter drop -> DBA

DCL : DB 시스템 전문가 (튜닝, 권한, 세팅)


sql query는 요구사항에 따라서 짠다.


-DriverManager 구조


어떤 디비던지 Driver - Connection - Statement - ResultSet 순서로 진행된다.

Mysql 이나 Oracle 디비는 Connection부터 MultiThread가 가능하여서 여러개를 한꺼번에 요청하고 받아 올 수 있다.1개의 sql문에서는 결과가 오직 1개이다.


-JDBC 프로그래밍 순서


1) 드라이버 로딩

드라이버만 잘 써도 보안이슈를 막을 수 있다. JDBC에서는 드라이버 자체에서 적합하지않은 Query문은 전송하지 않으므로 데이터가 안전하게 유지된다.

2) 데이타베이스 연결

3) SQL문 전송

4) 결과처리

5) 종료


여기서도 예외처리를 해주게 되는데, 적절하지 않으면 ORA - 0000과 같은 에러가 뜨게 된다. 이건 오라클 디비에서 에러가 발생했을때 전송하는 일련번호인데, 디비에러가 아닌경우에도 ORA와 같은 에러가 전송될때가 있다. 이때는 프로그래머가 잘 파악해서 그에 적절한 예외클래스를 만들어서 새로 throw 해주어야 한다.



-예제


요구사항 : 아이디 길이는 8자이상 비밀번호는 숫자로 4자


개발순서


1)패키지를 먼저 작성

test와 실제 프로그램 패키지를 나눈다.


2) Exception을 먼저정의

LoginIDMinLengthException 과 PasswordDefaultLengthException 클래스를 RuntimeException 클래스를 상속받아서 만든다. 이렇게 클래스명을 설정하면 어떤 예외인지 쉽게 알 수 있다.


 


3) Login Interface 설계

입력 - 아이디, 비밀번호

출력 - boolean or void-예외 or Name or 회원정보 

출력의 형식중 하나를 고른다. 우리는 로그인에 성공하면 회원정보를 보여주기로 정했으므로 회원정보 클래스인 Member을 만들어보자.


4) Login에 필요한 회원정보 class설계

회원정보 - 아이디, 비밀번호, 이름

처음에 했던 방식과 같이, 데이터를 정의하고, getter setter equals hashcode toString constructure을 설정한다.

그리고 요구사항에서 아이디는 8자이상 비밀번호는 4자리 숫자이므로 setter에 if문으로 설정해주고 false 조건이 들어오면 예외를 throw해준다.



5) 회원정보 class 단위 테스트

Member에 아이디8자 비번4자리숫자가 안되는 경우의수를 다 넣어보면서 다 되는지 확인한다.



6) Member Login Class 만들기

JDBC의 개발순서를 활용해서 계속 사용해서 반복되는 부분은 다른 메소드로 빼고, 바뀌는부분만 남겨둔다.



7) Member Login Class 단위테스트




이렇게 3일간의 수업이 끝났다. 3일이라 만만하게 봤지만 계산해보면 한학기 수업보다 많은 시간이었고 많은 양이었다. 다음에 또 이런 강의가 개설된다면 또 들으러 갈 계획이다.