[4기] 백엔드 개발자 부트캠프 "오르미" ~ing/[4기] 백엔드 개발자 부트캠프 오르미 수업 복습

[4기] 37일차 Java ( 예외처리, 트랜잭션 )

sohee99 2024. 2. 7. 16:39

오늘의 학습!

 

예외처리2!!!

 

어제 배운 부분 포함 퀴즈풀이와 예외처리2를 이어 배웠습니당!!!!

 

퀴즈 풀이 

public class NotEcistsldException_7 extends Exception{

    public NotEcistsldException_7(){
    }

    public NotEcistsldException_7(String message){
        super(message);
    }
}

 

public class WrongPasswordExcetion_7 extends Exception{
    //생성자 선언
    public WrongPasswordExcetion_7(){
    }

    public WrongPasswordExcetion_7(String message){
        super(message);
    }
}
public static void main(String[] args) {
    try{
        login("blue","54321");
    }catch (Exception e){
        System.out.println(e.getMessage());
    }
}

public static void  login(String id, String password) throws NotEcistsldException_7, WrongPasswordExcetion_7{
    if(!id.equals("blue")){
        throw new NotEcistsldException_7("아이디가 존재하지 않습니다.");
    }
    if(!password.equals("12345")){
        throw new WrongPasswordExcetion_7("패스워드가 틀립니다.");
    }
}

 

사용자 정의 예외 클래스 선언

 

public class XXXException extends Exception{
    public XXXException() { }
    public XXXException(String message) {  super(message);  }
}

 

public class RunXXXException extends RuntimeException{
    public RunXXXException(String message){
        super(message);
    }
}

 

public static void main(String[] args) //throws XXXException
 {
    try {
        exceptionTest();
        exceptionTest2(); //호출한 여기서 처리를 안해주면 컴파일오류 /던지거나 받거나 해야함
    }catch (Exception e){
        //Logging
    }
}

public static void  exceptionTest(){
    throw new RunXXXException("런타임 예외 던지기"); //뒤에있는 로직 실행도 못하고 종료
}

public  static void exceptionTest2() throws  XXXException{
    throw new XXXException("Checked 예외 던지기");
}

 

사용자 정의 예외 클래스는

 

XXXException 와 같이 Exception을 상속하여 일반 예외로 선언하거나

 

RunXXXException와 같이 RuntimeException 을 상속하여 실행 예외로 선언할 수 있다! 

 

차이는 컴파일러가 체크하는 일반예외! 컴파일러가 체크하지 않는 실행예외 선언! ㅎㅎ

 

 

RuntimeException을 상속한 실행예외는 오류가 안걸리는데 

 

 Exception은 오류가 걸리니깐 신기한거 있죠 ㅋㅋㅋㅋㅎㅎ

 

 

이제는 알게됬지용! 컴파일러가 체크하기 때문에 오류가 걸리고 

 

호출하는 메인 부분에서

 

public static void main(String[] args) //throws XXXException
 {
    try {
        exceptionTest();
        exceptionTest2(); //호출한 여기서 처리를 안해주면 컴파일오류 /던지거나 받거나 해야함
    }catch (Exception e){
        //Logging
    }
}

 

이렇게 try-catch 잡아주거나 throws로 던져야 컴파일오류가 나지 않는다는걸!!!!

 

 

하나하나 오류 없어질때마다 은근 재밌네요 ㅋㅋㅋㅎㅎ

 

나중에는 빨간줄 보기 싫겠죠? ㅋㅋㅋㅋㅋㅋㅋ

 

 

하지만! 이렇게 

 

throws로 계속적으로 던지고던지고던지고 하면?

 

public static void test3() throws XXXException{
    exceptionTest();
    exceptionTest2();
}

 

던진다음 

 

public static void  test2(){
    test3(); //여기서 try-catch 처리가 되지않고 계속적으로 throws 하게 되면?
}

 

다시 test3를 호출하게되고 이 반복이 이어지게 되면 

 

코드에 대한 분석이 힘들어지며 유지보수 또한 어려워지겠죵?

 

 

예외 책임을 떠넘기지 않고 잘처리하는것이 throws 지옥에서 탈출하는길이라는 !! ㅎㅎㅋㅋㅋㅋㅋ 

 

진짜 지옥이네 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

 

 

public static void test3(){
    try{
        exceptionTest();
        exceptionTest2();
    }catch (XXXException e){
        
    }
    
}

 

이렇게 잡아줄 수 있을 때 잡아야 코드가 복잡해지지않고 깔끔!@!!!!!! 

 

좋은 예외처리를 해서 견고한 코드를 만들자아!!!!

 

public static void  test2() throws  Exception{
    test3(); //여기서 try-catch 처리가 되지않고 계속적으로 throws 하게 되면?
    try {
        throw  new IOException();
    }catch (IOException e){
        System.out.println("");
        throw  new Exception(); //캐치를하고 다시 throw를 하면?
    }

}

 

이렇게 catch로 잡았는데 다시 throw로 잡을 거면 잡지 않기로!!!

 

완전 throws 늪으로 빠져가는길 ㅎㅎㅎㅎㅎㅎㅎㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

 

 

 

사용자 정의 예외 클래스의 네이밍은 Exception으로 끝내기!!!!!!!

 

throw 와 throws의 차이

 

throw : 메소드 내에서 예외를 발생시키는데 사용됨 

 

throws : 메소드 선언부에서 사용되며, 해당 메소드가 처리하지 않은 예외를 호출자에게 전달한다는 의미를 내포

 

 

예외 트랜잭션 처리 방법

 

트랜잭션 이란 하나의 작업 단위를 뜻

 

- 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위! 

 

은행의 송금 기능을 예로 들었을 때 

 

 

a계좌 에서 돈이 빠져나가는것과  

b계좌에서 돈이 입금 되는것 이 두가지 작업이 성공해야 하나의 작업이 성공한다고 보면된다! 

 

 

2가지의 일을 하나의 작업이라고 보면되겠군!!!!

 

 

그런데 이런 하나의 작업에서 

 

 

한가지라도 실패하면?

 

 

큰일쓰 !!!!!!! 데이터 정합성 뚝뚞뚝뚜뚜뚜뚜 떨어지고 

 

다시 처음으로 돌리는 즉 취소하는 행위를  롤백(rollback)이라고 한다.

 

 

즉 트랜잭션은 하나의 작업을 수행하는 작업단위이고!

그 작업 과정 중 한가지라도 실패할 경우 처음으로 되돌아가는 것은 롤백! 

그럼 전체 작업이 성공하거나 한가지라도 실패해서 돌아가는 롤백이 존재한다.!

 

 

 

예시로 기억해두고 나중에 면접때 써먹장 ㅎㅎㅎㅎㅎㅎㅎ

 

 

public static void main(String[] args) {
    Account sender = new Account(); //송금인 계좌
    Account receiver = new Account();

    long beforeBalance = sender.getBalance();
    try {
        sender.deposit(2000);//수금인 계좌
        throw new XXXException("에러 수동 발생");
        receiver.deposit(70000);//송금인 계좌.withdraw()
    }catch (XXXException e){
        //에러발생! 모두 취소
        sender.deposit(beforeBalance);
    }catch (BalanceInsufficientException e){
        System.out.println("출금하려는 잔액 부족. 프로그램 종료.");

    }
}

 

음.. 송금 출금 두가지 과정 중 하나가 실패했을 때 되돌리는 롤백에 대해서 

 

코드를 작성하는 시간도 가졌는데용!

 

생각보다 개념은 쉬워서 잘 작성할 줄알았는데 

 

손이 멈춰버렷습니닼ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 뇌정지 살짝왔구요

 

역시,, 막상 코드를 작성할땐 머엉 해지더라구요 ㅠㅠㅠㅋㅋㅋ

 

강사님과 코드작성해보다가! 어떤분이 실행전 데이터를 저장해뒀다가 롤백 시 돌리는 식으로 했길래

 

우와,,,, 놀랍더라구요 ㄷㄷㄷㄷㄷ 그런방법이,,,!!!

 

아직 부족하다는걸 느끼는 계기가 됏어요 ㅠㅠㅋㅋㅋㅋㅎㅎ

 

 

이 부분은 나중에 뒤에가서 더 자세히 배운다니 트랜잭션의 개념만 잘 이해하고 넘어가기로 했어요!!!! ㅎㅎㅎ 

 

 

이렇게 오늘 예외처리와 트랜잭션에 대해 배웠는데용 !!!

 

 

역시 아직은 인터페이스가 베스트 1위인거같아요 

 

이해못하는 베스트 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ큐ㅠㅠㅠㅠㅠ 

 

 

그래두 멘토님분들 중 한분께서 설연휴에 한번 클래스부터

 

보강해주신다고 하시니 꼭 참여해서 복습해야할 거 같아요 ㅠㅠ 

 

 

이렇게 오늘의 공부 완료했구용!!!!

 

 

내일도 파이팅 합시다 !!!!!!!

 

 

 

+ 오늘 저녁에 개인사정으로 sql는 할 수 있을지 모르겠네요 ㅠㅠㅠ흐엉 

최대한 할 수 있도록 노력하자!!!!