[공통코드] 기본 API 구현 완료료

This commit is contained in:
2025-09-01 10:19:39 +09:00
parent 499fbc6afb
commit d7646d2c1c
8 changed files with 94 additions and 45 deletions

View File

@@ -24,7 +24,7 @@ import java.util.List;
@Slf4j
@RestController
@RequestMapping("/admin/common-code")
@RequestMapping("/admin/common-codes")
@RequiredArgsConstructor
@Tag(name = "공통 코드 관리", description = "공통 코드 및 그룹 코드 관리 API")
public class CommonCodeController {

View File

@@ -2,28 +2,16 @@ package com.bio.bio_backend.domain.admin.common_code.repository;
import com.bio.bio_backend.domain.admin.common_code.entity.CommonCode;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface CommonCodeRepository extends JpaRepository<CommonCode, Long> {
public interface CommonCodeRepository extends JpaRepository<CommonCode, Long>, CommonCodeRepositoryCustom {
Optional<CommonCode> findByCode(String code);
List<CommonCode> findByGroupCodeAndUseFlagOrderBySortOrderAsc(String groupCode, Boolean useFlag);
List<CommonCode> findByParentCodeAndUseFlagOrderBySortOrderAsc(String parentCode, Boolean useFlag);
@Query("SELECT cc FROM CommonCode cc WHERE cc.groupCode = :groupCode AND cc.useFlag = :useFlag ORDER BY cc.sortOrder ASC")
List<CommonCode> findActiveCodesByGroupCodeOrderBySortOrder(@Param("groupCode") String groupCode, @Param("useFlag") Boolean useFlag);
@Query("SELECT cc FROM CommonCode cc WHERE cc.parentCode = :parentCode AND cc.useFlag = :useFlag ORDER BY cc.sortOrder ASC")
List<CommonCode> findActiveCodesByParentCodeOrderBySortOrder(@Param("parentCode") String parentCode, @Param("useFlag") Boolean useFlag);
boolean existsByCode(String code);
boolean existsByGroupCode(String groupCode);

View File

@@ -0,0 +1,27 @@
package com.bio.bio_backend.domain.admin.common_code.repository;
import com.bio.bio_backend.domain.admin.common_code.entity.CommonCode;
import java.util.List;
/**
* QueryDSL을 활용한 커스텀 쿼리 메서드들을 정의하는 인터페이스
* 복잡한 쿼리나 동적 쿼리가 필요한 경우 이 인터페이스를 구현하여 사용합니다.
*/
public interface CommonCodeRepositoryCustom {
/**
* 그룹 코드로 활성화된 공통 코드들을 정렬 순서대로 조회합니다.
*
* @param groupCode 그룹 코드
* @return List<CommonCode> 활성화된 공통 코드 목록
*/
List<CommonCode> findByGroupCode(String groupCode);
/**
* 부모 코드로 활성화된 공통 코드들을 정렬 순서대로 조회합니다.
*
* @param parentCode 부모 코드
* @return List<CommonCode> 활성화된 공통 코드 목록
*/
List<CommonCode> findByParentCode(String parentCode);
}

View File

@@ -0,0 +1,46 @@
package com.bio.bio_backend.domain.admin.common_code.repository;
import com.bio.bio_backend.domain.admin.common_code.entity.CommonCode;
import com.bio.bio_backend.domain.admin.common_code.entity.QCommonCode;
import com.querydsl.jpa.impl.JPAQueryFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* QueryDSL을 활용하여 CommonCodeRepositoryCustom 인터페이스를 구현하는 클래스
* 복잡한 쿼리나 동적 쿼리를 QueryDSL로 작성하여 성능과 가독성을 향상시킵니다.
*/
@Repository
@RequiredArgsConstructor
public class CommonCodeRepositoryImpl implements CommonCodeRepositoryCustom {
private final JPAQueryFactory queryFactory;
/**
* QCommonCode 인스턴스를 생성하여 쿼리에서 사용합니다.
* QueryDSL의 Q클래스를 통해 타입 안전한 쿼리 작성이 가능합니다.
*/
private final QCommonCode commonCode = QCommonCode.commonCode;
@Override
public List<CommonCode> findByGroupCode(String groupCode) {
return queryFactory
.selectFrom(commonCode)
.where(commonCode.groupCode.eq(groupCode)
.and(commonCode.useFlag.eq(true)))
.orderBy(commonCode.sortOrder.asc())
.fetch();
}
@Override
public List<CommonCode> findByParentCode(String parentCode) {
return queryFactory
.selectFrom(commonCode)
.where(commonCode.parentCode.eq(parentCode)
.and(commonCode.useFlag.eq(true)))
.orderBy(commonCode.sortOrder.asc())
.fetch();
}
}

View File

@@ -16,8 +16,5 @@ public interface CommonGroupCodeRepository extends JpaRepository<CommonGroupCode
List<CommonGroupCode> findByUseFlagOrderBySortOrderAsc(Boolean useFlag);
@Query("SELECT cgc FROM CommonGroupCode cgc WHERE cgc.useFlag = :useFlag ORDER BY cgc.sortOrder ASC")
List<CommonGroupCode> findActiveGroupCodesOrderBySortOrder(@Param("useFlag") Boolean useFlag);
boolean existsByCode(String code);
}

View File

@@ -20,9 +20,7 @@ public interface CommonCodeService {
void updateCode(String code, CommonCodeDto codeDto);
void deleteCode(String code);
CommonCodeDto getCode(String code);
List<CommonCodeDto> getCodesByGroupCode(String groupCode);
List<CommonCodeDto> getActiveCodesByGroupCode(String groupCode);
List<CommonCodeDto> getCodesByParentCode(String parentCode);
List<CommonCodeDto> getActiveCodesByParentCode(String parentCode);
List<CommonCodeDto> getAllCodes();
}

View File

@@ -8,7 +8,6 @@ import com.bio.bio_backend.domain.admin.common_code.mapper.CommonCodeMapper;
import com.bio.bio_backend.domain.admin.common_code.mapper.CommonGroupCodeMapper;
import com.bio.bio_backend.domain.admin.common_code.repository.CommonCodeRepository;
import com.bio.bio_backend.domain.admin.common_code.repository.CommonGroupCodeRepository;
import com.bio.bio_backend.global.constants.AppConstants;
import com.bio.bio_backend.global.exception.ApiException;
import com.bio.bio_backend.global.constants.ApiResponseCode;
import lombok.RequiredArgsConstructor;
@@ -46,7 +45,7 @@ public class CommonCodeServiceImpl implements CommonCodeService {
@Transactional
public void updateGroupCode(String code, CommonGroupCodeDto groupCodeDto) {
CommonGroupCode existingGroupCode = commonGroupCodeRepository.findByCode(code)
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_TARGET_NOT_FOUND, "그룹 코드를 찾을 수 없습니다: " + code));
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_TARGET_NOT_FOUND));
commonGroupCodeMapper.updateCommonGroupCodeFromDto(groupCodeDto, existingGroupCode);
commonGroupCodeRepository.save(existingGroupCode);
@@ -56,11 +55,11 @@ public class CommonCodeServiceImpl implements CommonCodeService {
@Transactional
public void deleteGroupCode(String code) {
CommonGroupCode groupCode = commonGroupCodeRepository.findByCode(code)
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_NOT_FOUND, "그룹 코드를 찾을 수 없습니다: " + code));
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_TARGET_NOT_FOUND));
// 하위 공통 코드가 있는지 확인
if (commonCodeRepository.existsByGroupCode(code)) {
throw new ApiException(ApiResponseCode.COMMON_BAD_REQUEST, "하위 공통 코드가 존재하여 삭제할 수 없습니다: " + code);
throw new ApiException(ApiResponseCode.COMMON_CODE_ERROR_001);
}
commonGroupCodeRepository.delete(groupCode);
@@ -69,7 +68,7 @@ public class CommonCodeServiceImpl implements CommonCodeService {
@Override
public CommonGroupCodeDto getGroupCode(String code) {
CommonGroupCode groupCode = commonGroupCodeRepository.findByCode(code)
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_NOT_FOUND, "그룹 코드를 찾을 수 없습니다: " + code));
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_NOT_FOUND));
return commonGroupCodeMapper.toCommonGroupCodeDto(groupCode);
}
@@ -90,12 +89,12 @@ public class CommonCodeServiceImpl implements CommonCodeService {
@Transactional
public CommonCodeDto createCode(CommonCodeDto commonCodeDto) {
if (commonCodeRepository.existsByCode(commonCodeDto.getCode())) {
throw new ApiException(ApiResponseCode.USER_ID_DUPLICATE, "이미 존재하는 공통 코드입니다: " + commonCodeDto.getCode());
throw new ApiException(ApiResponseCode.COMMON_CODE_DUPLICATE);
}
// 그룹 코드 존재 여부 확인
if (!commonGroupCodeRepository.existsByCode(commonCodeDto.getGroupCode())) {
throw new ApiException(ApiResponseCode.COMMON_BAD_REQUEST, "존재하지 않는 그룹 코드입니다: " + commonCodeDto.getGroupCode());
throw new ApiException(ApiResponseCode.COMMON_CODE_ERROR_002);
}
CommonCode commonCode = commonCodeMapper.toCommonCode(commonCodeDto);
@@ -107,7 +106,7 @@ public class CommonCodeServiceImpl implements CommonCodeService {
@Transactional
public void updateCode(String code, CommonCodeDto commonCodeDto) {
CommonCode existingCommonCode = commonCodeRepository.findByCode(code)
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_NOT_FOUND, "공통 코드를 찾을 수 없습니다: " + code));
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_CODE_ERROR_003));
commonCodeMapper.updateCommonCodeFromDto(commonCodeDto, existingCommonCode);
commonCodeRepository.save(existingCommonCode);
@@ -117,11 +116,11 @@ public class CommonCodeServiceImpl implements CommonCodeService {
@Transactional
public void deleteCode(String code) {
CommonCode commonCode = commonCodeRepository.findByCode(code)
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_NOT_FOUND, "공통 코드를 찾을 수 없습니다: " + code));
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_CODE_ERROR_003));
// 하위 공통 코드가 있는지 확인
if (commonCodeRepository.existsByParentCode(code)) {
throw new ApiException(ApiResponseCode.COMMON_BAD_REQUEST, "하위 공통 코드가 존재하여 삭제할 수 없습니다: " + code);
throw new ApiException(ApiResponseCode.COMMON_CODE_ERROR_001);
}
commonCodeRepository.delete(commonCode);
@@ -130,31 +129,19 @@ public class CommonCodeServiceImpl implements CommonCodeService {
@Override
public CommonCodeDto getCode(String code) {
CommonCode commonCode = commonCodeRepository.findByCode(code)
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_NOT_FOUND, "공통 코드를 찾을 수 없습니다: " + code));
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_CODE_ERROR_003));
return commonCodeMapper.toCommonCodeDto(commonCode);
}
@Override
public List<CommonCodeDto> getCodesByGroupCode(String groupCode) {
List<CommonCode> commonCodes = commonCodeRepository.findByGroupCodeAndUseFlagOrderBySortOrderAsc(groupCode, true);
return commonCodeMapper.toCommonCodeDtoList(commonCodes);
}
@Override
public List<CommonCodeDto> getActiveCodesByGroupCode(String groupCode) {
List<CommonCode> commonCodes = commonCodeRepository.findActiveCodesByGroupCodeOrderBySortOrder(groupCode, true);
return commonCodeMapper.toCommonCodeDtoList(commonCodes);
}
@Override
public List<CommonCodeDto> getCodesByParentCode(String parentCode) {
List<CommonCode> commonCodes = commonCodeRepository.findByParentCodeAndUseFlagOrderBySortOrderAsc(parentCode, true);
List<CommonCode> commonCodes = commonCodeRepository.findByGroupCode(groupCode);
return commonCodeMapper.toCommonCodeDtoList(commonCodes);
}
@Override
public List<CommonCodeDto> getActiveCodesByParentCode(String parentCode) {
List<CommonCode> commonCodes = commonCodeRepository.findActiveCodesByParentCodeOrderBySortOrder(parentCode, true);
List<CommonCode> commonCodes = commonCodeRepository.findByParentCode(parentCode);
return commonCodeMapper.toCommonCodeDtoList(commonCodes);
}

View File

@@ -84,7 +84,13 @@ public enum ApiResponseCode {
// 500 Internal Server Error
FILE_UPLOAD_FAILED(HttpStatus.INTERNAL_SERVER_ERROR.value(), "파일 업로드에 실패했습니다"),
FILE_DOWNLOAD_FAILED(HttpStatus.INTERNAL_SERVER_ERROR.value(), "파일 다운로드에 실패했습니다"),
FILE_DELETE_FAILED(HttpStatus.INTERNAL_SERVER_ERROR.value(), "파일 삭제에 실패했습니다");
FILE_DELETE_FAILED(HttpStatus.INTERNAL_SERVER_ERROR.value(), "파일 삭제에 실패했습니다"),
/*공통 코드 관련 Code*/
// 400 Bad Request
COMMON_CODE_ERROR_001(HttpStatus.BAD_REQUEST.value(), "하위 공통 코드가 존재하여 삭제할 수 없습니다."),
COMMON_CODE_ERROR_002(HttpStatus.BAD_REQUEST.value(), "존재하지 않는 그룹 코드입니다"),
COMMON_CODE_ERROR_003(HttpStatus.NOT_FOUND.value(), "공통 코드를 찾을 수 없습니다");
private final int statusCode;
private final String description;