이전 코드 개선 이전 코드 public void upgradeLevels() throws Exception{ // 트랜잭션 시작 TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { List users = userDao.getAll(); for (User user : users) { if (canUpgradeLevel(user)) { upgradeLevel(user); } } //정상적으로 작업을 마치면 트랜잭션 커밋 transactionManager.commit(status); } catch (Exception e) { //예외 발생시 롤백 transactionManage..
public class UserService { UserDao userDao; public UserService(UserDao userDao) { this.userDao = userDao; } public void upgradeLevels() { List users = userDao.getAll(); for (User user : users) { Boolean changed = null; if (user.getLevel() == Level.BASIC && user.getLogin() >= 50) { user.setLevel(Level.SILVER); changed = true; } else if (user.getLevel() == Level.SILVER && user.getRecommend() >= 30..
잘못된 예외처리 예외 블랙홀 예외를 잡고 아무 것도 하지 않는 경우 try{ //... } catch(SQLException e){ } 예외를 잡아서 출력만 하는 경우 무의미하고 무책임한 throws 메소드 선언부에 기계적으로 throws Exception 을 붙이는 경우 예외 종류와 특징 Error 시스템에 뭔가 비정상적인 상황이 발생했을 경우에 사용 e.g. OutOfMemoryError, ThreadDeath 어플리케이션 코드에서 잡아도 대응 방법이 없기 때문에 잡을 필요 없음 Checked Exception Exception 의 subclass 중 RuntimeException 을 상속하지 않은 클래스 이 예외가 발생할 수 있는 메소드를 사용할 경우 반드시 예외를 처리하는 코드를 함께 작성해야 함..
UserDao 리소스 반환 시 예외처리 public void deleteAll() throws SQLException { Connection c = null; PreparedStatement ps = null; try { c = dataSource.getConnection(); //변하는 부분 ps = c.prepareStatement("delete from users"); ps.executeUpdate(); } catch (SQLException e) { throw e; } finally { if (ps != null) { try { ps.close(); } catch (SQLException e) { } } if (c != null) { try { c.close(); } catch (SQLExcept..
작은 단위의 테스트가 필요한 이유 한꺼번에 너무 많은 것을 몰아서 테스트하면 테스트 수행 과정도 복잡해지고, 오류가 발생했을 때 정확한 원인을 찾기가 힘들어진다. (e.g. 웹화면을 이용한 테스트) 따라서 테스트는 가능하면 작은 단위로 쪼개서 집중해서 할 수 있어야 한다. 개발자가 설계하고 만든 코드가 원래 의도한 대로 동작하는지를 개발자 스스로 빨리 확인받기 위함. 다른 사람에 의해 테스트될 때보다 빠르게 오류 수정 가능. UserDaoTest 특징 자동 수행 테스트 코드 테스트할 데이터가 코드를 통해 제공되고, 테스트 작업도 코드를 통해 자동으로 실행됨. 개발자는 main 메소드를 실행하기만 하면 됨 점진적인 개발을 위한 테스트 기능 추가, 코드 개선할 때 이전 기능이 영향받지 않는지 확인 가능 Us..
public class UserDao { public void add(User user) throws ClassNotFoundException, SQLException { Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection( "jdbc:mysql://localhost/springbook", "spring", "book" ); PreparedStatement ps = connection.prepareStatement( "insert into users(id, name, password) values(?,?,?)" ); ps.setString(1, user.getId()); ps.setString..
제네릭 다양한 타입의 객체를 다루는 메서드나 클래스에 컴파일 시의 타입체크를 해주는 기능 컴파일러가 타입체크 해주기 때문에 type-safe한 프로그래밍 가능 e.g. List list = new ArrayList(); 로 선언하면 list에 integer가 들어가는 코드를 방지할 수 있음. 객체의 타입을 미리 명시해줌으로써 번거로운 형변환을 생략할 수 있음 제네릭 이전에는 다양한 종류의 타입을 다루는 메소드의 매개변수, 리턴타입으로 Object 타입의 참조변수를 사용한 뒤 형변환하는 방식을 활용. //제네릭 이전 class Box { Object item; void setItem(Object item) { this.item = item; } public Object getItem() { return i..
- Total
- Today
- Yesterday
- 서비스추상화
- 자바스터디
- 카카오
- 예외처리
- 코딩테스트
- 메서드레퍼런스
- 스프링
- 데코레이터패턴
- 객체지향
- 백기선
- 템플릿콜백
- 코테
- 프록시
- 토비의봄TV
- BOJ
- 프로그래머스
- SOLID
- OOP
- 토비의스프링
- ec2
- gracefulshutdown
- c++
- provider
- 디자인패턴
- 김영한
- 프록시패턴
- AOP
- 자바
- 토비
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |