[공통 코드 조회 기능 개선] 공통 코드 조회 API를 개선하여, CommonGroupCode 및 Member 정보를 조인하여 함께 반환하도록 수정. 새로운 GetCommonCodeResponseDto 클래스를 추가하고, 관련 메서드를 CommonCodeService 및 CommonCodeRepository에 구현하여 데이터 조회 성능을 향상시킴.
This commit is contained in:
@@ -168,8 +168,8 @@ public class CommonCodeController {
|
|||||||
@ApiResponse(responseCode = "404", description = "공통 코드를 찾을 수 없음", content = @Content(schema = @Schema(implementation = ApiResponseDto.class)))
|
@ApiResponse(responseCode = "404", description = "공통 코드를 찾을 수 없음", content = @Content(schema = @Schema(implementation = ApiResponseDto.class)))
|
||||||
})
|
})
|
||||||
@GetMapping("/{code}")
|
@GetMapping("/{code}")
|
||||||
public ResponseEntity<ApiResponseDto<CommonCodeDto>> getCode(@PathVariable String code) {
|
public ResponseEntity<ApiResponseDto<GetCommonCodeResponseDto>> getCode(@PathVariable String code) {
|
||||||
CommonCodeDto commonCode = commonCodeService.getCode(code);
|
GetCommonCodeResponseDto commonCode = commonCodeService.getCodeWithJoinInfo(code);
|
||||||
return ResponseEntity.ok(ApiResponseDto.success(ApiResponseCode.COMMON_SUCCESS_RETRIEVED, commonCode));
|
return ResponseEntity.ok(ApiResponseDto.success(ApiResponseCode.COMMON_SUCCESS_RETRIEVED, commonCode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -0,0 +1,68 @@
|
|||||||
|
package com.bio.bio_backend.domain.admin.common_code.dto;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 공통 코드 조회용 Response DTO
|
||||||
|
* CommonGroupCode의 name과 Member의 name을 join을 통해 함께 조회
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@SqlResultSetMapping(
|
||||||
|
name = "GetCommonCodeResponseDtoMapping",
|
||||||
|
classes = @ConstructorResult(
|
||||||
|
targetClass = GetCommonCodeResponseDto.class,
|
||||||
|
columns = {
|
||||||
|
@ColumnResult(name = "code", type = String.class),
|
||||||
|
@ColumnResult(name = "name", type = String.class),
|
||||||
|
@ColumnResult(name = "description", type = String.class),
|
||||||
|
@ColumnResult(name = "group_code", type = String.class),
|
||||||
|
@ColumnResult(name = "parent_code", type = String.class),
|
||||||
|
@ColumnResult(name = "character_ref1", type = String.class),
|
||||||
|
@ColumnResult(name = "character_ref2", type = String.class),
|
||||||
|
@ColumnResult(name = "character_ref3", type = String.class),
|
||||||
|
@ColumnResult(name = "character_ref4", type = String.class),
|
||||||
|
@ColumnResult(name = "character_ref5", type = String.class),
|
||||||
|
@ColumnResult(name = "sort_order", type = Integer.class),
|
||||||
|
@ColumnResult(name = "use_flag", type = Boolean.class),
|
||||||
|
@ColumnResult(name = "created_at", type = LocalDateTime.class),
|
||||||
|
@ColumnResult(name = "updated_at", type = LocalDateTime.class),
|
||||||
|
@ColumnResult(name = "group_code_name", type = String.class),
|
||||||
|
@ColumnResult(name = "created_by_name", type = String.class),
|
||||||
|
@ColumnResult(name = "updated_by_name", type = String.class)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
public class GetCommonCodeResponseDto {
|
||||||
|
|
||||||
|
// CommonCode 기본 정보
|
||||||
|
private String code;
|
||||||
|
private String name;
|
||||||
|
private String description;
|
||||||
|
private String groupCode;
|
||||||
|
private String parentCode;
|
||||||
|
private String characterRef1;
|
||||||
|
private String characterRef2;
|
||||||
|
private String characterRef3;
|
||||||
|
private String characterRef4;
|
||||||
|
private String characterRef5;
|
||||||
|
private Integer sortOrder;
|
||||||
|
private Boolean useFlag;
|
||||||
|
|
||||||
|
// BaseEntity 정보
|
||||||
|
private LocalDateTime createdAt;
|
||||||
|
private LocalDateTime updatedAt;
|
||||||
|
|
||||||
|
// Join을 통해 가져올 정보
|
||||||
|
private String groupCodeName; // CommonGroupCode의 name
|
||||||
|
private String createdByName; // 생성자 Member의 name
|
||||||
|
private String updatedByName; // 수정자 Member의 name
|
||||||
|
}
|
@@ -1,7 +1,9 @@
|
|||||||
package com.bio.bio_backend.domain.admin.common_code.repository;
|
package com.bio.bio_backend.domain.admin.common_code.repository;
|
||||||
|
|
||||||
|
import com.bio.bio_backend.domain.admin.common_code.dto.GetCommonCodeResponseDto;
|
||||||
import com.bio.bio_backend.domain.admin.common_code.entity.CommonCode;
|
import com.bio.bio_backend.domain.admin.common_code.entity.CommonCode;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QueryDSL을 활용한 커스텀 쿼리 메서드들을 정의하는 인터페이스
|
* QueryDSL을 활용한 커스텀 쿼리 메서드들을 정의하는 인터페이스
|
||||||
@@ -24,4 +26,22 @@ public interface CommonCodeRepositoryCustom {
|
|||||||
* @return List<CommonCode> 활성화된 공통 코드 목록
|
* @return List<CommonCode> 활성화된 공통 코드 목록
|
||||||
*/
|
*/
|
||||||
List<CommonCode> findByParentCode(String parentCode);
|
List<CommonCode> findByParentCode(String parentCode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 특정 공통 코드를 조회하며 CommonGroupCode와 Member 정보를 join하여 함께 조회합니다.
|
||||||
|
* QueryDSL을 사용하여 성능 최적화된 쿼리를 실행합니다.
|
||||||
|
*
|
||||||
|
* @param code 조회할 공통 코드
|
||||||
|
* @return Optional<GetCommonCodeResponseDto> 조회된 공통 코드 정보 (없으면 empty)
|
||||||
|
*/
|
||||||
|
Optional<GetCommonCodeResponseDto> findCodeWithJoinInfo(String code);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 특정 공통 코드를 조회하며 CommonGroupCode와 Member 정보를 join하여 함께 조회합니다.
|
||||||
|
* Native Query를 사용한 버전 (사용하지 않음, 참고용)
|
||||||
|
*
|
||||||
|
* @param code 조회할 공통 코드
|
||||||
|
* @return Optional<GetCommonCodeResponseDto> 조회된 공통 코드 정보 (없으면 empty)
|
||||||
|
*/
|
||||||
|
Optional<GetCommonCodeResponseDto> findCodeWithJoinInfoNative(String code);
|
||||||
}
|
}
|
@@ -1,12 +1,18 @@
|
|||||||
package com.bio.bio_backend.domain.admin.common_code.repository;
|
package com.bio.bio_backend.domain.admin.common_code.repository;
|
||||||
|
|
||||||
|
import com.bio.bio_backend.domain.admin.common_code.dto.GetCommonCodeResponseDto;
|
||||||
import com.bio.bio_backend.domain.admin.common_code.entity.CommonCode;
|
import com.bio.bio_backend.domain.admin.common_code.entity.CommonCode;
|
||||||
import com.bio.bio_backend.domain.admin.common_code.entity.QCommonCode;
|
import com.bio.bio_backend.domain.admin.common_code.entity.QCommonCode;
|
||||||
|
import com.bio.bio_backend.domain.admin.common_code.entity.QCommonGroupCode;
|
||||||
|
import com.bio.bio_backend.domain.base.member.entity.QMember;
|
||||||
|
import com.querydsl.core.types.Projections;
|
||||||
import com.querydsl.jpa.impl.JPAQueryFactory;
|
import com.querydsl.jpa.impl.JPAQueryFactory;
|
||||||
|
import jakarta.persistence.EntityManager;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QueryDSL을 활용하여 CommonCodeRepositoryCustom 인터페이스를 구현하는 클래스
|
* QueryDSL을 활용하여 CommonCodeRepositoryCustom 인터페이스를 구현하는 클래스
|
||||||
@@ -17,12 +23,16 @@ import java.util.List;
|
|||||||
public class CommonCodeRepositoryImpl implements CommonCodeRepositoryCustom {
|
public class CommonCodeRepositoryImpl implements CommonCodeRepositoryCustom {
|
||||||
|
|
||||||
private final JPAQueryFactory queryFactory;
|
private final JPAQueryFactory queryFactory;
|
||||||
|
private final EntityManager entityManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* QCommonCode 인스턴스를 생성하여 쿼리에서 사용합니다.
|
* Q클래스 인스턴스들을 생성하여 쿼리에서 사용합니다.
|
||||||
* QueryDSL의 Q클래스를 통해 타입 안전한 쿼리 작성이 가능합니다.
|
* QueryDSL의 Q클래스를 통해 타입 안전한 쿼리 작성이 가능합니다.
|
||||||
*/
|
*/
|
||||||
private final QCommonCode commonCode = QCommonCode.commonCode;
|
private final QCommonCode commonCode = QCommonCode.commonCode;
|
||||||
|
private final QCommonGroupCode commonGroupCode = QCommonGroupCode.commonGroupCode;
|
||||||
|
private final QMember createdByMember = new QMember("createdByMember");
|
||||||
|
private final QMember updatedByMember = new QMember("updatedByMember");
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<CommonCode> findByGroupCode(String groupCode) {
|
public List<CommonCode> findByGroupCode(String groupCode) {
|
||||||
@@ -43,4 +53,53 @@ public class CommonCodeRepositoryImpl implements CommonCodeRepositoryCustom {
|
|||||||
.orderBy(commonCode.sortOrder.asc())
|
.orderBy(commonCode.sortOrder.asc())
|
||||||
.fetch();
|
.fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<GetCommonCodeResponseDto> findCodeWithJoinInfo(String code) {
|
||||||
|
return Optional.ofNullable(
|
||||||
|
queryFactory
|
||||||
|
.select(Projections.constructor(GetCommonCodeResponseDto.class,
|
||||||
|
commonCode.code, commonCode.name, commonCode.description,
|
||||||
|
commonCode.groupCode, commonCode.parentCode,
|
||||||
|
commonCode.characterRef1, commonCode.characterRef2, commonCode.characterRef3,
|
||||||
|
commonCode.characterRef4, commonCode.characterRef5,
|
||||||
|
commonCode.sortOrder, commonCode.useFlag,
|
||||||
|
commonCode.createdAt, commonCode.updatedAt,
|
||||||
|
commonGroupCode.name, createdByMember.name, updatedByMember.name
|
||||||
|
))
|
||||||
|
.from(commonCode)
|
||||||
|
.leftJoin(commonGroupCode).on(commonCode.groupCode.eq(commonGroupCode.code))
|
||||||
|
.leftJoin(createdByMember).on(commonCode.createdOid.eq(createdByMember.oid))
|
||||||
|
.leftJoin(updatedByMember).on(commonCode.updatedOid.eq(updatedByMember.oid))
|
||||||
|
.where(commonCode.code.eq(code))
|
||||||
|
.fetchOne()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<GetCommonCodeResponseDto> findCodeWithJoinInfoNative(String code) {
|
||||||
|
String nativeQuery = """
|
||||||
|
SELECT cc.code, cc.name, cc.description, cc.group_code, cc.parent_code,
|
||||||
|
cc.character_ref1, cc.character_ref2, cc.character_ref3, cc.character_ref4, cc.character_ref5,
|
||||||
|
cc.sort_order, cc.use_flag, cc.created_at, cc.updated_at,
|
||||||
|
cgc.name as group_code_name, cm1.name as created_by_name, cm2.name as updated_by_name
|
||||||
|
FROM st_common_code cc
|
||||||
|
LEFT JOIN st_common_group_code cgc ON cc.group_code = cgc.code
|
||||||
|
LEFT JOIN st_member cm1 ON cc.created_oid = cm1.oid
|
||||||
|
LEFT JOIN st_member cm2 ON cc.updated_oid = cm2.oid
|
||||||
|
WHERE cc.code = :code
|
||||||
|
""";
|
||||||
|
|
||||||
|
try {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
List<GetCommonCodeResponseDto> results = entityManager
|
||||||
|
.createNativeQuery(nativeQuery, "GetCommonCodeResponseDtoMapping")
|
||||||
|
.setParameter("code", code)
|
||||||
|
.getResultList();
|
||||||
|
|
||||||
|
return results.isEmpty() ? Optional.empty() : Optional.of(results.get(0));
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,6 +2,7 @@ package com.bio.bio_backend.domain.admin.common_code.service;
|
|||||||
|
|
||||||
import com.bio.bio_backend.domain.admin.common_code.dto.CommonCodeDto;
|
import com.bio.bio_backend.domain.admin.common_code.dto.CommonCodeDto;
|
||||||
import com.bio.bio_backend.domain.admin.common_code.dto.CommonGroupCodeDto;
|
import com.bio.bio_backend.domain.admin.common_code.dto.CommonGroupCodeDto;
|
||||||
|
import com.bio.bio_backend.domain.admin.common_code.dto.GetCommonCodeResponseDto;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -20,6 +21,7 @@ public interface CommonCodeService {
|
|||||||
void updateCode(String code, CommonCodeDto codeDto);
|
void updateCode(String code, CommonCodeDto codeDto);
|
||||||
void deleteCode(String code);
|
void deleteCode(String code);
|
||||||
CommonCodeDto getCode(String code);
|
CommonCodeDto getCode(String code);
|
||||||
|
GetCommonCodeResponseDto getCodeWithJoinInfo(String code);
|
||||||
List<CommonCodeDto> getActiveCodesByGroupCode(String groupCode);
|
List<CommonCodeDto> getActiveCodesByGroupCode(String groupCode);
|
||||||
List<CommonCodeDto> getActiveCodesByParentCode(String parentCode);
|
List<CommonCodeDto> getActiveCodesByParentCode(String parentCode);
|
||||||
List<CommonCodeDto> getAllCodes();
|
List<CommonCodeDto> getAllCodes();
|
||||||
|
@@ -2,6 +2,7 @@ package com.bio.bio_backend.domain.admin.common_code.service;
|
|||||||
|
|
||||||
import com.bio.bio_backend.domain.admin.common_code.dto.CommonCodeDto;
|
import com.bio.bio_backend.domain.admin.common_code.dto.CommonCodeDto;
|
||||||
import com.bio.bio_backend.domain.admin.common_code.dto.CommonGroupCodeDto;
|
import com.bio.bio_backend.domain.admin.common_code.dto.CommonGroupCodeDto;
|
||||||
|
import com.bio.bio_backend.domain.admin.common_code.dto.GetCommonCodeResponseDto;
|
||||||
import com.bio.bio_backend.domain.admin.common_code.entity.CommonCode;
|
import com.bio.bio_backend.domain.admin.common_code.entity.CommonCode;
|
||||||
import com.bio.bio_backend.domain.admin.common_code.entity.CommonGroupCode;
|
import com.bio.bio_backend.domain.admin.common_code.entity.CommonGroupCode;
|
||||||
import com.bio.bio_backend.domain.admin.common_code.mapper.CommonCodeMapper;
|
import com.bio.bio_backend.domain.admin.common_code.mapper.CommonCodeMapper;
|
||||||
@@ -133,6 +134,12 @@ public class CommonCodeServiceImpl implements CommonCodeService {
|
|||||||
return commonCodeMapper.toCommonCodeDto(commonCode);
|
return commonCodeMapper.toCommonCodeDto(commonCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GetCommonCodeResponseDto getCodeWithJoinInfo(String code) {
|
||||||
|
return commonCodeRepository.findCodeWithJoinInfo(code)
|
||||||
|
.orElseThrow(() -> new ApiException(ApiResponseCode.COMMON_CODE_ERROR_003));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<CommonCodeDto> getActiveCodesByGroupCode(String groupCode) {
|
public List<CommonCodeDto> getActiveCodesByGroupCode(String groupCode) {
|
||||||
List<CommonCode> commonCodes = commonCodeRepository.findByGroupCode(groupCode);
|
List<CommonCode> commonCodes = commonCodeRepository.findByGroupCode(groupCode);
|
||||||
|
Reference in New Issue
Block a user