@Entity:
@Table:
name = "users")@Id:
@Id 필드를 반드시 가져야 합니다.@GeneratedValue:
strategy = GenerationType.IDENTITY: 데이터베이스(e.g., MySQL의 AUTO_INCREMENT)에 기본 키 생성을 위임하는 방식으로, 가장 널리 사용됩니다.@Column:
name, nullable, unique, length 등의 속성을 통해 제약조건을 설정할 수 있습니다.@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "username", nullable = false, unique = true, length = 50)
private String username;
@Column(nullable = false)
private String password;
// ... Getters and Setters ...
}
방향 (Direction): 단방향, 양방향
Post → User)Post ↔ User)다중성 (Multiplicity): 일대일, 일대다, 다대일, 다대다
@OneToOne, @OneToMany, @ManyToOne, @ManyToMany연관관계의 주인 (Owner):
mappedBy 속성을 사용하여 "나는 주인이 아니며, 주인의 이 필드에 의해 매핑되었다"고 명시해야 합니다.@ManyToOne (다대일) - 가장 중요하고 흔한 관계설명: 여러 개의 Post가 하나의 User에 속하는 관계.
구현: Post 엔티티가 User를 참조하며, post 테이블에 user_id (FK)가 생성됩니다. N쪽인 Post가 연관관계의 주인이 됩니다.
// Post.java (N쪽, 연관관계의 주인)
@ManyToOne
@JoinColumn(name = "user_id") // 생성될 FK 컬럼 이름 지정
private User user;
// User.java (1쪽, 주인이 아님)
@OneToMany(mappedBy = "user") // Post 엔티티의 'user' 필드에 의해 매핑됨
private List<Post> posts = new ArrayList<>();
@OneToMany (일대다)@ManyToOne의 반대 방향. 보통 @ManyToOne과 함께 양방향 관계를 구성하는 데 사용됩니다.@OneToOne (일대일)User와 UserProfile처럼 하나의 엔티티가 다른 엔티티와 1:1로만 관계를 맺는 경우.@ManyToMany (다대다)Post와 Tag처럼, 하나의 게시글에 여러 태그가, 하나의 태그가 여러 게시글에 속할 수 있는 관계.@ManyToMany와 @JoinTable 어노테이션을 사용하면 JPA가 자동으로 중간 테이블을 생성하고 관리해줍니다.@ManyToMany를 직접 사용하기보다는, 중간 테이블에 해당하는 연결 엔티티(PostTag)를 직접 만들고, 이를 @ManyToOne + @OneToMany 관계로 풀어내는 "다대다 관계 해소" 방식을 더 선호합니다.@Entity는 DB 테이블과 매핑되는 Java 객체를 의미하며, @Id와 @GeneratedValue로 기본 키를 설정합니다.@ManyToOne이 붙은 쪽이 연관관계의 주인이 되는 것이 가장 일반적이고 중요한 패턴입니다.@ManyToMany는 실무에서 중간 테이블에 추가 데이터가 필요할 경우, 별도의 연결 엔티티를 만들어 풀어내는 것이 더 유연한 설계입니다.