다른 객체와 구별되는 식별자를 두는 것을 엔티티라고 한다. 보통 db 테이블에 매핑하는 객체 또한 엔티티라고 부른다.
테이블과 완벽히 필드가 동일해야 엔티티라는 규칙이 있는 것은 아니다. 특정 테이블과 매핑되고 식별자를 가진다면 엔티티로 볼 수 있다.
db 테이블 내에 존재하는 칼럼만을 필드로 가져야하며(테이블에 존재하지 않는 칼럼을 가지면 안된다.) 상속 받거나 인터페이스를 구현하면 안된다.
아래와 같은 테이블이 있을때,
create table if not exists LINE
(
id bigint auto_increment not null,
name varchar(255) not null unique,
color varchar(20) not null,
primary key(id)
);
이런 경우는 엔티티로 볼 수 있지만
public class Line {
private Long id;
private String name;
private String color;
}
public class Line {
private Long id;
private String name;
}
아래의 경우는 엔티티로 볼 수 없다. Line 테이블이 Line 객체와 매핑된 상태인데, Sections라는 다른 필드로 구성된 객체가 있다면 엔티티로 보기 어렵다.
public class Line {
private Long id;
private String name;
private String color;
private Sections sections; // 다른 필드
}
엔티티의 id는 null로 설정해두고 db를 통해서 id를 받아오면 셋팅하도록 만든다. 임의로 -1값이라던가 다른 값을 주면 파악하기 힘들기 때문에 null을 사용하는 것이 낫다.
Line을 생성하기 위해 request로 아래와 같은 값이 들어왔다고 하자
public class Line {
private Long id;
private String color;
private String name;
// ...
}
{
"color": "bg-red-600",
"name": "신분당선"
}
그럼 service 단에서 db에 저장하기 전의 Line 엔티티는 아래와 같은 상태일 것이다. 이때 null이 아닌 다른 값을 주지 말자는 것이다.
Line(null, "bg-red-600", "신분당선")
db에 저장하고 나면 식별자가 생기게 된다.
Line(1L, "bg-red-600", "신분당선")
엔티티는 식별자를 가지고 있다. 따라서 동등성 비교시 식별자로만 비교해주면 된다. 즉 equals & hashcode를 재정의 할때 식별자 값만 비교해주면 된다!
착각: 엔티티의 필드타입을 DB 테이블의 타입과 맞춰야한다.
// 테이블
create table if not exists SECTION
(
id bigint auto_increment not null,
line_id bigint not null,
up_station_id bigint not null,
down_station_id bigint not null,
distance int,
primary key(id)
);
// 엔티티
public class Section {
private Long id;
private Long LineId;
private Long upStationId;
private Long downStationId;
private Integer distance;
}
굳이 타입을 맞출 필요는 없다. 각 Id를 가지고 있는 경우 오히려 데이터베이스에 의존적이게 된다. 객체를 가지게 해라
// 엔티티
public class Section {
private Long id;
private Line Line;
private Station upStation;
private Station downStation;
private int distance;
}
이렇게 테이블과 객체의 차이로 발생하는 문제가 패러다임 불일치이다. ORM(Object-Relational Mapping)은 객체와 관계형 db를 매핑 해주고 패러다임 불일치도 해결해준다.
JPA 쓰면 기본적으로 불변으로 만들 수 없다. 불변으로 만들 수 있는 방법이 있긴 하지만 나중에 실력이 늘었을때 시도해보고 추가해보는 것으로..🤔
A. 엔티티를 불변으로 바꾸셨군요? 지금 시점에선 굳이 불변으로 만들 필요가 있나 싶네요. JPA 쓰시면 불변으로 만들 수 없을거에요. 방법이 없는건 아니지만... 지금은 final을 제거하고 진행하시고 객체지향에 좀더 익숙해졌을 때 불변으로 만들어보아요.