[SpringBoot] Service 계층 이란?
카테고리: SpringBoot
태그: Spring Boot Java
SpringBoot의 Service 계층
Spring boot의 Service 계층은 실제 사용자가 웹과 상호작용 하면서 제공하는 서비스들, 즉 실질적인 비지니스 로직을 정의하는 계층 입니다. 여기서는 사용자의 입력을 바탕으로 데이터를 변경하거나 보여주는 작업을 하게 됩니다. 데이터베이스에 접근하여 데이터를 조작하는 계층은 Repository 계층이었으므로, 당연하게도 Service 에는 Repository 계층의 의존성이 있습니다.
서비스계층을 만드는 방법은 클래스 위에 @Service라는 어노테이션을 다는 것입니다. 이렇게 하면 제어 역전의 원칙에 따라서 스프링 프레임워크가 컴포넌트 스캔을 하게 되고, 해당 java 클래스를 Service 로 등록하게 됩니다. 그리고, 데이터를 조작할 때, @Transactional이라는 어노테이션을 달아서, 트랜젝션을 열어줍니다.
@Service
@Transactional // Jpa의 모든 데이터 변경이나 로직들은 가급적이면 Transaction 안에서 수행되어야 함. 그리고 패키지는 spring꺼 쓰자
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
}
이렇게 하고, 이제 실질적인 비지니스 로직을 구현합니다. 추상화된 기능으로는 join(), findMembers(), findOne()이 있다고 가정 합니다.
검증하는 절차를 거친 후, Repository에 접근하여 데이터를 처리하는 과정을 거칩니다.
@Service
@Transactional // Jpa의 모든 데이터 변경이나 로직들은 가급적이면 Transaction 안에서 수행되어야 함. 그리고 패키지는 spring꺼 쓰자
@RequiredArgsConstructor
//참고 -> 실무에서는 검증 로직이 있더라도, 회원명 칼럼에 유니크 제약조건을 추가하는 것이 안전하다.
public class MemberService {
private final MemberRepository memberRepository;
/*
* 회원가입
*/
public Long join(Member member) {
validateDuplicatedMember(member);
memberRepository.save(member);
return member.getId();
}
// 회원 전체 조회
@Transactional(readOnly = true) // jpa가 조회하는 곳에서는 성능 이점이 있음
public List<Member> findMembers() {
return memberRepository.findAll();
}
public Member findOne(Long memberId) {
return memberRepository.findOne(memberId);
}
private void validateDuplicatedMember(Member member) {
// Exception
List<Member> findMembers = memberRepository.findByName(member.getName());
if (!findMembers.isEmpty()) {
throw new IllegalStateException("이미 존재하는 회원입니다.");
}
}
}
여기서 주의해야할 점은, 이메일같이 pk 가 아닌데 고유한 값들은 검증절차를 거쳐도, 멀티 스레드환경에서 제대로 동작하지 않을 우려가 있기 때문에, 아예 Unique 제약을 걸도록 합니다.
여기서 @Transactional의 설정값을 readonly = true라고 하면 JPA가 정보를 수정하지 않아도 된다는 정보를 가지고 Select를 하기 때문에 일기전용인 데이터에서 성능상 이점을 얻어갈 수 있습니다.
이렇게하면 서비스 계층의 구현이 완료됩니다. 이제 캡슐화된 함수들을 Controller에서 사용자가 상호작용 했을 때, 호출을 해줍니다.
댓글 남기기