그룹을 생성하려고 했는데 만들어둔 테이블을 보니 그룹에 참여하는 유저 정보를 한 엔티티에 받도록 설정해놨다..ㅎ
설계해둔거 제대로 확인 안 한 내 잘못이다..ㅎ
그래서 뒤늦게 테이블 설계부터 다시 했다
group과 group_rltn을 분리하여
user : group_rltn을 1:N으로, group : group_rltn을 1:N으로 분리해주었다.
테이블 설계는 했는데 이제 구현이 또 약간 바뀌게 되었다.
그룹 생성을 하게 되면 그룹 뿐만 아니라 거기에 포함된 유저들에 대해 관계도 또한 추가해주어야 했기 때문에 기존에 하던 것보다는 약간 복잡하게 느껴졌다.
error executing ddl create table via jdbc statement
테이블을 생성하며 에러가 났는데 Group 이란 테이블명이 사용이 안 되는 것 같다
Groupin으로 테이블명을 변경했더니 정상 작동했다!
그룹 생성을 누르면
1. 그룹이 생성됨 (Groupin - group name, group leader)
2. 참여자들이 해당 그룹에 대해 Relation을 갖게 됨 (GroupRelation - user, group)
1은 평범하게 해결됐는데 2가 어렵다.
user 중 status가 "승인 완료"로 된 user만 group_rltn에 데이터를 생성해주는 방식은 어떨까 생각하게 되어 해당 방식을 위해 우선 user status를 변경하는 기능을 구현해줬다.
프론트에서 체크를 누르면 "승인 완료"로 상태를 변경하고, 엑스를 누르면 "승인 거절"이 되도록 구현했다.
+) 체크와 엑스를 다시 누르면 "승인 대기 중"으로 다시 변경되도록 취소하는 기능도 구현해주었다 (사실 프론트에서 체크박스를 없애거나 하는 식으로 하고 싶었으나 프론트에서 이런 부분까지 해줄 여유가 도저히 없어 보여서 그냥 백에서 일단 해두게 되었다
고민...
지금 받아오는 데이터는 신청자 전원에 대한 데이터인데 이 중에 어떻게 딱 한 사람을 뽑아 그 사람 status만 변경하지
그냥 신청 테이블의 id값을 가져와서 status를 변경해주는 것으로 결정했다!
public GroupProposal admitApply(int proposalId){
GroupProposal applyUser = groupProposalRepository.findById(proposalId);
applyUser.setStatus("승인 완료");
return groupProposalRepository.save(applyUser);
}
이런 식으로 단순하게 처리해주었다.
승인 완료, 거절, 그리고 default인 대기 중으로 돌아가는 것까지 처리해주고 나서
List<GroupProposal> applyList = groupProposalRepository.findAllByBoardIdAndStatus(boardId, "승인 완료");
이렇게 해당 글에 들어온 신청 중 상태가 "승인 완료"인 사람들만 모아서 relation을 형성해주었다!
@RequestBody
Cannot construct instance of `org.springframework.web.multipart.MultipartFile 에러 처리하기
2022-08-14 02:16:16.044 WARN 72198 --- [nio-8080-exec-5] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.springframework.web.multipart.MultipartFile]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.web.multipart.MultipartFile` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information<EOL> at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 8, column: 18] (through reference chain: com.songpyeon.groupin.board.dto.BoardWriteDto["image_file"])]
2022-08-14 02:16:37.584 ERROR 72198 --- [nio-8080-exec-8] c.s.g.handler.GlobalExceptionHandler : handleException: Type definition error: [simple type, class org.springframework.web.multipart.MultipartFile]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.web.multipart.MultipartFile` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 8, column: 18] (through reference chain: com.songpyeon.groupin.board.dto.BoardWriteDto["image_file"])
2022-08-14 02:16:37.591 WARN 72198 --- [nio-8080-exec-8] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.springframework.web.multipart.MultipartFile]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.web.multipart.MultipartFile` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information<EOL> at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 8, column: 18] (through reference chain: com.songpyeon.groupin.board.dto.BoardWriteDto["image_file"])]
BoardWriteDto에서 이미지 파일을 받을 때 MultipartFile 타입으로 받아왔는데 해당 타입은 json에서 처리할 수 없기 때문에 에러가 났다
DTO의 MultipartFile로 지정했던 변수를 더 이상 사용하지 않으므로 삭제하고,
Controller에서 @RequestPart 를 사용하여 받아준다
@PostMapping("/{category}/write")
public ResponseEntity<Object> writePost(@PathVariable String category,
@RequestPart MultipartFile imageFile,
@RequestPart BoardWriteDto request,
@AuthenticationPrincipal PrincipalDetails principalDetails){
// 서비스 호출
Board boardEntity = boardService.savePost(category, imageFile, request, principalDetails);
return new ResponseEntity<>(boardEntity, HttpStatus.CREATED);
}
위 코드와 같이 MultipartFile과 json으로 데이터를 받을 부분을 분리해준 후 postman을 실행할 때,
사진과 같이 content type을 각각 지정해준 후, send하면 정상적으로 작동한다!
nullpointexception이 떴어서 어디가 문제인지 몰라 상당히 오래 헤맸는데 정말 예상치 못한 코드 부분이 오류가 났던 거라 놀랐다...
역시 print 찍어보는 게 짱이야(?)
의욕이 조금씩 떨어지고 있지만 그래도 곧 플젝 마무리 단계이므로 마지막까지 힘내야지..
어떻게든 결과물을 내고야 말겠다!!
이번 플젝 공부한 내용을 바탕으로 해커톤도 열심히 해야지..
그리고는 개강이겠지만..ㅎ
'Logs > Groupin 프로젝트 진행 일지' 카테고리의 다른 글
[Spring/Backend] 프로젝트 개발 5주차. 배포 지옥과 프로젝트 마무리 (0) | 2022.08.15 |
---|---|
[Spring/Backend] 프로젝트 개발 3주차. Query String vs 주소 매핑 (0) | 2022.08.07 |
[Spring/Backend] 프로젝트 개발 2주차. 로그인 에러 해결하기 (loadUserByUsername - null) (0) | 2022.07.27 |
[Spring/Backend] 프로젝트 개발 1주차. API 문서 작성하기 (0) | 2022.07.27 |