프로젝트 리팩토링을 진행하였습니다!
미래의 나에게 큰 고통을 주면 안되기에....
편한 유지보수를 위해서, 가독성 높은 코드를 작성하기 위해서
MVP 개발이 완료된 지금 시점에서 리팩토링을 진행하는 것이 맞다고 생각하였다.
중복되는 코드를 리팩토링한 사례를 바탕으로 설명하자면,
우리 서비스는 모임이라는 그룹이 존재한다.
계정 자체의 권한은 JWT로 관리하여 @Secured 어노테이션으로 권한을 체크 하지만,
모임 유저의 권한 체크는 따로 로직을 구현해야 해서 아래와 같은 코드가 존재한다.
//권한을 체크 (feignClient)
if(!roleCheckClient.checkRole(organizationId,userTrackingId,roles).getData()){
log.info("권한 체크 결과는 {}", roleCheckClient.checkRole(organizationId,userTrackingId,roles).getMessage());
throw new BaseException(COMMENT_NOT_VALID_AUTH);
}
이 코드는 권한체크가 필요한 로직에 모두 존재한다.
그래서 반복적으로 코드가 존재 하게 되는데,
만약에 코드가 수정되면, 모든 코드를 수정해줘야 하는 불상사가 발생한다.
그래서 하나의 공통 객체로 빼고 그 객체를 사용하는 방식으로 리팩토링 했다.
중복되는 코드 분리
중복되는 코드는 아래와 같이 따로 클래스로 분리해서
필요한 로직마다 사용하였고,
코드 수정시 아래 코드만 수정하면 해당 클래스가 적용된 곳에 모두 반영된다.
@Component
@Slf4j
@RequiredArgsConstructor
public class UserCheckService {
public void roleCheck(RoleCheckClient roleCheckClient, String organizationId, String userTrackingId, List<OrganizationMemberRole> roles){
//권한을 체크 (feignClient)
if(!roleCheckClient.checkRole(organizationId,userTrackingId,roles).getData()){
log.info("권한 체크 결과는 {}", roleCheckClient.checkRole(organizationId,userTrackingId,roles).getMessage());
throw new BaseException(COMMENT_NOT_VALID_AUTH);
}
}
}
리팩토링 하면, 이렇게 코드를 작성하면 된다.
아래 코드만 추가하여 유효성 체크를 진행하면 된다.
public void createComment(CommentRequestDTO commentRequestDTO, CustomUserDetails customUserDetails){
//essential authorization to assign comment
List<OrganizationMemberRole> roles = List.of(MEMBER, MASTER, MANAGER);
//권한 체크 후, 아무 일도 없으면 권한 체크 통과
userCheckService.roleCheck(roleCheckClient, commentRequestDTO.getRoleCheckDTO().getOrganizationId(), customUserDetails.getTrackingId().toString(), roles);
}
그래서 얻는 결과는,
- DRY(Don't Repeat Yourself) 원칙 적용 : 중복될 가능성이 있는 권한 체크 로직을 한 곳으로 모아 코드 중복을 줄였다. 모든 서비스에서 모임의 권한 체크 로직은 필요하기 때문에 따로 서비스로 분리하여 사용하였다.
- 가독성 높아짐 : 권한 체크 로직을 별도로 분리하고, 메서드 이름(roleCheck)과 클래스 이름(UserCheckService)을 명확히 지음으로써 코드의 의도를 쉽게 파악할 수 있다. 무엇보다 코드 한줄로 처리할 수 있습니다.
- 단일 책임 원칙(SRP) : 권한 체크라는 단일 책임을 가지며, 별도의 클래스로 분리하여 다른 비즈니스 로직과 분리되었다.
728x90
'Back-End > JavaSpring' 카테고리의 다른 글
MSA에서 채팅 개발하기 (Spring, STOMP, Kafka, MongoDB, MySQL) - MongoDB 세팅 #3 (0) | 2025.04.17 |
---|---|
MSA에서 채팅 개발하기 (Spring, STOMP, Kafka, MongoDB, MySQL) - STOMP 세팅 #2 (0) | 2025.04.13 |
MSA에서 채팅 개발하기 (Spring, STOMP, Kafka, MongoDB, MySQL) - Kafka 세팅 #1 (0) | 2025.04.13 |
QueryMethod, JPQL, QueryDSL 중에서 어떤것을 사용할까 (0) | 2025.04.10 |
Entity, 영속성 컨텍스트 알아보기 (0) | 2025.04.01 |