entity setter

inho ha·2022년 5월 22일
0
post-thumbnail

entity setter

entity에서 멤버 변수를 초기화 할 때 setter 메서드를 사용하는 것은 문제점이 있다.

  1. setter 메서드를 사용하면 한번 초기화 이후 값이 변경 되면 안되는 경우에 다시 setter 메서드를 사용하여 변경할 가능성이 존재한다.

  2. setter 메서드의 메서드명에는 메서드의 의도가 담겨있지 않아서 어떤 용도로 사용해야하는지 알기 어렵다.

변경 가능성 문제

따라서 한번 초기화 이후 값이 변경 되면 안되는 경우에는 setter 메서드 대신 생성자에서 초기화 해주는 방식으로 하고
대신 생성자에서 초기화 해주지 않으면 이후 값을 초기화 해줄 수 없기 때문에 기본 생성자로 public 접근을 막아두어야 한다.
JPA를 사용하려면 기본 생성자를 만들어 둬야하기 때문에 JPA에서 허용하는 protected 수준으로 기본 생성자를 정의해둔다.

메서드명 문제

setter 메서드 대신 의도에 맞게 멤버 변수의 값을 설정하는 메서드를 작성하면 된다.
예를 들어 유저가 문제를 풀어서 푼 문제 수와 유저의 점수 값을 변경해야하는 경우 이 두 멤버 변수 값을 변경해주는 user.solvingProblem() 메서드를 작성할 수 있다.
이렇게 작성하게 되면 메서드 명 만 보고도 메서드의 의도를 알 수 있어서 언제 해당 메서드를 사용해야할지 명확하게 알 수 있다.

이 방식의 문제점

메서드 명이 의도에 따라 다양하게 작성되어 어떤 메서드들이 있는지 entity를 열어 확인하고 구현도 확인해야 사용할 수 있다.

unsovled-wa 에서 entity 메서드 작성

여기서 지금 user의 entity 메서드를 작성중이다.

지금 고민중인 부분은 user가 소속된 team이 여러개일 수 있는데 이를 추가 제거하는 메서드를 어떻게 구현할지 고민중이다.

entity는 원활한 객체 그래프 탐색을 위해 서로 참조를 저장하고 있어 user에 team을 추가해주면 해당 team에도 user를 추가해줘야 하고 둘 사이의 user_team 에도 user와 team 를 추가해줘야한다.

이 부분은

public void setTeam(Team team){
        UserTeam userTeam = new UserTeam(this, team);
        this.userTeams.add(userTeam);
        team.getUserTeams().add(userTeam);
    }

이렇게 구현하려하고 있다.

문제는 유저가 팀에서 탈퇴했을 때 삭제 로직을 고민 중이다.

  1. user의 userTeams를 for문으로 돌면서 userTeam.getTeam() == 탈퇴하려는 team 일때 해당 userTeam 을 pop하는 방법

이 방법은 유저가 팀이 많을 경우 userTeam을 모두 탐색해야하는 되는 로직이 비효율적으로 보인다는 점

또 추가로 team에서도 team의 userTeams에서 해당 userTeam을 찾아서 삭제해줘야 한다는 점이 비효율적으로 보인다.

  1. userTeam을 cascade를 이용해서 em.remove() 하는 방법

이 경우에는 cascade를 이용해서 userTeam row를 삭제해도 user와 team의 userTeams에는 즉시 반영되지 않는 문제가 있다.

해결을 위해서 transaction을 flush 하는 방법도 있지만 remove할 때마다 flush를 하는 것이 효율적인지는 고민해봐야 할 것 같다.

좀 더 고민을 해봐야겠다.

profile
inho ha / ian(swatchon) / iha(42seoul)

0개의 댓글