연관관계와 관계형 DB 설계
관계형 DB 는 entity간의 relation이 중요
👉1:1 1:N N:1 M:N
이를 표현하기 위해 PK와 FK사용
@EnableJpaAuditing
자동으로 시간을 처리해주는 어노테이션
Application 클래스위에 작성
@ManyToOne
N:1 관계
ex) board : member 관계 (멤버 한명당 여러개의 글을 작성할 수 있다)
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString(exclude = "writer")
public class Board extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long bno;
private String title;
private String content;
@ManyToOne
private Member writer;//연관관계 지정
}
ToString -exclude를 해주는 이유는, 만약 Member클래스에도 Board를 호출한다면, //서로 계속 호출하면서 Stackoverflow가 발생한다. ('무한참조'라고도 함)
ex) Reply : Board -> N:1관계
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString(exclude = "board")
public class Reply extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long rno;
private String text;
private String replyer;
@ManyToOne
private Board board;
}
테스트 데이터 추가하기
1. MemberRepositoryTests
테스트데이터 100개 생성
@SpringBootTest
public class MemberRepositoryTests {
@Autowired
private MemberRepository memberRepository;
@Test
public void insertMembers() {
IntStream.rangeClosed(1,100).forEach(i -> {
Member member = Member.builder()
.email("user"+i+"@aaa.com")
.password("1111")
.name("USER"+i)
.build();
memberRepository.save(member);
});
}
}
⭐여기서 알아둬야할점⭐
Member클래스의 PK는 String타입인 email이다.
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString
public class Member extends BaseEntity {
@Id
private String email;
private String password;
private String name;
}
그래서 Reply나 Board 클래스처럼 PK위에
@GeneratedValue(strategy = GenerationType.IDENTITY)
가 붙지 않는다.
GeneratedValue는 int나 Long타입처럼 pk를 자동생성( Auto Increment )이 필요한 경우에만 사용한다.
따라서 위의 MemberRepositoryTests 에서 email을 직접 생성해주었다.
2. BoardRepositoryTests
멤버 하나당 하나의 글 작성
@SpringBootTest
public class BoardRepositoryTests {
@Autowired
private BoardRepository boardRepository;
@Test
public void insertMembers() {
IntStream.rangeClosed(1,100).forEach(i -> {
Member member = Member.builder()
.email("user"+i+"@aaa.com").build();
Board board = Board.builder()
.title("Title..."+i)
.content("Content..."+i)
.writer(member)
.build();
boardRepository.save(board);
});
}
}
Board객체는 Member객체가 우선 필요하다. (왜냐면 글의 글쓴이가 필요)
그래서 Member객체를 우선 만든다.
writer(member)가 가능한 이유는 아까 BoardRepository에서 @ManyToOne 부분을 작성해주어서
Board가 Member객체를 참조하고 있기 떄문이다.
'Spring Boot' 카테고리의 다른 글
[ Spring Boot ] N:1 (다대일) 연관관계 part2 (0) | 2024.08.01 |
---|---|
[ Spring Boot ] 스프링MVC & Thymeleaf part.3 (0) | 2024.07.30 |
[ Spring Boot ] 스프링MVC & Thymeleaf part.2 (0) | 2024.07.30 |
[ Spring Boot ] 스프링MVC & Thymeleaf part.1 (0) | 2024.07.30 |
[ Spring Boot ] @Query 어노테이션, Querydsl (0) | 2024.07.30 |