카테고리를 해보자.

자기 자신을 셀프 맵핑 하는 것은 어떻게 할까?

@Entity
@Getter @Setter
public class Category {

	@Id @GeneratedValue
	@Column(name = "category_id")
	private Long id;

	private String name;

	@ManyToMany
	@JoinTable(name = "category_item",
			joinColumns = @JoinColumn(name = "category_id"),
			inverseJoinColumns = @JoinColumn(name = "item_id"))
	private List<Item> items = new ArrayList<>();

	@ManyToOne
	@JoinColumn(name = "parent_id")
	private Category parent;

	@OneToMany(mappedBy = "parent")
	private List<Category> child = new ArrayList<>();
}

엔티티 개발

이론적으로 Getter, Setter 모두 제공하지 않고, 꼭 필요한 별도의 메소드를 제공하는 게 이상적이다. 하지만 실무에서 엔티티의 데이터 조회는 빈번하다. 그래서 열어 줄 수 밖에 없다.

그치만 Setter는 신중하게 열어야 한다. Setter보다는 별도의 변경 용 메소드를 제공하는 것이 좋다.

id는 이름을 명확하게 하는 것이 나중에 보기 좋다. 테이블명_id

값 타입(Address)은 변경이 되면 안된다. 생성만 가능해야 한다. JPA 스펙상 기본 생성자가 있어야 한다. protected로 하나 넣어 두자.

@Embeddable
@Getter @Builder
public class Address {

	private String city;

	private String street;

	private String zipcode;

	protected Address() { }
}