newcodingtest / ProjectManagementSystem

:sunny::sunny:레거시 코드 리펙토링 해보기:sunny::sunny:
1 stars 0 forks source link

연관관계 설정 고민.. #25

Open newcodingtest opened 2 years ago

newcodingtest commented 2 years ago

Project(프로젝트)-Task(상위작업)-SubTask(하위작업)

Project(프로젝트)-Task(상위작업)
1 : N

Task(상위작업)-SubTask(하위작업) 1 : N

1.상위작업은 프로젝트와 관련된 작업을 등록할수있다. 2.상위작업은 개인의 private한 프로젝트와 관련없는 작업을 등록할수있다. 3.하위작업은 상위작업이 있어야지만 등록이 가능하다. 4.상위작업의 진행률은 하위작업들의 진행률들을 모아 계산된값이다. 5.상위작업의 시작일, 종료일은 하위작업의 최소 시작일, 최대 종료일이다. 6.상위작업 삭제시 하위작업들도 같이 모두 삭제된다. 7.상위작업 수정시에 동시에 하위작업들을 같이 수정할 수 있다.

newcodingtest commented 2 years ago

현재 고민은.. 상위작업 조회 시점에서 하위작업들을 같이 보여줘야 하는데

  1. fetch join 묶어서 하나의 메서드를 통해서 한 화면에 보여줄지? (일단은 즉시로딩 세팅을 해둔후 추후에 fetch join을 적용할 예정)

아니면

  1. 따로 상위조회, 하위조회 2개의 메서드를 통해서 한 화면에 보여줄지?
newcodingtest commented 2 years ago

ㄴ 1번의 경우 컨트롤러에서 하나의 service 만 호출하면 되지만 2번의 경우 2개의 service 를 호출해야 된다.(컨트롤러가 복잡해질수도있음)

생각해보면 상위작업 수정시 하위작업도 같이 수정되기 때문에 아무래도 연관관계를 설정하여 하나로 묶어서 처리하는게 깔끔할꺼같다.

public class Task extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="TASK_ID")
private Long tid;
.
.
.
@OneToMany(mappedBy = "task", fetch = FetchType.EAGER, orphanRemoval = true)
private List<SubTask> subTask = new ArrayList<SubTask>();

@PostMapping("/modify")
public String doModify(TaskDTO dto,RedirectAttributes redirectAttributes) {
    log.info("----------doModify----------");
    log.info("tid: "+dto.getTid());

    taskService.modify(dto);

    return "redirect:/task/list";
}

연관관계를 설정해주면 컨트롤러에서도 파라미터로 상위타입(TaskDTO) 하나로 하위까지 한번에 받을수 있게되어 보다 깔끔해진다.

서비스 레이어까지 상위타입으로 넘긴다음 서비스 레이어에서 2개의 repository를 호출해서 처리하는게 좀더 깔끔한 코드가 될거같다

newcodingtest commented 2 years ago

6,7번 같은 경우 현재 FE 에서는 읽기 페이지에서 바로 수정을 할수있게 구현한 상태이다. 그래서 읽기 페이지에서 바로 저장 버튼을 누를때 1.변경된 것이 없으면 아무것도 안하고

  1. 변경된 것이 있을때 기존+새로운 내용 이 추가되었을때 있으면 추가 저장이 되며 기존내용이 새로운 내용으로 변경되었을땐 수정 기존내용이 없어졌다면? 없어진 내용만 DB에서 삭제

하는 3가지 행동을

저장 이벤트 하나에서 처리해야한다. 엔티티 조회 및 더티체킹을 엄청 주의 해서 개발해야한다.