리펙토링 상세 정리


3가지 작업을 수행하는 함수를 1가지 일을 하는 3개의 함수로 분리


리펙토링 내역

유효 기간 생성, URL Request 생성, Presigned URL 생성의 3가지 일을 하는 generatePresignedURL() 단일 함수를 유효 기간 설정 함수 getExpiration(), URL Request 생성 함수 generatePresignedUrlRequest(), 그리고 Presigned URL 생성 generatePresignedURL() 함수로 분리하여, 함수가 하나의 작업만 하도록 분리하였음

리펙토링 효과

함수의 가독성이 올라가 어떤 로직으로 함수와, 함수들이 작동하는지 쉽게 파악이 가능해졌음

리펙토링 PR Link

https://github.com/Whiteboard-Journey/asyncrum-backend/pull/41

레퍼런스

클린코드: 3장 함수 - 한 가지만 해라!

변경전

		/**
     * S3 Presigned URL 생성
     */
    public String generatePresignedURL(String uploadFileKey, String dirName, FileType fileType) {
        try {
            // Set the presigned URL to expire after 2 mins
            Date expiration = new Date();
            long expTimeMillis = Instant.now().toEpochMilli();
            expTimeMillis += 1000 * 60 * 2;
            expiration.setTime(expTimeMillis);

            // Generate the presigned URL Request
            GeneratePresignedUrlRequest generatePresignedUrlRequest =
                    new GeneratePresignedUrlRequest(bucket, buildFileName(uploadFileKey, dirName))
                            .withContentType(fileType.getContentType())
                            .withMethod(HttpMethod.PUT)
                            .withExpiration(expiration);

            // Add ACL
            generatePresignedUrlRequest.addRequestParameter(Headers.S3_CANNED_ACL, CannedAccessControlList.PublicRead.toString());

            // Generate the presigned URL
            URL preSignedURL = amazonS3Client.generatePresignedUrl(generatePresignedUrlRequest);

            log.info("Pre-Signed URL: " + preSignedURL.toString());

            return preSignedURL.toString();
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        }

        return null;
    }

변경후

/**
 * S3 Presigned URL 생성
 */
public String generatePresignedURL(String uploadFileKey, String dirName, FileType fileType) {
        try {
            GeneratePresignedUrlRequest generatePresignedUrlRequest = generatePresignedUrlRequest(uploadFileKey, dirName, fileType);
            URL preSignedURL = amazonS3Client.generatePresignedUrl(generatePresignedUrlRequest);

            return preSignedURL.toString();
        } catch (AmazonServiceException e) {
            e.printStackTrace();
            return null;
        }
    }
		/**
     * Presigned URL Request 생성
     */
    private GeneratePresignedUrlRequest generatePresignedUrlRequest(String uploadFileKey, String dirName, FileType fileType) {
        // 유효 기간 설정
        Date expiration = getExpiration();

        GeneratePresignedUrlRequest generatePresignedUrlRequest =
                new GeneratePresignedUrlRequest(bucket, buildFileName(uploadFileKey, dirName))
                        .withContentType(fileType.getMimeType())
                        .withMethod(HttpMethod.PUT)
                        .withExpiration(expiration);

        // 별도로 ACL 파라미터도 추가
        generatePresignedUrlRequest.addRequestParameter(Headers.S3_CANNED_ACL, CannedAccessControlList.PublicRead.toString());

        return generatePresignedUrlRequest;
    }
		/**
     * Presigned URL의 유효 기간 설정: 2분
     */
    private Date getExpiration() {
        Date expiration = new Date();
        long expTimeMillis = Instant.now().toEpochMilli();
        expTimeMillis += 1000 * 60 * 2;
        expiration.setTime(expTimeMillis);

        return expiration;
    }

AOP를 통한 핵심 로직과 예외처리 로직의 분리