2021. 4. 29. 22:51ㆍWEB Dev./Spring Boot 입문
4. 회원 서비스 개발
회원 리포지토리와 도메인을 활용해서 실제 비즈니스 로직을 작성해보자
1) 서비스 패키지와 MemberService 클래스 생생
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import java.util.List;
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
/**
* 회원 가입
*/
public Long join(Member member) {
validateDuplicateMember(member); // 중복 회원 검증
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
// 같은 이름이 있는 중복 회원 X
// 이때 값은 optional이다.
// ifPresent = "찾으려는 값이 있으면" -> Optional에서만 사용할 수 있다.
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다.");
}); // 만약 값이 있으면 이름이 존재하는 것이다.
}
/**
* 전체 회원 조회
*/
public List<Member> findMembers() {
return memberRepository.findAll();
}
/**
* 특정 회원 조회
*/
public Optional<Member> findOne(Long memberId) {
return memberRepository.findById(memberId);
}
}
MemberRepository 변수 = new MemoryMemberRepository();로 선언한 이유?
1) MemberRepository 인터페이스의 제약을 따르겠다는 의도
2) 사용하는 코드가 MemberRepository 인터페이스 제약을 따르기 때문에 향후 변경시 사용코드를 변경하지 않아도 된다.
3) MemoryMemberRepository을 다른 클래스로 변경이 필요하면 선언하는 코드만 변경하면 된다. 사용하는 코드를 고민하지 않아도 된다.
4) 다른 개발자들이 이 코드를 나중에 더 성능이 좋거나 동시성 처리가 가능한 종류의 구체적인 MemberRepository으로 변경해야 할 때 MemoryMemberRepository 변수 = new MemoryMemberRepository()으로 선언이 되어 있다면, 변경 시점에 상당히 고민해야 하지만, MemberRepository 변수 = new MemoryMemberRepository()으로 선언이 되어 있다면 편안하게 선언부를 변경할 수 있다.
개인적인 궁금증..
비즈니스 로직이 필요한 경우는 Service를 통해 데이터를 가공하는 것은 이해가 됐다. 하지만 기능이 비슷한 경우도 Repository의 메소드를 컨트롤러에서 직접 이용하지 않고 왜 Service를 거쳐야 하는지 의문이 생겼다.
추후 이 궁금증을 해결해봐야겠다.
'WEB Dev. > Spring Boot 입문' 카테고리의 다른 글
4. SpringBoot 입문 - Spring Bean과 의존관계(1) - 컴포넌트 스캔과 자동 의존관계 설정 (0) | 2021.05.24 |
---|---|
3. SpringBoot 입문 - 회원 관리 예제 백엔드 개발(5) - 회원 서비스 테스트 (0) | 2021.04.29 |
3. SpringBoot 입문 - 회원 관리 예제 백엔드 개발(3) - 회원 리포지토리 테스트 케이스 작성 (0) | 2021.04.29 |
3. SpringBoot 입문 - 회원 관리 예제 백엔드 개발(2) - 회원 도메인과 리포지토리 만들기 (0) | 2021.04.29 |
3. SpringBoot 입문 - 회원 관리 예제 백엔드 개발(1) - 비즈니스 요구사항 정리 (0) | 2021.03.14 |