SPRING Annotaion(5)

Ga0·2023년 4월 18일
0

SPRING

목록 보기
9/14

Entity/Dto 관련 Annotaion

연관 관계 매핑

  • 다대일(N:1) : @ManyToOne
  • 일대다(1:N) : @OneToMany
  • 일대일(1:1) : @OneToOne
  • 다대다(N:M) : @ManyToMany

코드 예시

@ManyToOne

  • 다대일 관계를 의미한다.
    @ManyToOne // 다수가 하나에게 [fk ---> pk]
    @JoinColumn(name = "cno") //pk 이름 정하기
    @ToString.Exclude // 해당 필드는 @ToString 제외 필드[ * 양방향 필수]
    private CategoryEntity categoryEntity;
  • 게시물은 카테고리 하나만을 가질 수 있다.

@OneToMany

  • 일대다 관계를 의미한다.
    // 카테고리[Pk] <------> 게시물[FK]
    //PK 테이블에는 FK 흔적 남긴적이 없다. [ 필드 존재 X 객체 존재 O]
    @OneToMany(mappedBy = "categoryEntity") //하나가 다수에게 [PK --> FK]
    @Builder.Default //.builder 사용시 현재 필드 기본값으로 설정
    private List<BoardEntity> boardEntityList = new ArrayList<>();
  • 카테고리는 게시물을 여러개 가질 수 있다.

@JoinColumn

  • 외래키를 매핑할 때 사용한다.
  • name 속성에는 매핑할 외래 키 컬럼명(이름)을 지정한다.
  • referencedColumnName은 해당 외래키가 대상 테이블의 어떤 컬럼을 참조하는지 지정해주는 것
@ManyToOne
    @JoinColumn(name = "bno")
    @ToString.Exclude
    private BoardEntity boardEntity; //게시물 fk

@ToString.Exclude

@Getter @Setter @ToString
public class Member {

    private String name;
    private Board board; //Board 참조
}

@Getter @Setter @ToString
public class Board {

    private String title;
    private Member member; //Member 참조
}
  • 라고 가정했을 때, 양방향 매핑인 것을 알 수 있다.

//Member
@Override
public String toString() {
    return "Member{" +
           "name='" + name + '\'' +
           ", board=" + board +
           '}';
}

//Board
@Override
public String toString() {
    return "Board{" +
           "title='" + title + '\'' +
           ", member=" + member +
           '}';
}
  • ToString() 메소드를 썼을 때 서로 참조하기 때문에 무한반복하여 stackoverflow가 발생하게 된다.
  • 이를 해결하기 위해 @ToString.Exclude 어노테이션을 추가하여 해당 부분에 toString() 메소드를 제외시켜 에러를 막는다.

@Builder.Default

  • Builder는 값을 설정하지 않으면 자동으로 null을 채주는 anotation이다.
@Builder
@ToString
public class Member {
    private String mname;
    private int mage;
}


public class MemberInfo {

    public static void main(String[] args) {

        Member member = Member.builder()
                .mname("gy")
                .build();

        System.out.println(member.toString());
    }
}
  • 이 경우는 따로 Builder 값을 설정하지 않았으므로, mage는 null값이 자동으로 들어가게된다.
@Builder
@ToString
public class Member {
	@Builder.Default
    private String mname = "gayeong";
    @Builder.Default
    private int mage = 24;
}


public class MemberInfo {

    public static void main(String[] args) {

        Member member = Member.builder()
                .mname("gy")
                .build();

        System.out.println(member.toString());
    }
}
  • 이 경우는 @Builder.Default 값을 필드마다 지정해주었기 때문에 Builder()를 할때 값을 안넣어준 필드는 해당 @Builder.Default 밑에 지정한 값으로 자동 저장될 것이다. (기본값)
  • 즉 현 예시를 보면 mname("gy")라고 지정했지만 mage()는 지정하지 않았다. -> 이러한 경우 mage의 기본값인 24가 들어가게 된다.

0개의 댓글