-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[6주차](임주민, 양재승, 박준영) #6
Comments
4장 예외목표 : JdbcTemplate를 대표로 하는 스프링의 데이터 액세스 기능에 담겨있는 예외처리와 관련된 접근 방법 알아보고 예외 처리하는 베스트 프랙티스 살펴보기 - 예외 블랙홀
예외 발생했는데 아무것도 하지 않고 별문제 없는 것처럼 넘어가버림 - 예외 처리 핵심 원칙: 모든 예외는 적절하게 복구되어야 함 👉 예외를 무시하거나 잡아먹어 버리는 코드를 만들지 말자!
- 무의미하고 무책임한 throws예외를 상위 메소드로 던져버림 예외의 종류와 특징
- 자바에서 throw를 통해 발생시킬 수 있는 예외 3가지
예외처리 방법예외처리 일반적인 방법들과 효과적인 예외처리 전략 - 1) 예외 복구예외상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓음 - 2) 예외처리 회피예외처리를 자신이 담당 X, 자신을 호출한 쪽으로 던짐 (다른 오브젝트나 메소드가 예외를 대신 처리)
ex ) - 3) 예외 전환예외를 메소드 밖으로 던지는 것 사용 목적 1 ) ex ) 전환하는 예외에 원래 발생한 예외를 담아서
사용 목적 2 ) ex ) 예외 전환JDBC의 한계- 1) 비표준 SQL
<해결책> - 2) 호환성 없는 SQLException의 DB 에러정보JDBC는 데이터 처리 중 발생하는 다양한 예외를 그냥 SQLException에 모두 담아버림 DB 에러 코드 매핑을 통한 전환SQLException의 비표준 에러코드와 SQL 상태정보에 대한 해결책 스프링은 DB별로 에러 코드를 분류해서 스프링이 정의한 예외 클래스와 매핑해놓은 에러 코드 매핑정보 테이블을 만들어두고 이를 이용함 DAO 인터페이스와 구현의 분리- DAO를 굳이 따로 만들어서 사용하는 이유
사용기술과 구현 코드는 전략 패턴과 DI를 통해 DAO를 사용하는 클라이언트에게 감출 수 있지만, 메소드 선언에 나타나는 예외정보가 문제가 될 수 있음 - 데이터 액세스 예외 추상화와 DataAccessException 계층구조스프링은 자바의 Data Access 기술을 사용할 때 발생하는 예외들을 추상화해서 DataAccessException 계층구조 안에 정리해놓음 DataAccessException 예외 추상화를 적용하면
|
chapter 5. 서비스 추상화
자바에서 메일을 발송할 때는, Java 표준인 JavaMail을 사용하면 된다. private void sendUpgradeEmail(User user) {
Properties props = new Properties();
props.put("mail.smtp.host", "mail.ksug.org");
Session s = Session.getInstance(props, null);
MimeMessage message = new MimeMessage(s);
try {
message.setFrom(new InternetAddress("[email protected]"));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));
message.setSubject("Upgrade 안내");
message.setText("사용자님의 등급이" + user.getLevel().name()
+ "로 업그레이드 되었습니다.");
} catch (AddressException e) {
throw new RuntimeException(e);
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
// 한글 encoding 설정이 생략되어 있는 코드입니다. SMTP 프로토콜을 지원하는 메일 서버가 있다면, 안내 메일은 잘 작동될 것이다. JavaMail을 이용한 테스트의 문제점테스트를 서버에 부하를 가하지 않고도 예외없이 실행할 수 있도록 JavaMail과 같은 인터페이스를 갖는 오브젝트를 만들면 될 것 같지만, Session 오브젝트를 만들어야 메일 메세지를 생성할 수 있고, 전송할 수 있다.,
테스트와 서비스 추상화일반적으로 추상화는 수행하는 기능은 같지만 로우레벨의 구현이 다른 트렌잭션이나 다양한 기술에 대해 일관적인 사용법을 제공하기 위한 접근 방법을 의미하지만, 이렇게 테스트에 도움이 안되도록 작성한 API를 테스트할 때도 유용하게 쓸 수 있다. !https://blog.kakaocdn.net/dn/bIWCKR/btrfXHdJ9IJ/1Joh6eC26UFEgC5YiixoX1/img.png 스프링이 제공하는 MailSender를 구현한 추상화 클래스를 이용하면, JavaMail이 아닌 다른 메세징 서버 API를 이용하고자 할 때도 MailSender를 구현한 클래스를 만들어 DI해주면 끝이다. UserService는 그냥 MailSender 인터페이스를 통해 메일을 보낸다는 사실만 알면 되지 구체적인 구현은 알 방법이 없으며, MailSender 구체 클래스가 바뀌더라도 DI만 새로 해주면 끝이니 엄청 편리하다. 만약 DB의 트랜젝션 개념을 메일에 적용한다면?
테스트 대역DummyMailSender는 하는 것이 없다. 테스트를 편히 하기 위해 작성했다. 테스트 때 발송용 메서드를 제거했다가 테스트 끝나고 추가하는 것은 불가능한 일이다. 그 대신DummyMailSender를 주입함으로써 간단하게 해결했다. 우리가 테스트하고자 하는 것은 UserService였는데, 이 UserService도 여러 객체에 의존하고 있다. MailSender 구현 클래스와 같은 것들을 말한다. 테스트 환경에서 테스트 대상이 되는 오브젝트의 기능을 충실하게 수행하면서 테스트를 자주 실행할 수 있도록 하는 오브젝트들을 테스트 대역(test double)이라고 한다. MockDummyMailSender는 호출이 되던 되지않던 상관없다. 테스트에 큰 영향을 끼치지 않는다. 테스트는 일반적으로 인풋에 따른 아웃풋을 검증한다. 그러나 테스트 대상 오브젝트가 의존 오브젝트에 넘기는 값과 행위를 검증하고 싶다면, 목 오브젝트(mock object)를 사용해야 한다. 이 목 오브젝트는 테스트 대상이 되는 오브젝트와 목 오브젝트에서 일어나는 커뮤니케이션을 추후 검증에 사용할 수 있도록 저장한다. 인풋과 아웃풋이 될 수도 있고, 얼마나 자주 커뮤니케이션이 일어나는지 통계적인 수치가 될 수도 있다. |
The text was updated successfully, but these errors were encountered: