
이번 포스팅에서는 깊은 내용을 다루는 것이 아니라,,,
StudyWithMe
의 코드 작성 간 리스트 안의 값 존재여부 확인 시 너무 많은 중복 코드가 생겨
가독성 개선 및 중복 코드 제거를 위해 ListCheckUtils
를 적용한 내용을 설명하려 한다.
ListCheckUtils 도입 전
본래의 StudyWithMe
에서는 List
객체의 null or empty
확인을 위해
스터디 룸의 생성
, 수정
작업에서 아래 코드의 if문
형식이 굉장히 많이 반복되었다.
ListCheckUtils
도입 전 StudyRoomCommandService
@Service
@RequiredArgsConstructor
public class StudyRoomCommandService {
...
private void imageModifyLogic(ModifyStudyRoomImageRequest request, StudyRoom studyRoom) {
if (request != null) {
if (request.getImagesToUpdate() != null) {
...
}
}
}
private void tagModifyLogic(ModifyStudyRoomTagRequest request, StudyRoom studyRoom) {
if(request != null){
if (request.getTagsToAdd() != null && !request.getTagsToAdd().isEmpty()) {
...
}
if (request.getTagIdsToRemove() != null && !request.getTagIdsToRemove().isEmpty())
...
}
}
...
private void dayOffModifyLogic(ModifyStudyRoomDayOffRequest request, StudyRoom studyRoom) {
if(request != null){
if (request.getDayOffsToAdd() != null && !request.getDayOffsToAdd().isEmpty()) {
...
}
if (request.getDayOffIdsToRemove() != null && !request.getDayOffIdsToRemove().isEmpty())
...
}
}
...
private void optionModifyLogic(ModifyStudyRoomOptionInfoRequest request, StudyRoom studyRoom) {
if(request != null){
if (request.getOptionsToAdd() != null && !request.getOptionsToAdd().isEmpty()) {
...
}
if (request.getOptionsIdsToRemove() != null && !request.getOptionsIdsToRemove().isEmpty())
...
}
}
...
private void typeModifyLogic(ModifyStudyRoomTypeInfoRequest request, StudyRoom studyRoom) {
if(request != null){
if (request.getTypesToAdd() != null && !request.getTypesToAdd().isEmpty()) {
...
}
if (request.getTypeIdsToRemove() != null && !request.getTypeIdsToRemove().isEmpty())
...
}
}
...
private void reserveTypeModifyLogic(ModifyStudyRoomReservationTypeRequest request, StudyRoom studyRoom) {
if(request != null){
if (request.getReservationTypesToAdd() != null)
reserveTypeRepository.batchInsert(request.getReservationTypesToAdd(), studyRoom);
if (request.getReservationTypesToUpdate() != null && !request.getReservationTypesToUpdate().isEmpty())
updateReserveTypes(request.getReservationTypesToUpdate(), studyRoom);
if (request.getReservationTypeIdsToRemove() != null && !request.getReservationTypeIdsToRemove().isEmpty())
removeReserveTypes(request.getReservationTypeIdsToRemove(), studyRoom);
}
}
...
private void validateTags(List<String> tags, StudyRoom studyRoom) {
// Tag 생성 및 저장
if (tags != null && !tags.isEmpty()) {
tagRepository.batchInsert(tags, studyRoom);
}
}
}
위처럼 반복되고 동일한 작업을 하는 코드가 IF문
내에서 너무나도 중복된다.
또한, 추후에 또 API가 추가되었을 때 코드 누락으로 인해 적절하게 List
객체의 null
과 empty
를 확인해주지 않으면,
배포 환경에서 오류가 발생하거나 악용될 여지가 있다.
따라서, 중복 코드 제거 및 반복 작업 방지를 위해 List
의 Present
를 파악할 수 있는 Utils
클래스의 필요성이 대두되었다.
ListCheckUtils
ListCheckUtils
는 정말 별거 없다.
ListCheckUtils
package com.jj.swm.global.common.util;
import java.util.List;
public class ListCheckUtils {
public static boolean isListPresent(List<?> someList){return someList != null && !someList.isEmpty();}
public static boolean isListNotNull(List<?> someList){return someList != null;}
public static boolean isListNotEmpty(List<?> someList){return !someList.isEmpty();}
}
정말 단순하게 와일드카드
를 활용해 모든 List
객체를 받아, null
, empty
의 파악을 도와주는 클래스이다.
위의 간단한 코드를 StudyRoomCommandService
에 도입하게 되면 어떻게 될까?
ListCheckUtils 도입 후
ListCheckUtils
도입 후 StudyRoomCommandService
import static com.jj.swm.global.common.util.ListCheckUtils.*;
@Service
@RequiredArgsConstructor
public class StudyRoomCommandService {
...
private void imageModifyLogic(ModifyStudyRoomImageRequest request, StudyRoom studyRoom) {
if (request != null) {
if (isListNotNull(request.getImagesToUpdate())) {
...
}
}
}
private void tagModifyLogic(ModifyStudyRoomTagRequest request, StudyRoom studyRoom) {
if(request != null){
if (ListCheckUtils.isListPresent(request.getTagsToAdd())) {
...
}
if (isListPresent(request.getTagIdsToRemove()))
...
}
}
private void dayOffModifyLogic(ModifyStudyRoomDayOffRequest request, StudyRoom studyRoom) {
if(request != null){
if (isListPresent(request.getDayOffsToAdd())) {
...
}
if (isListPresent(request.getDayOffIdsToRemove()))
...
}
}
...
private void optionModifyLogic(ModifyStudyRoomOptionInfoRequest request, StudyRoom studyRoom) {
if(request != null){
if (isListPresent(request.getOptionsToAdd())) {
...
}
if (isListPresent(request.getOptionsIdsToRemove()))
...
}
}
private void typeModifyLogic(ModifyStudyRoomTypeInfoRequest request, StudyRoom studyRoom) {
if(request != null){
if (isListPresent(request.getTypesToAdd())) {
...
}
if (isListPresent(request.getTypeIdsToRemove()))
...
}
}
private void reserveTypeModifyLogic(ModifyStudyRoomReservationTypeRequest request, StudyRoom studyRoom) {
if(request != null){
if (isListNotNull(request.getReservationTypesToAdd()))
...
if (isListPresent(request.getReservationTypesToUpdate()))
...
if (isListPresent(request.getReservationTypeIdsToRemove()))
...
}
}
private void validateDayOffs(List<DayOfWeek> dayOffs, StudyRoom studyRoom) {
// DayOff 생성 및 저장
if (isListPresent(dayOffs)) {
...
}
}
private void validateTags(List<String> tags, StudyRoom studyRoom) {
// Tag 생성 및 저장
if (isListPresent(tags)) {
...
}
}
private long computeTotalSize(long storedSize, List<?> aboutAdd, List<?> aboutRemove){
if(isListPresent(aboutRemove))
return storedSize + aboutAdd.size() - aboutRemove.size();
else
return storedSize + aboutAdd.size();
}
}
아주 간단한 ListCheckUtils
의 추가로 훨씬 보기 간편해졌다.(적어도 필자는 그렇게 생각한다.)
또한, 추후 생길 API에서도 IF문
에서 일일이 코드를 작성하지 않아도 되며, 코드 누락 걱정이 필요없어졌다.
추가로, StudyWithMe
백엔드 팀원분들이 모두 사용할 수 있으므로 StudyWithMe
전체 코드의
가독성/중복/견고함 측면에 의미가 있다고 생각한다.
마무리하며
ListCheckUtils 클래스 도입 전
- IF문에서 중복된 코드
- IF문에서
List
객체 검증 코드 누락 시 추후 문제 발생 여지 존재 - 코드 가독성 악영향
- 능률 저하
ListCheckUtils 클래스 도입 후
- 불필요한 중복 코드 제거
ListCheckUtils
의 메소드만 호출하면 되므로, 검증 코드 누락 확률이 감소- 코드 가독성 향상
- 능률 향상
'프로젝트 > StudyWithMe' 카테고리의 다른 글
[StudyWithMe] 스터디 윗 미 프로젝트에서 n8n 사용해보기 (0) | 2025.02.03 |
---|---|
[StudyWithMe] 유저의 사업자 검수 요청을 처리하며 - 2 (0) | 2025.01.24 |
[StudyWithMe] 유저의 사업자 검수 요청을 처리하며 - 1 (0) | 2025.01.23 |
[StudyWithMe] Async Thread Pool과 CompletableFuture (0) | 2025.01.12 |
[StudyWithMe] 스터디 윗 미 dev 무중단 배포 (0) | 2024.12.24 |