170 likes | 389 Views
고급자바프로그래밍 (Advanced Java Programming). 강원대학교 컴퓨터학부 2012 년 가을학기 담당교수 정충교. 4 장 예외처리. 4.1.1 초난감 예외처리. 예외 블랙홀 리스트 4-1, 4-2, 4-3 리스트 4-4 예외를 무시하거나 잡아먹어버리는 코드 예외를 잡아서 아무것도 할 수 없으면 잡지 말고 위로 패스해야함 무의미하고 무책임한 throws Exception. 4.1.2 예외의 종류와 특징. Error Exception 과 체크예외
E N D
고급자바프로그래밍(Advanced Java Programming) 강원대학교컴퓨터학부 2012년 가을학기 담당교수정충교
4.1.1 초난감 예외처리 • 예외 블랙홀 • 리스트 4-1, 4-2, 4-3 • 리스트 4-4 예외를 무시하거나 잡아먹어버리는 코드 예외를 잡아서 아무것도 할 수 없으면 잡지 말고 위로 패스해야함 • 무의미하고 무책임한 throws Exception
4.1.2 예외의종류와 특징 • Error • Exception과 체크예외 • RuntimeException – 언체크예외
4.1.3 예외처리 방법 • 예외복구 • 예외처리 회피 • 예외전환 -- 중첩예외 • 의미를 명확히 해 주는 예외로 전환 • 체크예외를 런타임예외로 전환 (애플리케이션에서 처리할 수 없는 예외의 경우) – 불필요한 catch, throws를 줄여줌
4.1.4 예외처리 전략 • 런타임예외의 보편화 • Add 메소드 • 리스트 4-9 • DuplicatedUserIdException • 런타임예외로 하되 throws 선언하여 “알려줌” • 리스트 4-13 • SqlException • 리스트 4-14 • 애플리케이션 예외 • 애플리케이션 로직에 의해 의도적으로 만들어진 예외 ( 외부 원인에 의해 발생한 예외) • 애플리케이션 내에서 반드시 처리하도록 체크예외로 만듬 • 리스트 4-15
4.1.5 SQLException • 의미를 명확히 해 주는 예외로 전환 • 체크예외를 런타임예외로 전환 (애플리케이션에서 처리할 수 없는 예외의 경우) – 불필요한 catch, throws를 줄여줌
4.1.5 SQLException • 의미를 명확히 해 주는 예외로 전환 • 체크예외를 런타임예외로 전환 (애플리케이션에서 처리할 수 없는 예외의 경우) – 불필요한 catch, throws를 줄여줌
4.2 예외전환 • JdbcTemplate과 콜백은 발생하는 SQLException을 런타임 예외인 DataAccessException으로 포장해서 던져줌 • 스프링 API의 대부분의 예외는 런타임 예외임
4.2.1 JDBC의 한계 • 비표준SQL • 호환성 없는 SQLException의 DB 에러 정보 • e.getErrorCode() – DB벤더 고유코드 • e.getSQLState() – Open Group지 정한 표준상태코드
4.2.2 DB에러코드 매핑을 통한 전환 • 비표준SQL • 호환성 없는 SQLException의 DB 에러 정보 • e.getErrorCode() – DB벤더 고유코드 • JdbcTemplate은 DB벤더별 에러코드에 따라 적절한 DataAccessException의 서브클래스 객체를 발생시킴 • 리스트 4-17 • 그럼에도 불구하고 사용자 정의 예외를 발생시키고 싶은 경우 – 리스트 4-18 • e.getSQLState() – Open Group지 정한 표준상태코드
4.2.3 DAO 인터페이스와 DataAccess Exception 계층구조 • DAO 인터페이스와 구현의 분리 • DAO가 Jdbc뿐 아니라 JPA, Hibernate, JDO를 사용하는 경우를 고려하여 DAO를 인터페이스로 선언 예외던짐 선언 없음 SQLException을 체크 예외로 전환하여 던짐 체크 예외를 던지지 않음
4.2.3 DAO 인터페이스와 DataAccess Exception 계층구조 데이터 엑세스 예외 추상화와 DataAccessException계층구조 그림 4-3 DataAccessException계층 구조
4.2.4 기술에 독립적인 UserDao만들기 • 인터페이스 적용 • 리스트 4-20 UserDao인터페이스 • 리스트 4-21
public class UserDaoJdbc implements UserDao { public void setDataSource(DataSourcedataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } private JdbcTemplatejdbcTemplate; private RowMapper<User> userMapper = new RowMapper<User>() { public User mapRow(ResultSetrs, introwNum) throws SQLException { ... } }; public void add(final User user) { this.jdbcTemplate.update("insert into users(id, name, password) values(?,?,?)", user.getId(), user.getName(), user.getPassword()); } public User get(String id) { ... } public void deleteAll() { ... } public intgetCount() {... } public List<User> getAll() {... } }
4.2.4 기술에 독립적인 UserDao만들기 • 테스트 보완 • 테스트가 성공하도록 하는 경우 - 리스트 4-22 • 테스트가 실패하도록 하는 경우 – 어떤 예외가 발생했는지 확인 가능 • DataAccessException활용시 주의 사항 • JPA, Hibernate, JDO 등에서 JDBC와 똑같은 예외전환이 일어나는지 확인해 봐야 함