티스토리 뷰

반응형

 

 

IB Sheet8 그리드 제품을 신규 프로젝트에도 사용하기로 되었는데

기존 프로젝트에는 공통 CRUD 컨트롤러/서비스에서 IB Sheet의 데이터 Map<String, Object> 방식을

가공하여 mybatis 쿼리 xml에 맵핑하는 방식으로 되어있었다.

 

기능을 빠르게 만들어 내기에는 아주 편안한?

그러나 유지보수하기에는 찾기 아주 불편한?

 

편안한 이유는 기능마다의 컨트롤러/서비스/DTO를 구성할 필요가 없으며,

mybatis xml 쿼리만 생성하면 되었기 때문에 java 코드를 작성할 필요가 없었음.

전형적인 대한민국 si 프로젝트 방식으로 구성 되어있었음.

 

 

신규프로젝트에는 JPA를 적용하기로 했고, 그러다 보니 기존 공통 CRUD를 그대로 가져다 쓸 수 없었음.

(제네릭방식으로 잘 구성하면 다시 재활용 가능하나, 난 유지보수가 불편한 코드를 굉장히 싫어하고 기능별로 나눠 개발하고 싶었다.)

 

그래서 IB Sheet 의 데이터 구조를 이용하여 공통 CUD 제네릭 메소드를 만들어 보았다.

(조회는 그냥 json 으로 끌고 오면 되서 필요없음)

 


 

1. IBSheet8 데이터 파싱 메소드

 

IB Sheet 에서 여러 데이터를 CUD 하면 아래와 같이 data key에 리스트로 각 row 마다의 데이터를 담아 보낸다.

status 에 따라 I/U/D  (insert/update/delete) 로 구분하고

column name 값 (userName / userEmail / guid) 에 따라 입력받은 값을 받고

그 외에 ibSheet 가 필요로 하는 데이터를 전달 한다.

( 그리드 기능 자체에서 id 값을 쓰는게 매우 별로였음... db설계에 id 값을 쓰게되면 다른 명칭으로 변경해야함...) 

 

{
    "data": [
        {
            "id": "AR7",
            "Def": "R",
            "Parent": "",
            "Next": "AR1",
            "Prev": "",
            "SEQ": 1,
            "sDelete": "0",
            "sStatus": "I",
            "userName": "샘플테스트",
            "userEmail": "test@sample.com",
            "guid": "",
            "STATUS": "I"
        },
        ...
    ]
}

 

각 리스트별 column 값에 대한 DTO 를 생성해준다.

RequestDTO 는 ibSheet의 status 값을 받기 위한 공통 DTO

@JsonIgnoreProperties(ignoreUnknown=true)  어노테이션으로 ibsheet 가 사용하는 데이터를 무시하게끔 처리한다.

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class SampleDTO extends RequestDTO {
	private String guid;
	private String userName;
	private String userEmail;
}


@Data
public class RequestDTO {
    @JsonProperty("sStatus")
    private String status;
}

 

그리드 컬럼에 따라 데이터 정보가 동적으로 바뀜으로 Map<String, Object> 형식으로 파라미터를 받아 처리하는데

이 부분에서 CUD 처리하는 기능마다 데이터를 DTO 담는 코드를 중복으로 작성해야되서 

Map 데이터를 DTO 에 담는 제네릭 메소드를 작성하였다.

 

public static <T> List<T> convertMapToDtoList(Map<String, Object> mapData, Class<T> dtoClass) {
    ObjectMapper objectMapper = new ObjectMapper();
    List<Map<String,Object>> data = (List<Map<String, Object>>) mapData.get("data");

    return data.stream()
               .map(row -> objectMapper.convertValue(row, dtoClass))
               .collect(Collectors.toList());
}

 

인자로 받은 Map 데이터 안에 'data' 키값에는 정보를 반영한 row 들의 정보를 담고 있으므로

List<Map> 으로 추출하고 해당 데이터를 stream으로 나열하여 ObjectMapper를 사용해 DTO 클래스로 변환하고

리스트에 담아 리턴하였다.

 

컨트롤러에서의 사용은 아래와 같다.

각 기능별로 데이터 변환하여 CUD에 사용하면 된다.

public @ResponseBody Map<String, Object> save(@RequestBody Map<String, Object> paramMap) {
    List<SampleDTO> sampleList = IbSheetUtils.convertMapToDtoList(paramMap, SampleDTO.class);
    return sampleService.save(sampleList);
}

 


 

 

2. IBSheet8 데이터 CUD 수행 메소드

 

 

위 컨트롤러에서 서비스단으로 변환된 List<DTO> 를 가지고 CUD를 수행하는 제네릭 메소드를 하나 더 생성하였다.

public static <DTO extends RequestDTO, Entity, ID> void commonCUD(List<DTO> param,
                                                                  GenericToMapper<DTO, Entity> mapper,
                                                                  JpaRepository<Entity, ID> repository ) {

        for(DTO row : param) {
            Entity entity = mapper.toEntity(row);
            if(row.getStatus().equals("D")) {
                repository.delete(entity);
            } else {
                repository.save(entity);
            }
        }

    }

DTO로 변환한 리스트 인자와 DTO를 엔티티로 변환하는 Mapstruct mapper 와 jpa repository 를 인자로 전달하고

row 단위로 반복하면서 IB Sheet 그리드의 상태가 D (Delete) 일 경우에만 삭제를 수행하고

그 외에는 I/U (Insert / Update) 를 수행하게 처리하였다.

 

@Transactional
public Map<String, Object> save(List<SampleDTO> param) {
	IbSheetUtils.commonCUD(param, sampleToMapper, sampleRepository);
	
    // ... 리턴처리
}

 

 

 

내가 편하고자 JPA 사용 형식의 공통 제네릭 메소드를 작성하였다.

확실히 기존 프로젝트에 있던 공통 메서드보단 가독성이 훨씬 좋아졌다.

 

기존 메소드에는 내 기준에서 생각했을때 불필요한 처리가 난무했어서 도저히 그대로 둘 수 없었다.

 

 

 

 

 

 

 

 

 

 

IBsheet8

그리드 기반의 고객서비스를 위한 국내 1위 제품

www.ibsheet.com

 

반응형
댓글
반응형
최근에 올라온 글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total
Today
Yesterday