Project/Todo

[Refactoring] 관심사 분리를 통한 DIP 지키기

lakelight 2022. 7. 15. 23:37
728x90
반응형

원래 코드 

[기존 Member Service 코드 1]

 

[Spring Boot] Member 서비스 구현 (1)

domain/Member.java package hooyn.todo.domain; import lombok.*; import org.hibernate.annotations.GenericGenerator; import org.springframework.security.crypto.password.PasswordEncoder; import javax.pe..

lakelight.tistory.com

[기존 Member Service 코드 2]

 

[Spring Boot] Member 서비스 구현 (2)

비밀번호 제약 조건 확인 API [ MemberService.java ] /** * 비밀번호 제약조건 확인 */ public boolean checkPasswordConstraint(String userPW){ Pattern pattern = Pattern.compile("^(?=.*[a-zA-Z])(?=.*\\d)...

lakelight.tistory.com

 


리팩터링 후 코드


인터페이스를 만들어서 의존관계를 MemberRepository에 의존관계를 주입합니다.
그렇게 되면 MemberRepositoryImpl 내의 로직을 변경하여도 의존관계를 주입하는 부분에서 영향을 받지 않습니다.

또한 MemberRepository를 변경하고 싶다면 다른 구현체, 예를 들면 MemberRepositoryImplCustom을 만들어서 MemberRepositoryImpl을 대체할 수도 있습니다. 

[MemberRepository]

package hooyn.todo.repository;

import hooyn.todo.domain.Member;

import java.util.UUID;

public interface MemberRepository {

    //회원 정보 저장
    UUID save(Member member);

    //회원 엔티티 조회
    Member findOne(String uuid);

    //사용자 아이디에 따른 회원 조회
    Member findByUserId(String userID);
}

[MemberService]

package hooyn.todo.repository;

import com.querydsl.jpa.impl.JPAQueryFactory;
import hooyn.todo.domain.Member;
import hooyn.todo.domain.QMember;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import java.util.UUID;

@Repository
@RequiredArgsConstructor
@Primary //MemberRepository 의존관계 주입 시 우선권을 가진다.
public class MemberRepositoryImpl implements MemberRepository{

    private final EntityManager em;
    private final JPAQueryFactory queryFactory;

    /**
     * 회원 정보 -> 저장 이렇게 오버라이딩 해서 구현을 할 수 있습니다.
     */
    public UUID save(Member member){
        em.persist(member);
        return member.getUuid();
    }
    
    
}

 

[MemberService]

package hooyn.todo.service;

import hooyn.todo.domain.Member;

import java.util.UUID;

public interface MemberService {

    //회원가입
    UUID join(String userNM, String userID, String userPW);

    //UserID를 통한 회원(엔티티) 검색
    Member findUserByUserID(String userID);

    //UUID를 통한 회원(엔티티) 검색
    Member findUserByUUID(String uuid);

    //ID 중복확인
    boolean checkDuplicatedID(String userID);

    //비밀번호 제약조건 확인
    boolean checkPasswordConstraint(String userPW);

    //비밀번호 변경
    UUID changePassword(String uuid, String userPW);
}

[MemberServiceImpl]

package hooyn.todo.service;

import hooyn.todo.domain.Member;
import hooyn.todo.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Primary;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.UUID;
import java.util.regex.Pattern;

@Service
@RequiredArgsConstructor
@Primary //MemberService 의존관계 주입 시 우선권을 가진다.
public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository;
    private final PasswordEncoder passwordEncoder;

    /**
     * 회원 가입
     */
    @Transactional
    public UUID join(String userNM, String userID, String userPW){
        Member member = new Member(userNM, userID, userPW);
        member.encodePassword(passwordEncoder);
        return memberRepository.save(member);
    }
    
    // 다른 코드들도 오버라이딩 하여 구현
}

 

결론

이렇게 마무리 하면서 관심사 분리를 통하여 DIP 원칙을 지키는 코드로 변경해 보았습니다.
더 자세한 코드를 원하신다면 아래 링크를 참조해주세요. 감사합니다.

 

팀프로젝트 : Todo Code Github

 

GitHub - hooyn/Todo: [팀프로젝트] Todo App 서버 API

[팀프로젝트] Todo App 서버 API. Contribute to hooyn/Todo development by creating an account on GitHub.

github.com

 

728x90
반응형