테스트를 위해 아래의 코드를 생성 후 DB에 추가 했었다.
package com.yk.Motivation.domain.likeA.entity;
import com.yk.Motivation.base.jpa.baseEntity.BaseEntity;
import com.yk.Motivation.domain.article.entity.Article;
import com.yk.Motivation.domain.member.entity.Member;
import jakarta.persistence.Entity;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.*;
import lombok.experimental.SuperBuilder;
import static lombok.AccessLevel.PROTECTED;
@Entity // JPA Entity로 선언
@Setter // Lombok: Setter 자동 생성
@Getter // Lombok: Getter 자동 생성
@AllArgsConstructor(access = PROTECTED) // 모든 필드 값을 인자로 받는 생성자 생성
@NoArgsConstructor(access = PROTECTED)
@SuperBuilder // Lombok: Builder 패턴 구현
@ToString(callSuper = true) // Lombok: toString 메서드 오버라이드
public class LikeA extends BaseEntity {
@ManyToOne // JPA 어노테이션으로 Member 엔티티와 다대일 관계임을 나타냄.
@JoinColumn(name = "member_id") // 연관 엔티티의 FK 컬럼 이름을 명시함.
private Member member; // Member 엔티티를 참조하는 필드
@ManyToOne // JPA 어노테이션으로 Article 엔티티와 다대일 관계임을 나타냄.
@JoinColumn(name = "article_id")// 연관 엔티티의 FK 컬럼 이름을 명시함.
private Article article; // Article 엔티티를 참조하는 필드
// equals() 메서드를 오버라이드. member와 article을 기준으로 같은 객체인지 판별함.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof LikeA)) return false;
LikeA that = (LikeA) o;
if (!member.equals(that.member)) return false;
return article.equals(that.article);
}
// hashCode() 메서드를 오버라이드. member와 article을 기준으로 해시 코드를 생성함.
@Override
public int hashCode() {
int result = member.hashCode();
result = 31 * result + article.hashCode();
return result;
}
}
이 기능을 사용하지 않아서 인텔리제이에서 바로 코드를 삭제 후 다시 실행한 결과 에러가 났다.
at com.yk.Motivation.domain.member.service.MemberService.setEmailVerified(MemberService.java:244) ~[classes/:na]
오류를 gpt에게 검색한 결과
해결 방안:
MemberService.java의 244번째 줄을 확인하여, member 객체가 왜 null인지 원인을 파악합니다.
해당 member 객체가 null이 되지 않도록 적절한 검사나 초기화를 수행합니다. 예를 들어, 메서드 내에서 member가 null인지를 체크하는 코드를 추가할 수 있습니다.
나는 멤버를 수정한 적이 1번도 없는데 이 부분에서 에러가 나오는 이유가 궁금했다.
때문에 gpt에게 몇가지 코드를 준 후 다시 물어본 결과
제공해주신 LikeA 엔터티를 삭제하면 오류가 발생한다고 하셨는데, 그 원인은 다양할 수 있습니다. 다음과 같은 가능한 원인 및 확인 사항들을 나열해 보겠습니다:
DB 스키마와의 불일치:
데이터베이스 스키마에는 LikeA 테이블이 존재하는데, 해당 엔터티를 삭제하면 JPA는 더 이상 해당 테이블과 매핑되는 엔터티를 찾을 수 없습니다. 이로 인해 오류가 발생할 수 있습니다.
해결책: 데이터베이스 스키마와 JPA 엔터티의 일치를 확인하세요. 필요하다면, LikeA 테이블도 삭제하거나 관련 설정을 조정하세요.
그랬다... DB에서 삭제하지 않고 코드를 바로 삭제하면 알아서 될 것이라 생각하면 안됐다...
매핑에 관하여 하나 더 알게됐다.