팀프로젝트 10일차
테스트 오류
Artist loginArtist = artistRepository.findByUserId(loginUser.getId())
.orElseThrow(() -> new NotFoundException(ARTIST_NOT_FOUND));
artist 가 feed 를 생성하는 테스트 진행시 이 부분에서 오류 발생
문제는 이전에는 성공했던 테스트라는 점이다
{
"code": 404,
"message": "아티스트를 찾을 수 없습니다.",
"httpStatus": "NOT_FOUND"
}
이런 메세지가 나와서 연관관계 확인함
//User 엔티티
@OneToOne
@JoinColumn(name = "artist_id")
private Artist artist;
//Artist 엔티티
@OneToOne(mappedBy = "artist")
private User user;
ERD 와는 반대로
User 테이블에서 Artist 를 컬럼으로 넣고 있었기 때문이었음
이거 때문에 내가 이해를 엉터리로 한 줄 알았는데 아니라서 다행이었음
ERD 처럼 하려면 Artist 엔티티에 mappedBy 가 없어져야 하고
@JoinColumn이 들어와야 함
그리고 User 에 있는 Artist 자체를 삭제해 버려야 단방향이 됨
@OneToOne(mappedBy = "user")
private Artist artist;
@OneToOne
@JoinColumn(name="user_id")
private User user;
가장 없어져야 할 최고의 원인 : 내가 남들보다 못한다는 생각으로 뭔가 안 되면 내 잘못이겠거니 하는 점
다행이었던 점 : 눈에 보이는 차이를 근거로 받아들이는 점
진짜 다행이다 내가 잘못 이해한 게 아니어서..
이 에러 발생때문에 팀 회의에 제대로 집중을 못 했는데..
comment 테스트도 못 했는데..
진짜 다행이다..ㅠㅠ
comment 작성 에러
{
"code": 500,
"message": "could not execute statement [Connection is read-only. Queries leading to data modification are not allowed] [/* insert for cohttp://m.example.fantreehouse.domain.comment.entity.Comment */insert into comment (contents,created_at,feed_id,likes_count,modified_at,user_id) values (?,?,?,?,?,?)]",
"httpStatus": "INTERNAL_SERVER_ERROR"
}
메서드 확인함
List<User> subscribers = foundFeed.getArtistGroup().getSubscriptionList().stream()
.map(Subscription::getUser).toList();
이 메서드를 구독자가 없는 artist가 사용하게 되면 당연히 에러가 날 수 밖에 없음
따라서 조건을 추가해 줘야 함
아티스트 중에서
1. 게시물 작성자인 경우
- 아티스트 그룹에서 나와졌을 수 있으므로 아티스트 그룹에 아직 잘 속해 있는지 확인 필요
2. 게시물 미작성자인 경우
- 구독자여야 작성 가능
User 중에서
1. 구독자인 경우, 작성 가능
2. 구독자가 아닌 경우, 작성 불가능
User 인 경우 구독자여야만 하고, Artist 인 경우 작성자 본인이거나, 본인이 아닌 경우 게시글의 구독자여야 함
아티스트의 중에서 1. 게시물의 작성자인 경우 그룹을 확인해야하는 이유는,
아티스트로 가입한다고 Feed 를 작성할 수 있는 것이 아니고, 아티스트스 그룹에 소속되어야 Feed 를 작성할 수 있게 된다
따라서 애초에 아티스트가 Feed를 작성하려면, 아티스트 그룹에 소속되어 있어야 하기때문에 댓글도 그 조건을 따라야만 하는 것이다
//소속그룹 생사 확인 <- 그룹이 사라지면 게시글도 모두 사라지기 때문
// (그룹이 생성되야 아티스트가 게시글 생성가능_즉, 댓글도 아티스트 그룹이 있어야 한다는 뜻)
ArtistGroup artistGroup = existArtistGroup(groupName);
//아티스트가 해당 아티스트 그룹에 속해있는지 확인 하기 위해 아티스트 정보 추출
//이유: 아티스트 그룹을 통해서 아티스트를 찾아 올 수 없는 구조이므로 (돌아가기)
Artist loginArtist = artistRepository.findByUserId(loginUser.getId())
.orElseThrow(() -> new NotFoundException(ARTIST_NOT_FOUND));
// 아티스트가 해당 아티스트 그룹에 속해있는지 최종 확인
if (!artistGroup.getArtists().contains(loginArtist)) {
throw new NotFoundException(FEED_NOT_FOUND);
}
그래서 이렇게 작성을 했는데
연관관계 설정을 다시 하면서
ArtistGroup 에서 artistList 를 참조할 수 있게 되었다
### 아티스트 feed 댓글 전체 조회
GET http://localhost:8080/{{groupName}}/feed/{{feedId}}?page=0
Authorization: {{Authorization}}
이걸 테스트하면
{
"code": 500,
"message": "Ambiguous handler methods mapped for '/seventeen/feed/1': {public org.springframework.http.ResponseEntity cohttp://m.example.fantreehouse.domain.comment.controller.CommentController.getComment(java.lang.String,java.lang.Long,com.example.fantreehouse.common.security.UserDetailsImpl,int), public org.springframework.http.ResponseEntity cohttp://m.example.fantreehouse.domain.feed.controller.FeedController.getFeed(java.lang.String,java.lang.Long,com.example.fantreehouse.common.security.UserDetailsImpl)}",
"httpStatus": "INTERNAL_SERVER_ERROR"
}
라는 오류가 발생함
@GetMapping("/comments")
으로 변경하고
### 아티스트 feed 댓글 전체 조회
GET http://localhost:8080/{{groupName}}/feed/{{feedId}}/comments?page=0
Authorization: {{Authorization}}
라고 하니 조회 성공
아티스트 Feed 에 comment를 작성하는 테스트를 하는 중
USER 권한인 경우 제대로 작동하지 않는 것을 발견했다
case USER: // USER 의 경우 - 구독 확인
if (!subscribers.contains(loginUser))
throw new UnAuthorizedException(NOT_SUBSCRIPT_USER);
break;
이렇게 작성해 놓았는데, 아무래도 contains 가 원인이다 싶어 찾아보니
contains 는 object 그 자체를 가지고 있는지 확인하는 용이라서 문제가 되었다
//ArtistGroup 엔티티
@OneToMany(mappedBy = "artistGroup")
private List<Subscription> subscriptionList = new ArrayList<>();
subscripntion 엔티티는 UserId 만 가지고 있지, user 자체를 들고 있지 않기 때문에 객체 비교가 불가능하다
case USER: // USER 의 경우 - 구독 확인
Long loginUserId = loginUser.getId();
boolean isSubscribed = subscribers.stream()
.anyMatch(user -> user.getId().equals(loginUserId));
if (!isSubscribed) {
throw new UnAuthorizedException(NOT_SUBSCRIPT_USER);
}
로 고치니 정상작동!