vue + jpa project (20) - 공통코드 그룹관리(1) 본문

프로그램/Vue.js

vue + jpa project (20) - 공통코드 그룹관리(1)

반응형

이번 장부터는 공통코드를 관리하는 화면들을 진행하겠다.

우선 공통코드 테이블의 설계 모습이다. 보는 것과 같이 1:N 구조이다. 일반적인 구조이다.

 

우선 첫번째로 상위 부모인 코드그룹에 대해서 관리하는 프로그램을 진행하겠다.

 

백엔드 소스부터 먼저 정리하겠다.

앞에서 했던 것과 유사하지만 리마인드 하면서 진행하겠다.

 

1. 코드그룹 Entity 

   패키지는 다른 엔티티와 같이 entity 를 사용하겠다. 

   일단 여기서는 상세코드 쪽과의 관계는 생략하겠다. 

   추후 정리가 1차 되면 그때 관계를 다시 수정하겠다.

@JsonIgnoreProperties(value="hibernateLazyInitializer")
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Builder
@Entity
@EqualsAndHashCode(of="groupCode")
@Table(name="code_group")
public class CodeGroupEntity {

    @Id
    @Column(length = 3)
    private String groupCode;
    
    @Column(length = 30, nullable = false)
    private String groupName;
    
    @Column(length = 1)
    private String useYn;

    @JsonFormat(pattern="yyyy-MM-dd")
    @CreationTimestamp
    private LocalDateTime regDate;
    
    @JsonFormat(pattern="yyyy-MM-dd HH:mm")
    //@UpdateTimestamp
    private LocalDateTime updDate;

}

 

2. 코드그룹 Dto 

   패키지는 다른 엔티티와 같이 dto를 사용하겠다. 

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ToString
public class CodeGroupDto {

    private String groupCode;
    private String groupName;
    private String useYn;
    private String regDate;
    private String updDate;

}

 

3. 코드그룹 Repository 

   패키지는 다른 엔티티와 같이 repository를 사용하겠다. 

   Paging 처리와 사용여부 조건에 따른 조회와 GroupCode ASC로 조회되도록 만들었다.

public interface CodeGroupRepository extends JpaRepository<CodeGroupEntity, String> {
    Page<CodeGroupEntity> findByUseYnOrderByGroupCode(String useYn, Pageable pageable);
}

 

4. 코드그룹 Service

   패키지는 다른 엔티티와 같이 service 를 사용하겠다. 

 

@RequiredArgsConstructor
@Service
public class CodeGroupService {

    private final MessageSource messageSource;
    private final CodeGroupRepository repository;


    /**
     * 코드그룹 목록 가져오기
     */
    public List<CodeGroupDto> getCodeGroupList() {
        List<CodeGroupEntity> codeGroupEntities = repository.findAll();
        List<CodeGroupDto> dtos = new ArrayList<>();

        for (CodeGroupEntity entity : codeGroupEntities) {
            dtos.add(entityToDto(entity));
        }

        return dtos;
    }
    
    /**
     * 코드그룹 조회(페이징)
     */
    public Header<List<CodeGroupDto>> getCodeGroupList(CodeGroupDto codeGroupDto, Pageable pageable) {
        
        Page<CodeGroupEntity> codeGroupEntities = repository.findByUseYnOrderByGroupCode(codeGroupDto.getUseYn(), pageable);
        List<CodeGroupDto> dtos = new ArrayList<>();

        for (CodeGroupEntity entity : codeGroupEntities) {
            dtos.add(entityToDto(entity));
        }

        Pagination pagination = new Pagination(
                (int)codeGroupEntities.getTotalElements()
                , pageable.getPageNumber() + 1
                , pageable.getPageSize()
                , 10
        );

        return Header.OK(dtos, pagination);
    }
    
    /**
     * 코드그룹 중복체크
     */
    public boolean check(String groupCode) throws Exception {
        return repository.findById(groupCode).isEmpty();
    }

    /**
     * 코드그룹 상세조회
     */
    public CodeGroupDto read(String groupCode) throws Exception {
        
        CodeGroupEntity entity = repository.findById(groupCode)
                .orElseThrow(() -> new RuntimeException(messageSource.getMessage("error.notFound", new String[]{"코드그룹"}, Locale.getDefault())));
        return entityToDto(entity);
    }
    
    /**
     * 코드그룹 등록
     */
    public CodeGroupEntity create(CodeGroupDto codeGroupDto) {
        System.out.println("codeGroupDto= " + codeGroupDto);
        return repository.save(dtoToEntity(codeGroupDto));
    }

    /**
     * 코드그룹 수정
     */
    public CodeGroupEntity update(CodeGroupDto dto) {
        
        CodeGroupEntity entity = repository.findById(dto.getGroupCode())
                .orElseThrow(() -> new RuntimeException(messageSource.getMessage("error.notFound", new String[]{"코드그룹"}, Locale.getDefault())));
        entity.setGroupName(dto.getGroupName());
        entity.setUseYn(dto.getUseYn());
        entity.setUpdDate(LocalDateTime.now());
        
        return repository.save(entity);
    }


    /**
     * 코드그룹 삭제
     */
    public void delete(String groupCode) {
        
        CodeGroupEntity entity = repository.findById(groupCode)
                .orElseThrow(() -> new RuntimeException(messageSource.getMessage("error.notFound", new String[]{"코드그룹"}, Locale.getDefault())));
        repository.delete(entity);
    }

    
    /* 입력건 -> 테이블로 */
    private CodeGroupEntity dtoToEntity(CodeGroupDto dto) {
        CodeGroupEntity entity = CodeGroupEntity.builder()
                .groupCode(dto.getGroupCode())
                .groupName(dto.getGroupName())
                .useYn(dto.getUseYn())
                .regDate(LocalDateTime.now())
                .build();

        return entity;
    }
    
    /* 테이블 데이터 -> 화면쪽으로 */
    private CodeGroupDto entityToDto(CodeGroupEntity entity) {

        CodeGroupDto dto = CodeGroupDto.builder()
                .groupCode(entity.getGroupCode())
                .groupName(entity.getGroupName())
                .useYn(entity.getUseYn())
                .regDate((entity.getRegDate() != null)? entity.getRegDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")):null)
                .updDate((entity.getUpdDate() != null)? entity.getUpdDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")):null)
                .build();

        return dto;
    }
}

 

BoardService 와 유사하게 만들었다. 자세히 보면 일단 목록 가져오는 기본은 사용하지는 않지만 일단 추가했다.

그리고 페이징 처리되는 서비스를 추가하였고, 레파지토리에 추가된 메소드를 호출하여 사용하도록 하였다. 

그리고 중복 체크를 위해서 메소드를 하나 더 추가하였다.

 

5. 코드그룹 Controller

   패키지는 다른 엔티티와 같이 controller 를 사용하겠다. 

 

@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/codegroups")
public class CodeGroupController {
    
    private final CodeGroupService service;

    @GetMapping
    public ResponseEntity<List<CodeGroupDto>> list() throws Exception {
        log.info("list");
        
        return new ResponseEntity<>(service.getCodeGroupList(), HttpStatus.OK);
    }
    
    @GetMapping("/list_paging")
    public Header<List<CodeGroupDto>> boardList_paging_search(@PageableDefault Pageable pageable
            , CodeGroupDto codeGroupDto)
    {
        return service.getCodeGroupList(codeGroupDto, pageable); 
    }
    
    
    @GetMapping("/check/{groupCode}")
    public ResponseEntity<Boolean> check(@PathVariable("groupCode") String groupCode) throws Exception {
        boolean isEmpty = !service.check(groupCode);

        return new ResponseEntity<>(isEmpty, HttpStatus.OK);
    }
    
    
    @GetMapping("/{groupCode}")
    public ResponseEntity<CodeGroupDto> read(@PathVariable("groupCode") String groupCode) throws Exception {
        CodeGroupDto codeGroup = service.read(groupCode);
            
        return new ResponseEntity<>(codeGroup, HttpStatus.OK);
    }

    @PostMapping
    public ResponseEntity<CodeGroupDto> create(@Validated @RequestBody CodeGroupDto codeGroupDto) throws Exception {
        log.info("create");
        
        service.create(codeGroupDto);
        
        log.info("create codeGroup.getCodeGroupNo() = " + codeGroupDto.getGroupCode());
        
        return new ResponseEntity<>(codeGroupDto, HttpStatus.OK);
    }


    @PatchMapping("/{groupCode}")
    public ResponseEntity<CodeGroupDto> update(@PathVariable("groupCode") String groupCode, @Validated @RequestBody CodeGroupDto codeGroupDto) throws Exception {
        codeGroupDto.setGroupCode(groupCode);
        service.update(codeGroupDto);
        
        return new ResponseEntity<>(codeGroupDto, HttpStatus.OK);
    }

    @DeleteMapping("/{groupCode}")
    public ResponseEntity<Void> delete(@PathVariable("groupCode") String groupCode) throws Exception {
        
        CodeGroupDto codeGroup = service.read(groupCode);
        codeGroup.setUseYn("N");
        codeGroup.setUpdDate(LocalDateTime.now().toString());
        
        service.update(codeGroup);

        return new ResponseEntity<Void>(HttpStatus.NO_CONTENT);
    }
    
}

기존 컨트롤과 다른 점은 상위 맵핑 정보(@RequestMapping("/codegroups"))를 추가하고 나머지는 각각의 메소드에

맵핑되도록 하였다. 대부분은 유사하나 삭제 처리시에 데이터를 아예 삭제하지 않고 사용여부를 N으로 바뀌도록 하였다.

vue에서 조회시 사용여부가 Y인 것만 조회되도록 할 것이어서 삭제가 된 거 같은 효과를 보일 것이다.

 

다음 장에서는 프론트 쪽을 작성해 보겠다.

반응형

프로그램/Vue.js Related Articles

MORE

Comments