Board.java
@Entity
@Data
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Valid
@Size(min=2, max=30, message = "제목은 2자이상 30자 이하입니다.")
private String title;
private String content;
@ManyToOne
@JoinColumn(name = "user_id")
@JsonIgnore
private User user;
}
게시글 입장에서 User와 다대일 관계이기 때문에 @ManyToOne 어노테이션 설정
join할 컬럼명은 Board테이블의 user_id
@JsonIgnore를 통해 직렬화할 때 해당 필드를 포함시키지 않는다.
(JsonIngnore를 설정하지 않으면 postman에서 테스트했을 때 json 데이터가 올바르게 들어가지 않는다.)
User.java
@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private Boolean enabled;
@ManyToMany
@JoinTable(
name = "user_role",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private List<Role> roles = new ArrayList<>();
// Board의 user 변수와 연결
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Board> boards = new ArrayList<>();
}
Board의 user를 mappedBy를 통해 연결해주고, cascade를 통해 연쇄적으로 수정, 삭제 등 작업이 이루어지도록 한다.
orphanRemoval은 보통 일대다 관계일 때 추가해주는 옵션으로 null 처리된 자식을 delete하고 insert한다.
orphanRemoval 사용을 위해서는 application.properties에 다음 옵션 추가
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
UserApiController
@PutMapping("/users/{id}")
User replaceUser(@RequestBody User newUser, @PathVariable Long id) {
return repository.findById(id)
.map(user -> {
// user.setTitle(newUser.getTitle());
// user.setContent(newUser.getContent());
// user.setBoards(newUser.getBoards());
user.getBoards().clear(); // 기존의 데이터 삭제
user.getBoards().addAll(newUser.getBoards()); // 지금 받은 데이터로 바꿈
for(Board board : user.getBoards()){
board.setUser(user);
}
return repository.save(user);
})
.orElseGet(() -> {
newUser.setId(id);
return repository.save(newUser);
});
}
'온라인 강좌 > 유튜브 강의' 카테고리의 다른 글
Spring Boot 12. 권한에 맞는 화면 구성 및 API 호출 (0) | 2024.02.20 |
---|---|
Spring Boot 11. JPA로 조회방법(FetchType) 설정하기 (0) | 2024.02.20 |
Spring Boot 9. Spring Security를 이용한 로그인 처리 (0) | 2024.02.19 |
Spring Boot 8. JPA를 이용한 페이지 처리 및 검색 (0) | 2024.02.19 |
Spring Boot 7. JPA를 이용한 RestfulAPI 작성 (0) | 2024.02.18 |