본문 바로가기

Spring/토비의 스프링 3.1

5.3 서비스 추상화와 단일 책임 원칙 5.3.1 서비스 추상화와 단일 책임 원칙 수직, 수평 계층구조와 의존관계 수평적 분리 UserDao와 UserService의 분리 각각 담당하는 코드의 기능적인 관심에 따라 분리 서로 불필요한 영향을 주지 않으며 독자적으로 확장이 가능 같은 애플리케이션 로직을 담은 코드지만 내용에 따라 분리 수직적 분리 트랜잭션 추상화 비지니스 로직과 로우레벨의 트랜잭션 기술이라는 아예 다른 계층의 특성을 갖는 코드 사용자 관리 모듈의 의존관계 애플리케이션 계층 : UserService, UserDao 애플리케이션의 로직 인터페이스와 DI를 통해 결합도를 낮춤 UserDao는 DB 연결을 생성하는 방법에 대해 독립적 DataSource 인터페이스와 DI를 통해 추상화된 방식으로 로우레벨의 DB 연결 기술을 사용 Use..
5.2 트랜잭션 서비스 추상화 정기 사용자 레벨 관리 작업을 수행하는 도중에 네트워크가 끊기거나 서버에 장애가 생겨서 작업을 완료할 수 없다면, 그 때까지 변경된 사용자의 레벨은? 작업이 도중에 중단된다면 그때까지 진행된 변경 작업도 모두 취소시키도록 결정 5.2.1 모 아니면 도 현재의 상태는? 테스트를 통해 확인 시스템 예외상황을 인위적으로 만드는 것은 거의 불가능할 뿐더러 자동화된 테스트가 불가능하므로 좋지 않음 예외 상황을 의도적으로 만들어 테스트 테스트용 UserService의 대역 테스트용으로 특별히 만든 UserService의 대역을 사용하는 방법이 좋음 테스트를 위해 소스코드를 함부로 건드리는 것은 좋지 않음 UserService를 상속해서 일부 메소드를 오버라이딩 테스트에서만 사용할 클래스의 경우 클래스 내부에 스태틱..
5.1 사용자 레벨 관리 기능 추가 사용자의 활동 내역을 참고해 레벨을 조정해주는 기능 추가 사용자의 레벨 : BASIC, SILVER, GOLD 처음 가입할 경우 : BASIC 가입 후 50회 이상의 로그인 : SILVER SILVER + 30회 이상의 추천 : GOLD 레벨은 일정한 주기를 가지고 일괄적으로 변경됨 5.1.1 필드 추가 Lvl 이늄 DB에서 varchar로 관리하는 것보다 숫자로 관리하는 것이 좋음 User의 프로퍼티 타입 숫자로 할 경우, 타입의 안정성이 보장되지 않아 위험할 수 있음 BASIC(1), SILVER(2), GOLD(3) 일 때 1,2,3 외의 숫자를 넣어도 컴파일 에러가 나지 않음 이늄(enum)을 사용하는 것이 안전하고 편리함 Oracle에서는 Level을 필드명으로 사용이 불가능하므로 Level을 ..
5장. 서비스 추상화 개요 사용 방법과 형식은 다르지만 기능과 목적이 유사한 기술을 추상화하고, 일관된 방법으로 사용할 수 있도록 지원 목차 5.1 사용자 레벨 관리 기능 추가 5.1.1 필드 추가 Level 이늄 User 필드 추가 UserDaoTest 테스트 수정 UserDaoJdbc 수정 5.1.2 사용자 수정 기능 추가 수정 기능 테스트 추가 UserDao와 UserDaoJdbc 수정 수정 테스트 보완 5.1.3 UserService.upgradeLevels() UserService 클래스와 빈 등록 UserServiceTest 테스트 클래스 upgradeLevels() 메소드 upgradeLevels() 테스트 5.1.4 UserService.add() 5.1.5 코드 개선 upgradeLevels() 메소드 코드의..
4.3 정리 예외를 잡아서 아무러 조치를 하지 않거나 의미 없는 throws 선언을 남발하는 것은 무책임하다. 예외는 복구하거나 예외처리 오브젝트로 의도적으로 전달하거나 적절한 예외로 전환해야 한다. 좀 더 의미있는 예외로 변경하거나, 불필요한 예외 처리를 피하기 위해 런타임 예외로 포장하는 두 가지의 방법의 예외 전환이 있다. 복구할 수 없는 예외는 가능한 빨리 런타임 예외로 전환하는 것이 바람직하다. 애플리케이션의 로직을 담기 위한 예외는 체크 예외로 만든다. JDBC의 SQLException은 대부분 복구할 수 없는 예외이므로 런타임 예외로 포장해야 한다. SQLException의 에러 코드는 DB에 종속되기 때문에 DB에 독립적인 예외로 전환될 필요가 있다. 스프링은 DataAccessException을 통해..
4.1 사라진 SQLException 3장에서 JdbcTemplate을 적용할 때 SQLException이 사라졌다. SQLException은 JDBC API의 메소들이 던지는 것이므로 당연히 있어야 한다. 어디로 간 것인가 4.1.1 초난감 예외처리 예외 블랙홀 초난감 예외처리 예 /* * Example 1 */ try { // do something } catch(SQLException e) { } /* * Example 2 */ try { // do something } catch(SQLException e) { System.out.println(e); } /* * Example 3 */ try { // do something } catch(SQLException e) { e.printStackTrace(); } 예외를 잡고 아무것도 ..
4장. 예외 개요 자바 개발자가 신경쓰기 가장 귀찮아하는 것 중 하나 목차 4.1 사라진 SQLEXCEPTION 4.1.1 초난감 예외처리 예외 블랙홀 무의미하고 무책임한 throws 4.1.2 예외의 종류와 특징 4.1.3 예외처리 방법 예외 복구 예외처리 회피 예외 전환 4.1.4 예외처리 전략 런타임 예외의 보편화 add() 메소드의 예외처리 애플리케이션 예외 4.1.5 SQLException은 어떻게 됐나? 4.2 예외 전환 4.2.1 JDBC의 한계 비표준 SQL 호환성 없는 SQLException의 DB 에러정보 4.2.2 DB 에러 코드 매핑을 통한 전환 4.2.3 DAO 인터페이스와 DataAccessException 계층구조 DAO 인터페이스와 구현의 분리 데이터 액세스 예외 추상화와 DataAcce..
3.7 정리 JDBC와 같이 예외가 발생할 가능성이 있으며, 공유 리소스의 반환이 필요한 코드는 반드시 예외처리를 해주어야 한다. 일정한 작업 흐름이 반복되면서 그 중 일부 기능만 바뀌는 코드가 존재한다면 전략 패턴을 적용한다. 컨텍스트 : 바뀌지 않는 부분 전략 : 바뀌는 부분, 인터페이스를 통해 유연하게 변경할 수 있도록 구성 같은 애플리케이션 내에서 여러 가지 종류의 전략을 다이내믹하게 구성하고 사용해야 한다면, 컨텍스트를 이용하는 클라이언트 메소드에서 직접 전략을 정의하고 제공하게 만든다. 익명 내부 클래스를 이용하면 코드도 간결해지고 메소드의 정보를 직접 사용할 수 있어서 편리하다. 컨텍스트가 하나 이상의 클라이언트 오브젝트에서 사용된다면 클래스를 분리해서 공유하도록 만든다. 컨텍스트는 별도의 빈으로 등록해..