[파일 업로드 개선] 파일 업로드 처리 메서드에 groupOid 매개변수 추가 및 관련 로직 수정. MemberRepository와 MemberService에서 불필요한 메서드 제거 및 활성화된 회원 조회 로직 개선.
This commit is contained in:
@@ -25,6 +25,8 @@ import java.nio.file.Paths;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.bio.bio_backend.global.utils.OidUtils.generateOid;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
@@ -52,7 +54,7 @@ public class FileServiceImpl implements FileService {
|
||||
}
|
||||
|
||||
// 파일 업로드 처리
|
||||
File savedFile = processFileUpload(multipartFile, requestDto.getDescription());
|
||||
File savedFile = processFileUpload(multipartFile, requestDto.getDescription(), generateOid());
|
||||
|
||||
// 응답 DTO 생성 및 반환
|
||||
return createUploadResponse(savedFile);
|
||||
@@ -75,6 +77,7 @@ public class FileServiceImpl implements FileService {
|
||||
int successCount = 0;
|
||||
int failureCount = 0;
|
||||
|
||||
Long groupOid = generateOid();
|
||||
for (MultipartFile multipartFile : files) {
|
||||
try {
|
||||
// 개별 파일 유효성 검사
|
||||
@@ -86,7 +89,7 @@ public class FileServiceImpl implements FileService {
|
||||
}
|
||||
|
||||
// 단일 파일 업로드 처리
|
||||
File savedFile = processFileUpload(multipartFile, requestDto.getDescription());
|
||||
File savedFile = processFileUpload(multipartFile, requestDto.getDescription(), groupOid);
|
||||
FileUploadResponseDto uploadedFile = createUploadResponse(savedFile);
|
||||
|
||||
uploadedFiles.add(uploadedFile);
|
||||
@@ -115,7 +118,7 @@ public class FileServiceImpl implements FileService {
|
||||
/**
|
||||
* 파일 업로드 처리
|
||||
*/
|
||||
private File processFileUpload(MultipartFile multipartFile, String description) {
|
||||
private File processFileUpload(MultipartFile multipartFile, String description, Long groupOid) {
|
||||
String originalFileName = FileUtils.cleanFileName(multipartFile.getOriginalFilename());
|
||||
|
||||
try {
|
||||
@@ -131,7 +134,7 @@ public class FileServiceImpl implements FileService {
|
||||
Path targetLocation = FileUtils.saveFileToDisk(multipartFile, uploadDir, storedFileName);
|
||||
|
||||
// DB에 파일 정보 저장
|
||||
File file = createFileEntity(originalFileName, storedFileName, targetLocation, multipartFile, description);
|
||||
File file = createFileEntity(originalFileName, storedFileName, targetLocation, multipartFile, description, groupOid);
|
||||
file.setCreator(SecurityUtils.getCurrentUserOid(), SecurityUtils.getCurrentUserId());
|
||||
|
||||
return fileRepository.save(file);
|
||||
@@ -143,7 +146,7 @@ public class FileServiceImpl implements FileService {
|
||||
}
|
||||
|
||||
private File createFileEntity(String originalFileName, String storedFileName, Path targetLocation,
|
||||
MultipartFile multipartFile, String description) {
|
||||
MultipartFile multipartFile, String description, Long groupOid) {
|
||||
return File.builder()
|
||||
.originalFileName(originalFileName)
|
||||
.storedFileName(storedFileName)
|
||||
@@ -151,7 +154,7 @@ public class FileServiceImpl implements FileService {
|
||||
.fileSize(multipartFile.getSize())
|
||||
.contentType(multipartFile.getContentType())
|
||||
.description(description)
|
||||
.groupOid(OidUtils.generateOid())
|
||||
.groupOid(groupOid)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
@@ -61,7 +61,6 @@ public class MemberController {
|
||||
try {
|
||||
String userId = SecurityUtils.getCurrentUserId();
|
||||
memberService.deleteRefreshToken(userId);
|
||||
|
||||
log.info("사용자 로그아웃 완료: {}", userId);
|
||||
|
||||
return ResponseEntity.ok(ApiResponseDto.success(ApiResponseCode.COMMON_SUCCESS));
|
||||
@@ -71,73 +70,4 @@ public class MemberController {
|
||||
.body(ApiResponseDto.fail(ApiResponseCode.COMMON_INTERNAL_SERVER_ERROR));
|
||||
}
|
||||
}
|
||||
|
||||
// @PostMapping("/member/list")
|
||||
// public ResponseEntity<List<ResponseMember>> getMemberList(@RequestBody(required = false) Map<String, String> params) {
|
||||
|
||||
// if(params == null){
|
||||
// params = new HashMap<>();
|
||||
// }
|
||||
|
||||
// Iterable<MemberDTO> memberList = memberService.selectMemberList(params);
|
||||
|
||||
// List<ResponseMember> result = new ArrayList<>();
|
||||
|
||||
// memberList.forEach(m -> {
|
||||
// result.add(new ModelMapper().map(m, ResponseMember.class));
|
||||
// });
|
||||
|
||||
// return ResponseEntity.status(HttpStatus.OK).body(result);
|
||||
// }
|
||||
|
||||
// @GetMapping("/member/{seq}")
|
||||
// public ResponseEntity<ResponseMember> selectMember(@PathVariable("seq") int seq) {
|
||||
|
||||
// MemberDTO member = memberService.selectMember(seq);
|
||||
|
||||
// ResponseMember responseMember = mapper.map(member, ResponseMember.class);
|
||||
|
||||
// return ResponseEntity.status(HttpStatus.OK).body(responseMember);
|
||||
// }
|
||||
|
||||
// @PutMapping("/member")
|
||||
// public ApiResponseDto<Void> updateMember(@RequestBody @Valid CreateMemberRequestDTO requestMember, @AuthenticationPrincipal MemberDTO registrant) {
|
||||
// // 현재 JWT는 사용자 id 값을 통하여 생성, 회원정보 변경 시 JWT 재발급 여부 검토
|
||||
|
||||
// MemberDTO member = mapper.map(requestMember, MemberDTO.class);
|
||||
|
||||
// if (requestMember.getPassword() != null) {
|
||||
// member.setPw(bCryptPasswordEncoder.encode(requestMember.getPassword()));
|
||||
// }
|
||||
|
||||
// member.setRegSeq(registrant.getSeq());
|
||||
// memberService.updateMember(member);
|
||||
|
||||
// return ApiResponseDto.success(ApiResponseCode.USER_INFO_CHANGE, null);
|
||||
// }
|
||||
|
||||
// @DeleteMapping("/member")
|
||||
// public ApiResponseDto<Void> deleteMember(@RequestBody @Valid CreateMemberRequestDTO requestMember){
|
||||
|
||||
// MemberDTO member = mapper.map(requestMember, MemberDTO.class);
|
||||
|
||||
// memberService.deleteMember(member);
|
||||
|
||||
// return ApiResponseDto.success(ApiResponseCode.USER_DELETE_SUCCESSFUL, null);
|
||||
// }
|
||||
|
||||
// @PostMapping("/logout")
|
||||
// public ApiResponseDto<Void> logout(@AuthenticationPrincipal MemberDTO member) {
|
||||
|
||||
// String id = member.getId();
|
||||
|
||||
// try {
|
||||
// memberService.deleteRefreshToken(id);
|
||||
// } catch (Exception e) {
|
||||
// return ApiResponseDto.fail(ApiResponseCode.INTERNAL_SERVER_ERROR, null);
|
||||
// }
|
||||
|
||||
// return ApiResponseDto.success(ApiResponseCode.LOGOUT_SUCCESSFUL, null);
|
||||
// }
|
||||
|
||||
}
|
||||
|
@@ -10,21 +10,6 @@ import java.util.List;
|
||||
@Repository
|
||||
public interface MemberRepository extends JpaRepository<Member, Long>, MemberRepositoryCustom {
|
||||
|
||||
// 사용자 ID로 회원 조회 (Optional 반환)
|
||||
Optional<Member> findByUserId(String userId);
|
||||
|
||||
// 사용자 ID로 첫 번째 회원 조회 (userId가 unique하지 않을 경우 대비)
|
||||
Optional<Member> findFirstByUserId(String userId);
|
||||
|
||||
// 사용자 ID로 활성화된 회원 조회
|
||||
Optional<Member> findByUserIdAndUseFlagTrue(String userId);
|
||||
|
||||
// 사용자 ID로 활성화된 회원 첫 번째 조회
|
||||
Optional<Member> findFirstByUserIdAndUseFlagTrue(String userId);
|
||||
|
||||
// 사용자 ID 존재 여부 확인 (활성화된 회원만)
|
||||
boolean existsByUserIdAndUseFlagTrue(String userId);
|
||||
|
||||
// 사용자 ID 존재 여부 확인
|
||||
boolean existsByUserId(String userId);
|
||||
|
||||
|
@@ -20,48 +20,4 @@ public interface MemberRepositoryCustom {
|
||||
* @return Optional<Member> 회원 정보 (없으면 empty)
|
||||
*/
|
||||
Optional<Member> findActiveMemberByUserId(String userId);
|
||||
|
||||
/**
|
||||
* 역할(Role)별로 회원 목록을 조회합니다.
|
||||
*
|
||||
* @param role 회원 역할
|
||||
* @return List<Member> 해당 역할을 가진 회원 목록
|
||||
*/
|
||||
List<Member> findByRole(String role);
|
||||
|
||||
/**
|
||||
* 사용 여부별로 회원 목록을 조회합니다.
|
||||
*
|
||||
* @param useFlag 사용 여부
|
||||
* @return List<Member> 해당 사용 여부를 가진 회원 목록
|
||||
*/
|
||||
List<Member> findByUseFlag(Boolean useFlag);
|
||||
|
||||
/**
|
||||
* 사용자 ID와 사용 여부로 회원을 조회합니다.
|
||||
*
|
||||
* @param userId 사용자 ID
|
||||
* @param useFlag 사용 여부
|
||||
* @return Optional<Member> 회원 정보
|
||||
*/
|
||||
Optional<Member> findByUserIdAndUseFlag(String userId, Boolean useFlag);
|
||||
|
||||
/**
|
||||
* 검색 조건에 따른 회원 목록을 페이징하여 조회합니다.
|
||||
*
|
||||
* @param userId 사용자 ID (부분 검색)
|
||||
* @param role 회원 역할
|
||||
* @param useFlag 사용 여부
|
||||
* @param pageable 페이징 정보
|
||||
* @return Page<Member> 페이징된 회원 목록
|
||||
*/
|
||||
Page<Member> findMembersByCondition(String userId, String role, Boolean useFlag, Pageable pageable);
|
||||
|
||||
/**
|
||||
* 마지막 로그인 시간이 특정 시간 이후인 회원들을 조회합니다.
|
||||
*
|
||||
* @param lastLoginAfter 마지막 로그인 기준 시간
|
||||
* @return List<Member> 해당 조건을 만족하는 회원 목록
|
||||
*/
|
||||
List<Member> findActiveMembersByLastLogin(java.time.LocalDateTime lastLoginAfter);
|
||||
}
|
||||
|
@@ -2,17 +2,10 @@ package com.bio.bio_backend.domain.base.member.repository;
|
||||
|
||||
import com.bio.bio_backend.domain.base.member.entity.Member;
|
||||
import com.bio.bio_backend.domain.base.member.entity.QMember;
|
||||
import com.bio.bio_backend.domain.base.member.enums.MemberRole;
|
||||
import com.querydsl.core.BooleanBuilder;
|
||||
import com.querydsl.jpa.impl.JPAQueryFactory;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageImpl;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
@@ -42,89 +35,4 @@ public class MemberRepositoryImpl implements MemberRepositoryCustom {
|
||||
|
||||
return Optional.ofNullable(foundMember);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Member> findByRole(String role) {
|
||||
// 역할별로 회원을 조회합니다.
|
||||
// String을 MemberRole enum으로 변환하여 비교합니다.
|
||||
return queryFactory
|
||||
.selectFrom(member)
|
||||
.where(member.role.eq(MemberRole.fromValue(role)))
|
||||
.fetch();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Member> findByUseFlag(Boolean useFlag) {
|
||||
// 사용 여부별로 회원을 조회합니다.
|
||||
return queryFactory
|
||||
.selectFrom(member)
|
||||
.where(member.useFlag.eq(useFlag))
|
||||
.fetch();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Member> findByUserIdAndUseFlag(String userId, Boolean useFlag) {
|
||||
// 사용자 ID와 사용 여부를 모두 만족하는 회원을 조회합니다.
|
||||
// and() 메서드를 사용하여 여러 조건을 결합합니다.
|
||||
Member foundMember = queryFactory
|
||||
.selectFrom(member)
|
||||
.where(member.userId.eq(userId)
|
||||
.and(member.useFlag.eq(useFlag)))
|
||||
.fetchOne();
|
||||
|
||||
return Optional.ofNullable(foundMember);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<Member> findMembersByCondition(String userId, String role, Boolean useFlag, Pageable pageable) {
|
||||
// BooleanBuilder를 사용하여 동적 쿼리를 구성합니다.
|
||||
// null이 아닌 조건만 쿼리에 포함시킵니다.
|
||||
BooleanBuilder builder = new BooleanBuilder();
|
||||
|
||||
// 사용자 ID가 제공된 경우 부분 검색 조건을 추가합니다.
|
||||
if (userId != null && !userId.trim().isEmpty()) {
|
||||
builder.and(member.userId.containsIgnoreCase(userId));
|
||||
}
|
||||
|
||||
// 역할이 제공된 경우 정확한 일치 조건을 추가합니다.
|
||||
if (role != null && !role.trim().isEmpty()) {
|
||||
builder.and(member.role.eq(MemberRole.fromValue(role)));
|
||||
}
|
||||
|
||||
// 사용 여부가 제공된 경우 정확한 일치 조건을 추가합니다.
|
||||
if (useFlag != null) {
|
||||
builder.and(member.useFlag.eq(useFlag));
|
||||
}
|
||||
|
||||
// 전체 개수를 조회합니다.
|
||||
long total = queryFactory
|
||||
.selectFrom(member)
|
||||
.where(builder)
|
||||
.fetchCount();
|
||||
|
||||
// 페이징 조건을 적용하여 결과를 조회합니다.
|
||||
List<Member> content = queryFactory
|
||||
.selectFrom(member)
|
||||
.where(builder)
|
||||
.orderBy(member.createdAt.desc()) // 생성일 기준 내림차순 정렬
|
||||
.offset(pageable.getOffset())
|
||||
.limit(pageable.getPageSize())
|
||||
.fetch();
|
||||
|
||||
// Page 객체를 생성하여 반환합니다.
|
||||
return new PageImpl<>(content, pageable, total);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Member> findActiveMembersByLastLogin(LocalDateTime lastLoginAfter) {
|
||||
// 마지막 로그인 시간이 특정 시간 이후인 활성 회원들을 조회합니다.
|
||||
// 여러 조건을 조합하여 복잡한 쿼리를 작성합니다.
|
||||
return queryFactory
|
||||
.selectFrom(member)
|
||||
.where(member.useFlag.eq(true) // 사용 중인 상태
|
||||
.and(member.lastLoginAt.isNotNull()) // 마지막 로그인 시간이 존재
|
||||
.and(member.lastLoginAt.after(lastLoginAfter))) // 특정 시간 이후
|
||||
.orderBy(member.lastLoginAt.desc()) // 마지막 로그인 시간 기준 내림차순 정렬
|
||||
.fetch();
|
||||
}
|
||||
}
|
||||
|
@@ -20,15 +20,5 @@ public interface MemberService extends UserDetailsService {
|
||||
|
||||
List<MemberDto> selectMemberList(Map<String, String> params);
|
||||
|
||||
MemberDto selectMember(long seq);
|
||||
|
||||
int updateMember(MemberDto member);
|
||||
|
||||
int deleteMember(MemberDto member);
|
||||
|
||||
/**
|
||||
* 현재 로그인한 사용자의 정보를 조회합니다.
|
||||
* @return 현재 사용자의 MemberDto
|
||||
*/
|
||||
MemberDto getCurrentMember();
|
||||
}
|
||||
|
@@ -8,7 +8,6 @@ import com.bio.bio_backend.domain.base.member.repository.MemberRepository;
|
||||
import com.bio.bio_backend.global.exception.ApiException;
|
||||
import com.bio.bio_backend.global.constants.ApiResponseCode;
|
||||
import com.bio.bio_backend.global.constants.AppConstants;
|
||||
import com.bio.bio_backend.global.utils.SecurityUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
@@ -36,11 +35,7 @@ public class MemberServiceImpl implements MemberService {
|
||||
public UserDetails loadUserByUsername(String id) throws UsernameNotFoundException {
|
||||
Member member = memberRepository.findActiveMemberByUserId(id)
|
||||
.orElseThrow(() -> new UsernameNotFoundException("사용자를 찾을 수 없습니다: " + id));
|
||||
|
||||
// MapStruct를 사용하여 Member 엔티티를 MemberDto로 변환
|
||||
MemberDto memberDto = memberMapper.toMemberDto(member);
|
||||
|
||||
return memberDto;
|
||||
return memberMapper.toMemberDto(member);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -71,7 +66,7 @@ public class MemberServiceImpl implements MemberService {
|
||||
@Override
|
||||
@Transactional
|
||||
public int updateMember(MemberDto memberDto) {
|
||||
Member member = memberRepository.findFirstByUserIdAndUseFlagTrue(memberDto.getUserId())
|
||||
Member member = memberRepository.findActiveMemberByUserId(memberDto.getUserId())
|
||||
.orElseThrow(() -> new ApiException(ApiResponseCode.USER_NOT_FOUND));
|
||||
|
||||
memberMapper.updateMemberFromDto(memberDto, member);
|
||||
@@ -81,7 +76,7 @@ public class MemberServiceImpl implements MemberService {
|
||||
|
||||
@Override
|
||||
public String getRefreshToken(String id) {
|
||||
Member member = memberRepository.findFirstByUserIdAndUseFlagTrue(id)
|
||||
Member member = memberRepository.findActiveMemberByUserId(id)
|
||||
.orElseThrow(() -> new ApiException(ApiResponseCode.USER_NOT_FOUND));
|
||||
|
||||
return member.getRefreshToken();
|
||||
@@ -90,12 +85,12 @@ public class MemberServiceImpl implements MemberService {
|
||||
@Override
|
||||
@Transactional
|
||||
public int deleteRefreshToken(String id) {
|
||||
Member member = memberRepository.findFirstByUserIdAndUseFlagTrue(id)
|
||||
Member member = memberRepository.findActiveMemberByUserId(id)
|
||||
.orElseThrow(() -> new ApiException(ApiResponseCode.USER_NOT_FOUND));
|
||||
|
||||
member.setRefreshToken(null);
|
||||
memberRepository.save(member);
|
||||
return 1; // 성공 시 1 반환
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -104,35 +99,4 @@ public class MemberServiceImpl implements MemberService {
|
||||
|
||||
return memberMapper.toMemberDtoList(members);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MemberDto selectMember(long seq) {
|
||||
// JPA 레파지토리를 사용하여 회원 조회
|
||||
Member member = memberRepository.findById(seq)
|
||||
.orElseThrow(() -> new RuntimeException("회원을 찾을 수 없습니다. seq: " + seq));
|
||||
|
||||
// MapStruct를 사용하여 Member 엔티티를 MemberDto로 자동 변환
|
||||
return memberMapper.toMemberDto(member);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public MemberDto getCurrentMember() {
|
||||
return SecurityUtils.getCurrentMember();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public int deleteMember(MemberDto memberDto) {
|
||||
Member member = memberRepository.findFirstByUserId(memberDto.getUserId())
|
||||
.orElseThrow(() -> new ApiException(ApiResponseCode.USER_NOT_FOUND));
|
||||
|
||||
member.setUseFlag(false);
|
||||
|
||||
log.info("회원 삭제 처리: {}", member.toString());
|
||||
|
||||
memberRepository.save(member);
|
||||
return 1; // 성공 시 1 반환
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user