@Entity
@Getter
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
...
@JsonIgnore
@OneToMany(mappedBy = "member")
private List<Interest> interests = new ArrayList<>();
}
@Entity
@Getter @Setter
public class Interest {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "interest_id")
private Long id;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@JsonIgnore
@ManyToOne
@JoinColumn(name = "attraction_id")
private Attraction attraction;
}
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class InterestService {
private final InterestRepository interestRepository;
private final MemberRepository memberRepository;
private final AttractionRepository attractionRepository;
@Transactional(readOnly = false)
public void registerInterest(Long memberId, List<Long> attractionIds) {
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 멤버 ID입니다"));
// 해당 회원 관심 지역 비우기
List<Interest> interests = member.getInterests();
for (Interest interest : interests) {
interestRepository.delete(interest);
}
// 새로운 관심 지역 등록
for (Long attractionId : attractionIds) {
Attraction attraction = attractionRepository.findById(attractionId)
.orElseThrow(() -> new IllegalArgumentException("Invalid attraction id"));
Interest interest = new Interest();
interest.setMember(member);
interest.setAttraction(attraction);
interestRepository.save(interest);
}
}
}
DB에서는 지워지지만 영속성 컨텍스트에서는 반영이 안됨.
영속성 컨텍스트 반영을 위해 줬다
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class InterestService {
private final InterestRepository interestRepository;
private final MemberRepository memberRepository;
private final AttractionRepository attractionRepository;
@Transactional(readOnly = false)
public void registerInterest(Long memberId, List<Long> attractionIds) {
Member member = memberRepository.findById(memberId)
.orElseThrow(() -> new IllegalArgumentException("유효하지 않은 멤버 ID입니다"));
// 해당 회원 관심 지역 비우기
List<Interest> interests = member.getInterests();
for (Interest interest : interests) {
interestRepository.delete(interest);
}
// 영속성 컨텍스트에 반영
member.clearInterest();
// 새로운 관심 지역 등록
for (Long attractionId : attractionIds) {
Attraction attraction = attractionRepository.findById(attractionId)
.orElseThrow(() -> new IllegalArgumentException("Invalid attraction id"));
Interest interest = new Interest();
interest.setMember(member);
interest.setAttraction(attraction);
interestRepository.save(interest);
member.getInterests().add(interest);
}
}
}
@Entity
@Getter
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "member_id")
private Long id;
...
@JsonIgnore
@OneToMany(mappedBy = "member")
private List<Interest> interests = new ArrayList<>();
@OneToMany(mappedBy = "member")
private List<Stamp> stamps = new ArrayList<>();
// 영속성 컨텍스트 비워주는 비지니스 메서드
public void clearInterest(){
this.interests = new ArrayList<>();
}
DB 반영 이후 영속성을 고려하지 않으면 후에 .. 대단한 장애를 보게 된다.