DataAccessException과 예외 추상화댜앙한 데이터 엑세스 기술: JDBC, JDO, JPA, TopLink, ORM, iBatis 등DAO를 따로 만드는 이유는 데이터 엑세스 로직을 담은 코드를 성격이 다른 코드에서 분리해놓기 위해서다. 또한 전략 패턴을 적용해 구현 방법을 변경해서 사용할 수 있게 만들기 위해서이기도 하다. 그러나 클라이언트 입장에서는 DAO가 사용한 데이터 엑세스 기술에 따라 예외 처리 방법이 달라져야 한다.이 문제를 해결하기 위해 스프링은 DataAccessException 계층구조를 만들었다. DataAccessException은 자바의 주요 데이터 엑세스 기술에서 발생할 수 있는 대부분의 예외를 추상화하고 있다.
예외를 처리하는 일반적인 방법 예외 복구예외상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는 방법 예외처리 회피예외처리를 자신이 담당하지 않고 자신을 호출한 쪽으로 던져버리는 방법 예외 전환발생할 예외를 적절한 예외로 전환하여 던지는 방법목적1. 예외상황에 대에 의미를 분명하게 해줄 수 있는 예외로 바꿔주기 위해ex) SQLException -> DuplicateUserIdException이런 경우 중첩 예외로 만드는 것이 좋다목적2. 포장(wrap)하여 예외 처리를 쉽고 단순하게 만들기 위해중첩 예외를 이용해 새로운 예외를 만들고 원인이 되는 예외를 내부에 담아서 던지는 방식은 동일주로 예외처리를 강제하는 체크 예외를 언체크 에외인 런타임 예외로 바꾸는 경우 사용ex) SQLException -> ..
예외의 종류와 특징자바에서 throw를 통해 발생시킬 수 있는 예외는 크게 세 가지가 있다. Errorjava.lang.Error의 서브클래스들시스템 관련 에러주로 자바 VM에서 발생시키기 때문에 코드에서 잡을 수 없음 ex) OutOfMemoryError, ThreadDeath Exception과 체크 예외java.lang.Exception의 클래스와 서브클래스들크게 체크 예외와 언체크 예외로 구분됨체크 예외: RuntimeException 클래스를 상속하지 않은 Exception 서브 클래스체크 예외는 반드시 예외 처리 코드를 작성해야 함. 작성하지 않으면 컴파일 에러 발생(IOException, SQLException 등) RuntimeException과 언체크/런타임 예외언체크 예외: Runtim..
피해야 할 초난감 예외처리 코드 예외 블랙홀모든 예외는 처리돼야 한다. catch 블록을 이용해 에러 메시지를 출력한 것은 예외를 처리한 게 아니다.굳이 예외를 잡아서 뭔가 조치를 취할 방법이 없다면 잡지 말아야 한다. 메소드에 throws SQLException을 선언해서 메소드 밖으로 던지고 자신을 호출한 코드에 예외처리 책임을 전가해버려라. 무의미하고 무책임한 throws예외 이름을 정확하게 선언하지 않는 기계적인 throws Exception 처리
중첩 클래스(nested class)독립적인 오브젝트로 만들어질 수 있는 스태틱 클래스(static class)자신이 정의된 클래스의 오브젝트 안에서만 만들어질 수 있는 내부 클래스(inner class) 내부 클래스는 다시 범위(scope)에 따라 세 가지로 구분된다.오브젝트 레벨에 정의되는 멤버 내부 클래스(member inner class)메소드 레벨에 정의되는 로컬 클래스(local class)이름을 갖지 않는 익명 내부 클래스(anonymous inner class) 로컬 클래스특정 메소드에서만 사용되는 것이라면 로컬 클래스로 만들 수 있다. 익명 내부 클래스클래스 선언과 오브젝트 생성이 결합된 형태로 만들어지며, 상속한 클래스나 구현할 인터페이스를 생성자 대신 사용해서 다음과 같은 형태로 만들..
템플릿 메소드 패턴변하지 않는 부분은 슈퍼클래스에 두고 변하는 부분은 추상 메소드로 정의하여 서브클래스에서 오버라이드하여 새롭게 정의해 쓰도록 하는 패턴기존의 상위 DAO 클래스에 불필요한 변화는 생기지 않도록 할 수 있으나 DAO 로직마다 상속을 통해 새로운 클래스를 만들어야 하기 때문에 제한이 많다. 또한 상위 클래스와 서브클래스들의 관계가 컴파일 시점에 이미 결정되므로 관계의 유연성이 떨어진다.전략 패턴은 개방 폐쇄 원칙(OCP)를 잘 지키는 구조이면서도 템플릿 메소드 패턴보다 유연하고 확장성이 뛰어나다. 오브젝트를 아예 둘로 분리하고 클래스 레벨에서는 인터페이스에만 의존하기 때문이다.
리소스 반환과 close()Connection과 PreparedStatement는 보통 제한된 수의 리소스(Connection, Statement)를 만들어 두고 필요할 때 이를 할당하고, 반환하면 다시 풀에 넣는 방식으로 운영된다. 이는 요청이 많은 서버환경에서 매번 새로운 리소스를 생성하지 않고 풀에 미리 만들어둔 리소스를 돌려가며 사용할 수 있다는 장점이 있다. 단, 사용한 리소스는 빠르게 반환해야 한다. 이때 close() 메소드가 사용한 리소스를 풀로 다시 돌려주는 역할을 한다.
- Total
- Today
- Yesterday