본문 바로가기
Spring/03. Service

01. Service 개발

by 989898 2025. 2. 14.

Service 개발 핵심 요약 🛠️✨

1. Service Layer의 역할

서비스 계층은 애플리케이션의 비즈니스 로직을 처리하며, 다음과 같은 이유로 중요합니다:

  • 비즈니스 로직 분리: 컨트롤러와 데이터베이스 계층의 의존성을 줄여 코드의 유지보수를 용이하게 합니다.
  • 트랜잭션 관리: 여러 데이터 작업 간 일관성을 보장하며, 실패 시 롤백 처리 가능합니다.
  • 중복 코드 최소화: 공통 로직을 서비스 계층에서 처리하여 코드 중복을 줄입니다.
  • 테스트 용이성: 독립적인 테스트가 가능해 애플리케이션의 안정성을 높입니다.
  • 권한 및 보안 관리: 권한 검증 및 보안 로직을 일관되게 유지합니다.

2. MemberServiceImpl 주요 기능

MemberServiceImpl은 회원과 관련된 주요 비즈니스 로직을 처리합니다.

1) 회원 가입 (registerMember)

  • 주요 로직:
    1. 이메일 및 모바일 번호 중복 체크.
    2. 비밀번호 암호화 후 회원 등록.
    3. 등록된 회원 정보를 반환.
@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)

  • 주요 로직:
    1. 회원 존재 여부 및 탈퇴 여부 체크.
    2. 이메일/모바일 번호 변경 시 중복 여부 확인.
    3. 수정된 정보를 저장하고 반환.
@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)

  • 주요 로직:
    1. 회원 존재 여부 및 탈퇴 여부 체크.
    2. 탈퇴일자를 업데이트.
@Override
public void withdrawalMember(long mbNo) {
    checkMemberExists(mbNo);
    checkWithdrawal(mbNo);
    memberRepository.updateWithdrawalAt(mbNo, LocalDateTime.now());
}
 

4) 비밀번호 변경 (changePassword)

  • 주요 로직:
    1. 기존 비밀번호 검증.
    2. 새로운 비밀번호 암호화 후 업데이트.
@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)

  • 주요 로직:
    1. 이메일로 회원 조회.
    2. 입력된 비밀번호와 저장된 비밀번호 검증.
    3. 로그인 성공 시 회원 정보 반환.

@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