Spring Data JPA 연관 관계 매핑

oceann·2023년 11월 21일

연관 관계에는 일대일, 다대일, 일대다, 다대다 총 네 가지로 볼 수 있는데, 다대다는 섞일 위험이 있어 잘 쓰지 않으니 일대일, 다대일, 일대다를 주로 쓴다.

나는 사용자(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됨

profile
🌈🌼🌸☀️

0개의 댓글