Service 개발 핵심 요약 🛠️✨
1. Service Layer의 역할
서비스 계층은 애플리케이션의 비즈니스 로직을 처리하며, 다음과 같은 이유로 중요합니다:
- 비즈니스 로직 분리: 컨트롤러와 데이터베이스 계층의 의존성을 줄여 코드의 유지보수를 용이하게 합니다.
- 트랜잭션 관리: 여러 데이터 작업 간 일관성을 보장하며, 실패 시 롤백 처리 가능합니다.
- 중복 코드 최소화: 공통 로직을 서비스 계층에서 처리하여 코드 중복을 줄입니다.
- 테스트 용이성: 독립적인 테스트가 가능해 애플리케이션의 안정성을 높입니다.
- 권한 및 보안 관리: 권한 검증 및 보안 로직을 일관되게 유지합니다.
2. MemberServiceImpl 주요 기능
MemberServiceImpl은 회원과 관련된 주요 비즈니스 로직을 처리합니다.
1) 회원 가입 (registerMember)
- 주요 로직:
- 이메일 및 모바일 번호 중복 체크.
- 비밀번호 암호화 후 회원 등록.
- 등록된 회원 정보를 반환.
@Override
public MemberResponse registerMember(MemberRegisterRequest memberRegisterRequest) {
checkEmailDuplicate(memberRegisterRequest.getMbEmail());
checkMobileDuplicate(memberRegisterRequest.getMbMobile());
String mbPassword = passwordEncoder.encode(memberRegisterRequest.getMbPassword());
Member member = Member.ofNewMember(
memberRegisterRequest.getMbEmail(),
memberRegisterRequest.getMbName(),
mbPassword,
memberRegisterRequest.getMbMobile()
);
memberRepository.save(member);
return getMember(member.getMbNo());
}
2) 회원 정보 수정 (updateMember)
- 주요 로직:
- 회원 존재 여부 및 탈퇴 여부 체크.
- 이메일/모바일 번호 변경 시 중복 여부 확인.
- 수정된 정보를 저장하고 반환.
@Override
public MemberResponse updateMember(MemberUpdateRequest memberUpdateRequest) {
checkWithdrawal(memberUpdateRequest.getMbNo());
checkMemberExists(memberUpdateRequest.getMbNo());
Optional<Member> memberOptional = memberRepository.findByMbNo(memberUpdateRequest.getMbNo());
Member member = memberOptional.get();
if (!member.getMbEmail().equals(memberUpdateRequest.getMbEmail())) {
checkEmailDuplicate(memberUpdateRequest.getMbEmail());
}
if (!member.getMbMobile().equals(memberUpdateRequest.getMbMobile())) {
checkMobileDuplicate(memberUpdateRequest.getMbMobile());
}
memberRepository.update(memberUpdateRequest);
return getMember(member.getMbNo());
}
3) 회원 탈퇴 (withdrawalMember)
- 주요 로직:
- 회원 존재 여부 및 탈퇴 여부 체크.
- 탈퇴일자를 업데이트.
@Override
public void withdrawalMember(long mbNo) {
checkMemberExists(mbNo);
checkWithdrawal(mbNo);
memberRepository.updateWithdrawalAt(mbNo, LocalDateTime.now());
}
4) 비밀번호 변경 (changePassword)
- 주요 로직:
- 기존 비밀번호 검증.
- 새로운 비밀번호 암호화 후 업데이트.
@Override
public void changePassword(MemberPasswordUpdateRequest memberPasswordUpdateRequest) {
checkMemberExists(memberPasswordUpdateRequest.getMbNo());
Optional<Member> memberOptional = memberRepository.findByMbNo(memberPasswordUpdateRequest.getMbNo());
Member member = memberOptional.get();
if (!passwordEncoder.matches(memberPasswordUpdateRequest.getOldPassword(), member.getMbPassword())) {
throw new BadRequestException("Password does not match");
}
String newPassword = passwordEncoder.encode(memberPasswordUpdateRequest.getNewPassword());
memberRepository.updatePassword(memberPasswordUpdateRequest.getMbNo(), newPassword);
}
5) 로그인 (doLogin)
- 주요 로직:
- 이메일로 회원 조회.
- 입력된 비밀번호와 저장된 비밀번호 검증.
- 로그인 성공 시 회원 정보 반환.
@Override
public LoginMember doLogin(LoginRequest loginRequest) {
Optional<Member> memberOptional = memberRepository.findByMbEmail(loginRequest.getEmail());
if (memberOptional.isEmpty()) {
throw new UnauthorizedException("Login failed");
}
boolean isPasswordMatch = passwordEncoder.matches(loginRequest.getPassword(), memberOptional.get().getMbPassword());
if (!isPasswordMatch) {
throw new UnauthorizedException("Login failed");
}
return new LoginMember(
memberOptional.get().getMbNo(),
memberOptional.get().getMbEmail(),
memberOptional.get().getMbName()
);
}
서비스 계층의 장점 요약
- 코드 재사용성 증가.
- 비즈니스 로직의 독립성 강화.
- 유지보수와 확장 용이성 향상.
위 내용은 서비스 계층의 핵심 기능과 구현 방법을 간결하게 정리한 것입니다! 😊✨ 추가적인 질문이 있다면 언제든 물어보세요~! 💕
'Spring > 03. Service' 카테고리의 다른 글
| 02. Service Test (0) | 2025.02.16 |
|---|