상세 컨텐츠

본문 제목

파일 업로드 및 그룹 생성 및 그룹 참가

SO_FIT

by myeongjaechoi 2024. 3. 29. 20:36

본문

우선 게시판에서 파일이 업로드가 가능하게 구성을 하기위해, 기존 게시판에서 finame, filepath, fileurl을 추가해줬다.

게시판에서 file이 추가된 모습

Repository는 수정할 내용이 없었고, Service에서 추가해줬다.

BulletinBoardService

projectPath는 파일이 저장되는 경로이다.

이때, 보안을 위하여, uuid를 통해 범용 고유 식별자를 추가해줬다.

이것을 통하여, file의 이름과, file 경로를 저장하였다.

저장은 되는데, 가져오는 것이 안 되는 문제가 있었다.

FileController

이때, ResponseEntity<InputStreamResource>를 반환하는데, 이것은 HTTP 응답을 나타낸다. 다운로드 할 파일의 내용이 포함되어있다.

String filePath = getFilePathById(id)는 다운로드할 파일의 경로를 가져오는 메서드를 호출한다. getFilePathById(id) 메서드는 파일의 고유 식별자를 사용하여 해당 파일의 경로를 검색한다.

InputStream inputStream = new FileInputStream(new File(filePath))는 파일을 읽어들이는데 사용될 InputStream을 생성한다. 이는 파일 시스템에서 파일을 읽어들이는 FileInputStream이다.

InputStreamResource resource = new InputStreamResource(inputStream)는 InputStream을 이용하여 InputStreamResource를 생성한다. 이것은 스프링에서 파일 다운로드를 위해 사용되는 리소스이다.

MediaType mediaType = MediaType.APPLICATION_OCTET_STREAM는 다운로드할 파일의 미디어 타입을 설정한다. 여기서는 일반적인 바이너리 파일을 다루므로 APPLICATION_OCTET_STREAM을 사용한다.

위에 것들은 내가 생각해서 해결하기에는 어려움이 있어, 구글링의 도움을 받았다.

그리고, 파일의 크기에 따라 저장이 안 되는 문제가 있어,

application.properties

이것을 통하여 파일 업로드를 10MB까지 늘려 해결하였다.

다음으로, 그룹 생성 및 참가이다. 이거는 오로지 나의 힘으로 해결했다! 이제 어느정도 코드들의 흐름이 보이기 시작했다.

group과 group_member 테이블을 분리할지 말지를 고민을 많이했다. group을 통해 member_id를 검색할 때와, member을 통해 group_id를 검색했을 때를 고려하였고, @ManyToMany 보다는 @OneToMany가 안정성에 더 낫다고 판단하여, group과 member, group_member 테이블을 각각 만들었다. group_member 테이블은 group_id와 member_id의 기본키를 참조하는 외래키를 가진다.

GroupMemberRepository
JpaGroupMemberRepository

너무 당연한 것들이다.

member_id와 Group_id를 통해, 해당 member와 group이 존재하면 group_member 테이블에 추가해주면 된다.

Join도 마찬가지이다. 다만 다른 점은, role의 차이다. group 생성자가 admin이고, 참가자가 게스트이기 때문에, 이것을 boolean형태로 true,false로 받아주었다.

GroupService

groupCreate는 이전에 필요했던, group_id와 member_id를 보내는 역할도 한다. 또한

groupJoin에서 그룹에 이미 들어갔던 회원이 중복으로 들어가는 문제가 발생하여, 이것을 방지하고자, 예외처리를 해주었다.

현재 이 프로젝트에서, 게시판(CRUD)를 제공하였고, 파일업로드, 그룹화를 맡고 있다.

다음 시간에는 그룹 인원수에 제한을 추가해주고, 그룹 삭제, 그룹 탈퇴를 추가해보겠다.

관련글 더보기