1️⃣ 문제
Schedule과 User와 N:1관계이므로 @ManytoOne을 명시해주고 포스트맨으로 사용자 삭제를 요청했다 하지만 외래키 관계여서 삭제가 안된다고 한다
2️⃣원인
Schedule와 User 관계만 설정해주고 User-> Schedule관계를 설정해주지 않았다. 즉 양뱡향 관계를 하지않았다.
그래서 @OneToMany로 1:N관계를 명시해주고 다시 포스트맨으로 삭제요청을 했지만 작동하지 않았다.
mappedBy("schedule") -> mappedBy("user")로 변경했다. 그 후 사용자 삭제 시 연쇄 적으로 댓글과 일정이 잘 삭제 되는 것을 확인 내가 알고 있는 지식으로는 mappedBy가 연관관계 주인이 아니라면 mappedBy를 사용한다고 알고 있는데 user가 주인으로 인지를 했어서 다시 관련 내용을 살펴 보았다.
mappedBy는 JPA양방향 연관관계 설정 시 사용되는 속성으로 두 엔티티 간의 관계에서 연관 관계의 주인이 아닌 쪽에서 선언한다.
연관관계 주인이란 두 객체 연관관계 중 하나를 정해서 테이블의 외래키를 관리해야 하는데 이것을 연관관계 주인이라고 한다. 연관 관계 주인 만이 데이터 베이스 연관관계와 매핑되고 외래 키를 관리 할수 있다.
내가 이해 한 바로는 mappedBy = 여기에 적힐 부분이 연관관계 주인 같고 이 어노테이션을 사용한 쪽이 연관관계 주인이 아닌것 같은 걸로 이해 한것 같다.
3️⃣해결
올바르게 삭제가 되었다.
1️⃣ 문제
일정 페이징 조회에서 댓글 개수를 구하지 못하는 문제가 발생 -> 튜터님께 질문을 드리러 갔다.
select schedule.schedule_id,
schedule.user_id,
schedule.title,
schedule.content,
(Select Count(comment.content) AS comment_count
FROM comment
where comment.schedule_id = schedule.schedule_id)
from schedule
;
2️⃣원인
Select Count(comment.content) AS comment_count는 Count( comment.content )의 별칭만 달아 주는 것이지 결과에는 아무 영향을 끼치지 않음
select schedule.schedule_id,
schedule.user_id,
schedule.title,
schedule.content,
(Select Count(comment.content)
FROM comment
where comment.schedule_id = schedule.schedule_id) as comment_count
from schedule
;
위 sql문 처럼 (Select Count(comment.content)
FROM comment
where comment.schedule_id = schedule.schedule_id)는 comment테이블을 조회를 할건데 조건이 comment의 schedule_id와 schedule테이블의 scedule아이디가 같은 content의 합계를 구하는 select문장이다
위 와 다르게 서브 select문의 결과 값의 이름이 comment_count이므로 문제가 해결 올바르게 컬럼이 comment_count로 생겨남
postman으로 요청을 할때 내가 전에 했을 때는 contentcount가 null이 였고 그후 에는 필요가 없는 컬럼에 대한 오류가 발생(created_at이 없다는 에러)
해결 방안 1. 서비스 영역에서 steam을 사용하여 변환 후 반환
해결방안 2. 쿼리문을 새로 짜기
튜터님과 이야기 후 해결방안 1이 아직 익숙치 않아서 해결 방안 2로 진행하였다
3️⃣해결
select s.schedule_id, s.user_id, s.title, s.content, s.created_at, s.updated_at,
(SELECT COUNT(content) FROM comment c WHERE c.schedule_id = s.schedule_id) AS comment_count
FROM schedule s ORDER BY s.updated_at DESC;", nativeQuery = true)
이 sql문을 이해 하자면 comment = c,schedule =s로 둔다
schedule테이블의 schedule의 스케줄아이디, schedule의 유저아이디, schedule의 content, schedule의 생성일시, schedule의 변경일시 ,comment테이블의 comment의 스케줄아이디값과 schedule의 스케줄의 아이디값이 같은 content의 합(이름 ㅣ comment) 조회 할건데 스케줄테이블의 수정일시를 기준으로 내림차순으로 조회를 한다.
수정일시를 기준으로 하니까 조회하는 값에 꼭수정일시가 있어야한다.
4️⃣결과
comment가 널이 뜨지 않고 잘 동작한다.
'TIL' 카테고리의 다른 글
[TIL] 스파르타 백엔드 캠프 (0) | 2024.12.10 |
---|---|
[TIL] 스파르타 백엔드 캠프 & 트러블 슈팅 (2) | 2024.11.28 |
[TIL] 스파르타 백엔드 캠프 & 트러블 슈팅 (1) | 2024.11.08 |
[TIL] 스파르타 백엔드 캠프 (1) | 2024.11.06 |
[TIL] 스파르타 백엔드 캠프 (0) | 2024.11.05 |