💙 들어가며
어떤 IDE환경에서도 쉽게 프로젝트를 빌드할 수 있게 해주는 빌드도구 Maven,
그리고 작업할 때 발생하는 예외에 대해서 처리하는 방법을 알아보자.
✏️ 학습내용 정리
#Maven 프로젝트
💡 Maven 프로젝트의 특징
1. Maven은 build tool이기 때문에 편집기와 실행창이 없기 때문에 통합개발환경이 필요하다.
그러나 프로젝트가 IDE로부터 독립적이 되기 때문에 다양한 IDE를 활용할 수 있다.
2. 원격 저장소에 올라와 있는 다양한 라이브러리가 올라와 있는데,
따로 다운로드 받을 필요 없이 pom.xml를 활용하면
우리의 로컬 저장소에 필요한 라이브러리를 쉽게 저장해둘 수 있다.
이때, 한 라이브러리를 사용하기 위해서 필요한 다른 종속적인 라이브러리를 다 자동으로 받아준다.
3. 로컬 저장소에 저장한 것 하나만으로도 라이브러리 세팅을 매번 바꿀 필요가 없어진다.
※ 단, 와이파이가 안정적이지 않으면 라이브러리가 다운로드 받는데 문제가 생길 수 있다.
이런 경우에는 .m2>repository안에 있는 라이브러리를 삭제하면 된다.
이클립스를 다시 실행하면 다시 자동으로 라이브러리가 다운로드 된다.
소스코드를 여러개 모아놓으면 컴파일해서 제품을 바로 만들 수 있지만,
도구를 사용(소스코드를 모으고, 열고, 번역하는 기능)하기 위해서 별도의 프로젝트를 만들어서 사용한다.
우리는 여태까지 IDE를 통해서 만든 프로젝트는 그 IDE에서만 열 수 있었다.
하지만 Maven을 통해서 만든 프로젝트는 Maven의 도구를 사용할 수 있기 때문에
IDE를 특정지어 선택하지 않고 다양한 IDE를 사용할 수 있다. (이클립스, 인텔리제이, VSCode 등..)
이제 팀원들과 하나의 MAVEN 프로젝트를 이용하기만 하면 각자 다른 IDE를 사용해도 된다.
Maven을 사용하기 전까지는 직접 jar파일을 다운로드 받아서 import했지만
이제는 pom.xml에 간단하게 코드를 추가함으로써 처리할 수 있고,
하나의 라이브러리를 사용하기 위해서 필요한 모든 다른 라이브러리를 다 자동으로 다운로드 받아준다.
#읽어 올 데이터 뽑기: 사용자 요청
우리가 하나의 페이지를 운용하기 위해서는 사용자가 요청할 때 읽어올 초기 데이터를 얻어와야 한다.
그렇다면 일일이 모든 데이터를 JDBC를 통해서 입력해야 할까?
당연히 NO! 데이터를 전문으로 하는 서비스(메소드)를 만들어서 활용한다.
사용자의 입력을 받았을 때 직접 데이터를 때려박지 않고, 단순하게 메소드 하나를 호출하는 것으로
아주 간편하게 데이터를 뽑아올 수 있게 된다.
이렇게 되면 효율성 면에서도 좋아지지만 main하나에 긴 코드를 적어두지 않아도 되니
모듈화를 하고 유지보수를 하는데도 효과적이다.
💡 메뉴목록을 뽑아주는 repository라는 전문 서비스를 만들어보자.
//★main★
MenuRepository repository = new MenuRepository();
repository.findAll(); --다 찾아줘
repository.findById(id); --ID에 해당되는 것만 찾아줘
//★MenuRepository class★
public class MenuRepository {
public void findAll() throws Exception {
// 만약 ip로 쓸거면(192.168.0.15) 같은 와이파이에 접속해야 한다.
// 공유기 상관없이 접속하기 위해서는 도메인명을 사용한다.(도메인)
// 오라클 드라이버를 사용하는 매뉴얼에 나옴 / 구분자는 콜론임( : ) 세미콜론 아님
String url = "jdbc:oracle:thin:@도메인:포트번호/pdb";
//데이터 분석: 집계(평균, 중앙값..), 정렬, 필터링(원하는 rows만 뽑아서 만드는 것), 매핑(원하는 columns만 뽑아서 만드는 것)...은 모두 SQL에게 시킨다.
String sql = "SELECT * FROM NOTICE";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, "아이디", "비밀번호");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql); // 이렇게 실행한 값은 서버가 가지고 있다.
//데이터를 출력하는 부분
//SQL가 데이터 분석을 하면 사용자와 상호작용 하는 부분은 JAVA가 한다.
while(rs.next()) {
String title = rs.getString("title");
System.out.printf("title:%-2s\n", title);
}//while
rs.close();
st.close();
con.close();
}//findAll() ends
}//class ends
#예외란?
오류의 종류에 대해서 구분해보자. 오류와 예외는 다르다!
예외는 입력에 대한 오류이다.
이 입력값은 사람이 입력할 때 오류를 낼 수도 있지만, 장치에서 입력 오류가 날 수도 있다.
그렇다면 보고하는 방법은 어떻게 되고 보고받는 방법은 어떻게 될까?
예외가 발생했는지에 대한 여부는 API가 알려주지만 처리하는 것은 어플리케이션이 한다.
Write()라는 API가 어플리케이션으로 바로 보고를 하지 못하고,
여러 단계를 거치게 될 수 있으니 return값으로 오류를 처리하지는 않는다.
처리하는 방법은 어떻게 될까?
오류 보고를 받은 어플리케이션 쪽에서 TRY~CATCH문을 사용해서 처리한다.
try~catch는 누가 되었든 꼭 1번을 실행해주어야 한다.
만약 아래와 같이 계속 던지다가 최상위인 runtime에게 던지는 경우에는
아무도 처리하지 않아서 오류가 발생한다.
💡 new할 때는 throw이고 메소드는 throws를 사용한다. 차이가 뭘까?
new해서 만드는 예외는 하나하나씩을 처리하므로 throw라고 하지만,
메소드에서는 던져야 할 예외가 여러 개 될 수 있어서 throws라고 -s를 붙여서 쓴다.
예외가 발생했을 때 프로그램은 함수가 다 끝난 뒤에 throws를 하는 것이 아니란 점에 주목하자.
throws는 return값이 아니기 때문에 예외가 발생하면 바로 즉각적으로 받는다.
따라서 예외가 발생하면 실행결과를 보여줄 수 없다. 함수가 다 실행되지 않기 때문!
#예외처리
본격적으로 예외를 처리해보자.
사용자 입장에서 당황하지 않도록 예외가 발생했을 때 예외가 발생했다는 문구를 출력해주는 것이
예외처리의 기본이 되겠다.
메세지 문구를 출력하는 방법은 try~catch문을 활용하면 되고,
try안에 문제가 되는 부분을 넣고, catch부분에서 예외가 발생하였을 때 어떻게 처리할 것인지를 적으면 된다.
아래 이미지에서는 Calculator가 throws한 예외를 main에서 처리하고 있다.
💡 try~catch로 100이 넘는 값을 입력받았을 때를 처리해보자.
public static void main(String[] args){
int result = 0;
//catch에 처리할 내용이 없어도 try~catch를 해준것만으로도 예외처리가 된 것으로 보고
//runtime은 프로그램을 끝까지 실행할 수 있다.
try {
result = Calculator.add(140,30);
}
catch(백을넘는예외 ex) {
System.out.println("죄송합니다. 오류가 발생하였습니다.");
System.out.println("입력값은 100을 넘을 수 없습니다.");
return;
}
System.out.println(result);
System.out.println("프로그램 종료");
}//main ends
⭕ 출력결과:
try~catch를 사용하니 더이상 프로그램이 종료되지 않고,
원하는 처리문구를 출력할 수 있게 되었다.

만약 예외가 여러개라면 어떻게 될까?
여러가지 방법이 있다.
💡 예외처리에 대한 여러가지 방법
1. Add throws declaration: 상위 영역에 예외를 던진다. (내가 처리 안하겠다!)
2. Add catch clause to surrounding try: 새로운 catch를 추가로 맨 아래에 만든다.
3. Add exception to existing catch clause: 이미 있는 catch문에 or형태로(|) 예외를 추가한다.
4. surround with try/catch: 별도의 try부터 시작하는 try~catch문을 만든다.
하나로 묶어서 처리할 수도 있고,
하나씩 만들고 맨 마지막에 마치 if~else의 else처럼 범용적인 예외를 처리하는 방법을 기술할 수도 있다.
단 범용적인 예외에 대한 처리방법은 항상 마지막에 나와야 한다.
안그러면 특화시킨 예외처리에 대한 내용이 실행되지 않기 때문이다.
#finally
finally는 오류가 나든 안나든 무조건 1회는 훑고 지나가는 부분이다.
마치 리소스를 정리할 때 close를 꼭 해줘야 하는 상황처럼 꼭 1회는 처리해야 하는 상황일 때
finally안에 내용을 넣는다.
최종적으로 100이상의 입력값과 음수인 입력값에 대한 2가지 예외상황에 대해서 정리한 코드는 다음과 같다.
💡 2가지 예외상황을 main함수에서 처리해보자.
public static void main(String[] args){
int result = 0;
//catch에 처리할 내용이 없어도 try~catch를 해준것만으로도 예외처리가 된 것으로 보고
//runtime은 프로그램을 끝까지 실행할 수 있다.
try {
result = Calculator.add(-10,30);
}
catch(백을넘는예외 ex) {
System.out.println("죄송합니다. 오류가 발생하였습니다.");
System.out.println("입력값은 100을 넘을 수 없습니다.");
return;
}
catch (음수가되는예외 e) {
System.out.println("죄송합니다. 오류가 발생하였습니다.");
System.out.println("입력값은 음수가 될 수 없습니다.");
return;
}
finally {
System.out.println("마무리 리소스 정리");
}
System.out.println(result);
System.out.println("프로그램 종료");
}//main ends
⭕ 출력결과:
음수값을 입력했더니 음수인 경우에 대해서 예외처리가 되었고,
마지막에 finally부분까지 잘 출력되었다!

예외를 강요하지 않게끔 만들 수도 있다. 그냥 Exception이 아니라 RuntimeExeption이라고 하면 강요하지 않는다.
물론 실행하면 예외상황임을 알려주지만, 코딩할 때 예외처리 하지 않아서 생기는 빨간색 줄이 없다.
콘솔에 아예 메세지를 띄울 수도 있다. 예외와 관련된 콘솔 결과에 빨간색 글씨로 메세지가 나온다.
#try~with~resorce
자바 7버전 이후에 새로 나온 것이다.
finally에 명시적으로 close를 적어주지 않아도 자동으로 사용한 리소스를 close해준다.
try~catch~finally랑 똑같지만 finally가 필요없기 때문에 코드가 더 짧아진다.
💡 try~with~resorce로 예외처리를 해보자.
// 만약 ip로 쓸거면(192.168.0.15) 같은 와이파이에 접속해야 한다.
// 공유기 상관없이 접속하기 위해서는 도메인명을 사용한다.(도메인)
// 오라클 드라이버를 사용하는 매뉴얼에 나옴 / 구분자는 콜론임( : ) 세미콜론 아님
String url = "jdbc:oracle:thin:@도메인:포트번호/pdb";
//데이터 분석: 집계(평균, 중앙값..), 정렬, 필터링(원하는 rows만 뽑아서 만드는 것), 매핑(원하는 columns만 뽑아서 만드는 것)...은 모두 SQL에게 시킨다.
String sql = "SELECT * FROM NOTICE";
try(
Connection con = DriverManager.getConnection(url, "아이디", "비밀번호");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(sql); // 이렇게 실행한 값은 서버가 가지고 있다.
) {
Class.forName("oracle.jdbc.driver.OracleDriver");
//데이터를 출력하는 부분
//SQL가 데이터 분석을 하면 사용자와 상호작용 하는 부분은 JAVA가 한다.
while(rs.next()) {
String title = rs.getString("title");
System.out.printf("title:%-2s\n", title);
}//while
}//try ends★
catch (ClassNotFoundException e) {
e.printStackTrace();
}//catch1 ends★
catch (SQLException e) {
e.printStackTrace();
}//catch2 ends★
#예외처리를 하지 않으면?
1. Runtime이 프로그램을 종료시켜버린다.
2. 사용자 입장에서 기능적/보안적인 문제로 신뢰성을 떨어뜨리게 된다.
때문에 프로그램이 갑자기 끝나서는 안된다.
별로 치명적이지 않으면 메세지를 띄우는 식으로 마무리할 수 있다.
💙 마치며
1.
항상 상위 개체로 예외를 throws하는 방법으로 예외처리를 했었는데
try~catch를 이용해서 제대로 처리하는 방법을 배우니
조금 더 예외처리에 대한 이해도가 올라간 것 같다.
throws를 하다하다 최상위인 runtime에게 throws해버리면
바로 오류가 난다는 것을 잊지말자!
어디에서든 예외처리는 꼭 1회 수반되어야 한다.
2.
MyBatis를 활용하면 SQL쿼리를 작성하는데 훨씬 용이할 것 같다.
사용하는 방법을 잘 배워야겠다.
'SQL' 카테고리의 다른 글
[뉴렉처 6기] 업무로직 / 트랜잭션 / 서비스함수│자바 인터페이스(230830) (0) | 2023.08.30 |
---|---|
[뉴렉처 6기]가변길이 배열 │컬렉션│Object│제네릭(230829) (0) | 2023.08.29 |
[뉴렉처 6기] DATABASE│제약조건│도메인│엔티티│관계(230825) (0) | 2023.08.25 |
[뉴렉처 6기] DATABASE│정규화│1NF│2NF│3NF(230824) (0) | 2023.08.24 |
[뉴렉처 6기] DATABASE│식별키│식별관계/비식별관계(230822) (0) | 2023.08.22 |