엔티티는 위 코드처럼 ManyToOne <-> OneToMany 관계를 가지며 Member 엔티티의 상태를 표현하는 MemberStatus enum 클래스로 NORMAL, BAN status를 갖습니다. 일반적인 Member의 조회는 NORMAL인 status를 기준으로 한다고 가정했을 경우 엔티티 조회에서 where status = 'NOMAL'의 조건이 추가되어야 합니다. 이런 경우 @Where을 사용하면 유용합니다. 테스트 코드를 통해서 살펴보겠습니다.
Test Code
Member
1 2 3 4 5 6 7 8 9 10 11 12 13
@Test internalfun `where sql MemberStatus BAN test`() { //given val teamA = save(Team("teamA")) val memberId = save(Member("name", 10, MemberStatus.BAN, teamA)).id!!
//when val member = memberRepository.findById(memberId)
member의 조회는 findById 즉 PK로 찾는 코드지만 @Where(clause = "status = 'NORMAL'")으로 인해서 SQL 로그를 보면 where 조건에 member0_.status = 'NORMAL '가 추가된 것을 확인할 수 있습니다. MemberStatus.BAN상태로 Member를 저장했기 때문에 조회 여부는 false인 것을 확인할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13
@Test internalfun `where sql MemberStatus NORMAL test`() { //given val teamA = save(Team("teamA")) val memberId = save(Member("name", 10, MemberStatus.NORMAL, teamA)).id!!
//when val member = memberRepository.findById(memberId)