[정리] Entity(엔티티)

Junseo Kim·2021년 5월 18일
0

📚 개념 정리

목록 보기
2/3
post-thumbnail

Entity란?

다른 객체와 구별되는 식별자를 두는 것을 엔티티라고 한다. 보통 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; // 다른 필드
}

Entity Id필드

엔티티의 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를 매핑 해주고 패러다임 불일치도 해결해준다.

Entity의 불변 객체화

JPA 쓰면 기본적으로 불변으로 만들 수 없다. 불변으로 만들 수 있는 방법이 있긴 하지만 나중에 실력이 늘었을때 시도해보고 추가해보는 것으로..🤔

A. 엔티티를 불변으로 바꾸셨군요? 지금 시점에선 굳이 불변으로 만들 필요가 있나 싶네요. JPA 쓰시면 불변으로 만들 수 없을거에요. 방법이 없는건 아니지만... 지금은 final을 제거하고 진행하시고 객체지향에 좀더 익숙해졌을 때 불변으로 만들어보아요.

1개의 댓글