강의6 - 강원대학교

Download Report

Transcript 강의6 - 강원대학교

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