게시판의 게시물(Board)과 사용자(User)를 가정해 보자.
사용자 1명은 n개의 게시물 작성이 가능하며, 게시물 입장에서는 게시물 n개가 1명의 사용자에게 대응될 수 있다. 때문에 n대1 관계이다.
여기서는 Board와 User가 서로 조회하는 양방향 연결만을 다룬다.
@Entity
public class Board {
@Id // Key
private long bno; // 번호
private String title; // 제목
private String content; // 내용
private long viewCnt; // 조회수
@ManyToOne // FK 생성
@JoinColumn(name = "user_id", nullable = false) // inner join
private User user; // 사용자 = 작성자
}
@Entity
public class User {
@Id
@Column(name="user_id")
private String id; // 아이디
private String password; // 비밀번호
private String name; // 이름
private String email; // 이메일
private Date inDate; // 데이터 입력 날짜
private Date upDate; // 데이터 변경 날짜
@OneToMany(mappedBy = "user",fetch = FetchType.EAGER)
private List<Board> list = new ArrayList<>();
- 각 Entity 입장에서 @ManyToOne, @OneToMany 에너테이션을 붙인다.
Board는 n개 이므로 @ManyToOne / User는 1개 이므로 @OneToMany이다.
- EAGER - 두 엔티티 정보(user,board)를 같이 가져옴.(join)
LAZY - get 메서드를 통해서만 Entity 정보(board)를 따로 가져옴.- Defalut 값은 LAZY이며. 필요시에 Entity를 따로 요청하는 것이 더 효율적이다.
- LAZY로 설정한 경우, User입장에서 보면 바로 List<Board> list를 사용할 수 없고, get 메서드를 한 번 호출해야 한다.
user.getList();
- LAZY로 설정하는 경우, @Transactional 에너테이션을 사용하여 get 함수를 호출해야 한다.
- @Transactional이 붙은 메서드는 [ 지연 처리 ]가 발생하기에 작성한 코드 순서대로 실행되지 않는다. 따라서 트랜잭션 처리를 제대로 해야 한다.
이 방법은 추후에 학습해 보자.
- fetch는 @ManyToOne, @OneToMany 양쪽에 설정 가능하다.
- EAGER, LAZY 또한 양쪽에(User,Board) 개별적으로 EAGER,LAZY 설정이 가능하다.