코딩하는 털보

21.11.07 TIL 본문

Diary/Today I Learned

21.11.07 TIL

이정인 2021. 11. 8. 01:18

편의 메서드

User

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Habit> habit;

Habit

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    @JsonIgnore
    private User user;

User와 Habit은 다대일 양방향 관계이며 관계의 주인은 Habit이다.
연관관계의 주인이 Habit이기 때문에 정상적인 외래키 관리는 Habit의 setUser() 메서드를 사용한다.

    protected void setUser(User user) {
        this.user = user;
    }

동일한 트랜젝션 내 1차캐시에서 setUser를 사용한 persist 상태의 Habit을 통해서 User를 확인할 수 있다.

HabitWithCounter habit = (HabitWithCounter) Habit.createHabit(habitTypeDto.getHabitType(), createHabitRequestDto, user);
habitRepository.save(habit);
User owner = habit.getUser();

하지만 반대로 1차 캐시의 User의 habit에는 아직 새로 생성된 습관이 추가되지 않은 상태 일 것이다.
만약 user에서 다시 habit을 조회하는 로직이 필요하지 않거나 user를 DB에서 다시 조회한다면 문제는 없지만
그렇지 않다면 편의 메서드를 통해서 직접 집어 넣는 과정을 추가할 수 있다.

    protected void setUser(User user) {
        this.user = user;
        user.getHabit().add(this);
    }

이렇게 편의 메서드에 user의 List에도 생성될 습관을 추가해주면 이후에 user.habit을 조회할 때 1차 캐시에서도 추가된 습관을 조회할 수 있다.

Comments