본문 바로가기

서비스추상화

5.5 정리 비즈니스 로직을 담은 UserService 클래스를 만들고, 트랜잭션을 적용하면서 스프링의 서비스 추상화에 대해 알아보았다. 비즈니스 로직을 담은 코드는 데이터 액세스 로직을 담은 코드 분리되어야 한다. DAO의 기술 변화에 서비스 계층의 코드가 영향을 받지 않도록 인터페이스 DI를 활용하여 결합도를 낮추어야 한다. DAO에는 트랜잭션이 필요하다. 트랜잭션의 시작과 종료 지점을 지정하는 것은 트랜잭션 경계설정이라고 한다. 스프링이 제공하는 트랜잭션 동기화 기법을 활용하면 편리하게 트랜잭션을 사용할 수 있다. 트랜잭션 API의 종류와 방법은 다양하므로, 트랜잭션이 변경되면 경계설정 코드도 함께 변경되어야 한다. 이는 단일 책임 원칙에 위배되며, DAO가 사용하는 특정 기술에 대해 강한 결합을 만들어낸다. ..
5.4 메일 서비스 추상화 요구사항 : 레벨이 업그레이드 되는 사용자에게 안내 메일 발송 기능 추가 5.4.1 JavaMail을 이용한 메일 발송 기능 사용자의 이메일 정보를 관리해야함 DB에 email 필드 추가 User 클래스에 email 프로퍼티 추가 UserDao의 UserMapper와 insert(), update()에 email 필드 처리 UserDaoTest 수정 JavaMail 메일 발송 upgradeLvl()에서 메일 발송 메소드를 호출 public class UserService { protected void upgradeLvl(User user) { user.upgradeLvl(); userDao.update(user); sendUpgradeEmial(user); } private void sendUpgrade..
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() 메소드 코드의..