연관 관계에는 일대일, 다대일, 일대다, 다대다 총 네 가지로 볼 수 있는데, 다대다는 섞일 위험이 있어 잘 쓰지 않으니 일대일, 다대일, 일대다를 주로 쓴다.
나는 사용자(User)가 여러 장소를 즐겨찾기(Favorite)로 등록할 수 있고, 여러 개의 장소 개설 요청(Request)를 보낼 수 있으므로 User : Favorite, User : Request를 각각 일대다 관계로 매핑할 것이다.
sql은 ‘다’ 쪽에 외래키를 갖고 있기 때문에 일대다 단방향일 경우 ‘일’ 쪽에서 UPDATE를 할 때 ‘다’ 쪽 테이블에 여러 번 query하는 경우가 생긴다. 따라서 나는 ‘다’ 쪽인 Request에 외래 키를 둘 생각! 이때 User가 Request를 조회하기는 하지만, Request에서 user를 조회하지 않으므로 단방향이다. (근데 어차피 Request에서 fk를 가져와서 UserEntity에 접근한다면 어차피 양방향 조회는 가능..)
UserEntity
package com.founder.easy_route_assistant.Entity;
import com.founder.easy_route_assistant.DTO.UserDTO;
import jakarta.persistence.*;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.security.crypto.password.PasswordEncoder;
@Entity
@Getter @Setter
@NoArgsConstructor
@Table(name = "user")
public class UserEntity {
// @GeneratedValue(strategy = GenerationType.IDENTITY) 지금은 안 쓸 건데 자동으로 값 1씩 증가해주며, pk 속성을 가짐
@Id // primary key
private String userID;
@Column(length = 100)
private String pwd;
@Column(length = 100)
private String userName;
@Column(length = 100)
private String userEmail;
@Builder
public static UserEntity toUserEntity(UserDTO userDTO) {
UserEntity userEntity = new UserEntity();
userEntity.userID = userDTO.getUserID();
userEntity.pwd = userDTO.getPwd();
userEntity.userName = userDTO.getUserName();
userEntity.userEmail = userDTO.getUserEmail();
return userEntity;
}
}
RequestEntity
package com.founder.easy_route_assistant.Entity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
@Entity
@Getter @Setter
@NoArgsConstructor
@Table(name="request")
public class RequestEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column
private String title;
@Column
private String content;
@Column
private Boolean accepted = false;
@ManyToOne
@JoinColumn(name="userid")
private UserEntity userEntity;
}
RequestEntity에서 UserEntity로 선언해놓고 @JoinColumn으로 참조할 column명을 지정해주면 알아서 join됨