몬그로이

팀프로젝트 10일차 본문

Dev입성기

팀프로젝트 10일차

Mon Groy 2024. 7. 27. 21:03

테스트 오류

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);
    }

 

로 고치니 정상작동!

 


 

'Dev입성기' 카테고리의 다른 글

팀프로젝트 13일차, 14일차  (0) 2024.08.01
오늘 고민은 여기까지  (0) 2024.07.28
아니, 폭탄이 도사리고 있는데..요..?  (0) 2024.07.27
팀프로젝트 9일차  (0) 2024.07.26
프로젝트 8일차  (0) 2024.07.25