JPA - n대1 양방향 연결

Chang Hyeon Kim·2024년 3월 18일

게시판의 게시물(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 설정이 가능하다.
profile
생각을 구현 하자

0개의 댓글