Presigned URL ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ์™œ ์ ์šฉํ–ˆ๋ƒ๋ฉด์š”.

2025. 6. 1. 00:15ยท๐Ÿ“‚ backend/spring
ํ•ด๋‹น ๋‚ด์šฉ์€ ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€ํ† ํ–ˆ๋˜ ๊ธฐ์ˆ ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๊ด€ํ•œ ๋‚ด์šฉ์— ๊ด€ํ•œ ๊ธฐ๋ก์ด๋‹ค.

 

1. ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๊ธฐ์ˆ  ๊ฒ€ํ† 

 ๊ฒŒ์‹œ๊ธ€  ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•ด ํŒŒ์ผ์„ ๋ฏธ๋ฆฌ ์—…๋กœ๋“œํ•˜๊ณ  ๊ฒŒ์‹œ๊ธ€์— ๊ด€ํ•œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌ์„ฑํ–ˆ๋‹ค.

๊ฒŒ์‹œ๊ธ€์„ ์ €์žฅํ•˜๋Š” ์‹œ์ ์— ํŒŒ์ผ ์ผ๊ด„ ์—…๋กœ๋“œ๋ฅผ ํ•˜๋ฉด ์‘๋‹ต ์ง€์—ฐ์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์•…์˜ํ–ฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ ์ด ๊ทธ ์ด์œ ์˜€๋‹ค.

 

์ด๋ฅผ ์œ„ํ•ด Multipart file ์™€ Presigned URL ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์˜ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ์žฅ๋‹จ์ ์„ ๋น„๊ตํ–ˆ๋‹ค.

 

2. Multipart File?

multipart ๋Š” ํ•˜๋‚˜์˜ HTTP ์š”์ฒญ ๋ฐ”๋””์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒํŠธ(๋ถ€๋ถ„) ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” MIME ํƒ€์ž…์ด๋‹ค.

ํ•˜๋‚˜์˜ ๋ฉ”์‹œ์ง€ ๋ณธ๋ฌธ ์•ˆ์— ์—ฌ๋Ÿฌ ํŒŒํŠธ๋ฅผ ๊ฒฝ๊ณ„๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ฃผ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ, ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ์™€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ์— ์ „์†กํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. 

 

๋ชจ๋“  multipart ํƒ€์ž…์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด boundary parameter ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋ฐ”์šด๋”๋ฆฌ ํ•˜๋‹จ์— ์ปจํ…์ธ  ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ณ , ์š”์ฒญ ๋ฐ”๋””์— ์ฒจ๋ถ€ํ•  ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค.

๋งŒ์•ฝ ๋™์˜์ƒ, ์ด๋ฏธ์ง€ ํŒŒ์ผ์ธ ๊ฒฝ์šฐ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜๋˜์–ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค. 

 

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด์ž.

์ƒ๋‹จ์˜ Content-type ์ด multipart/form-data ์„ ์„ ์–ธํ•ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ๊ฒƒ์ž„์„ ๋ช…์‹œํ•œ๋‹ค.

 

๊ฐ ์—…๋กœ๋“œ ํ•  ํŒŒ์ผ๋“ค์€ boundary๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

boundary ํ•˜๋‹จ์— ์—…๋กœ๋“œํ•  ํŒŒ์ผ ํƒ€์ž…์„ Content-type ํ—ค๋”๋ฅผ ์ •์˜ํ•œ ํ›„, ์ „๋‹ฌํ•  ํƒ€์ž…์˜ ํŒŒ์ผ์„ ์ฒจ๋ถ€ํ•ด ์ „์†กํ•œ๋‹ค.

 

ํ•˜์ง€๋งŒ, Multipart ๋Š” ์„œ๋ฒ„๊ฐ€ ํŒŒ์ผ์„ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„์—์„œํŒŒ์ผ์„๋ณต์‚ฌํ•ด์„œ์ž„์‹œ๋ณด๊ด€ํ•ด์•ผ ํ•œ๋‹ค. 

์ด๋Š” ์„œ๋ฒ„ ๋ถ€ํ•˜์™€ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ์— ์žˆ์–ด ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

Multipart/form-data ๋ฐฉ์‹ HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€

 

 

3. Presigned URL?

Presigned URL ์€ ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€(์˜ˆ: AWS S3, Google Cloud Storage ๋“ฑ)์—์„œ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์ œํ•œ๋œ ์‹œ๊ฐ„ ๋™์•ˆ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋Š” ์ผ์‹œ์ ์ธ URL ์ด๋‹ค.

์ธ์ฆ๋œ URL๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ ๋˜๋Š” ์—…๋กœ๋“œํ•˜๊ณ , ์ œํ•œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด URL์ด ๋งŒ๋ฃŒ๋˜์–ด ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ์žฅ์ ์ด ์žˆ๋‹ค.

 

Presigned URL์„ ๋™์ž‘ ๋ฐฉ์‹์„ ํ™•์ธํ•ด๋ณด์ž.

ํด๋ผ๋ฆฌ์–ธํŠธ๋Š” ํด๋ผ์šฐ๋“œ๋กœ ๋ถ€ํ„ฐ ์กฐํšŒ ๋˜๋Š” ์—…๋กœ๋“œ ๋ชฉ์ ์˜ URL์„ ์š”์ฒญํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ์ž์ž„์„ ํš์ธํ•œ ํ›„์— Presigned URL ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

Presigned URL ์„ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ ์—…๋กœ๋“œ์— ๊ด€ํ•œ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

์ž„์‹œ ๋งํฌ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ S3๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ํ•˜์—ฌ API์„œ๋ฒ„์— ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

API ์„œ๋ฒ„๋Š” ์ธ์ฆ๋œ ๊ฐ’์„ ํ†ตํ•ด S3 ๋กœ ๋ถ€ํ„ฐ ์ž„์‹œ ๋งํฌ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋งŒ ํ•˜๊ณ ,

ํด๋ผ์ด์–ธํŠธ๋Š” ์ž„์‹œ ๋งํฌ๋ฅผ ํ†ตํ•ด ์ง์ ‘ S3 ๋กœ ์—…๋กœ๋“œํ•œ๋‹ค. ์•„๋ž˜์—์„œ ์‹ค์ œ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๋„๋ก ํ•˜์ž.

Presigned URL ์‹œํ€€์Šค

 

 

 

4. Multipart File vs Presigned URL ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ž.

(1) ํ…Œ์ŠคํŠธ ์œ„ํ•œ ์˜์กด์„ฑ ์„ค์ •

 ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด spring ์—์„œ ์ œ๊ณตํ•˜๋Š” Spring Cloud AWS ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. Spring Cloud AWS ๋Š” AWS SDK ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ S3 ์™€ ๊ด€๋ จ๋œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ ์—ฐ๊ฒฐ ์„ค์ •๊ณผ ๊ด€๋ จ๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•ด ํŽธ๋ฆฌํ•˜๊ฒŒ AWS ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

dependencies {
   implementation 'io.awspring.cloud:spring-cloud-aws-starter-s3:3.0.0'
}

 

(2) ํ…Œ์ŠคํŠธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง

import java.io.IOException;
import java.net.URL;
import java.time.Duration;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import io.awspring.cloud.s3.S3Resource;
import io.awspring.cloud.s3.S3Template;
import lombok.RequiredArgsConstructor;

import com.cooper.presigned_url.service.FileHandler;

@Component
@RequiredArgsConstructor
public class AwsS3FileHandler implements FileHandler {

	@Value("${aws.bucket.name}")
	private String bucketName;

	private final S3Template s3Template;

	@Override
	public URL createSignedUrl(final Long postId, final String fileName) {
		final String filePath = String.format("%s/%s", postId, fileName);
		return s3Template.createSignedPutURL(bucketName, filePath, Duration.ofMinutes(1));
	}

	@Override
	public URL getSignedUrl(final Long postId, final String path) {
		String key = path.replaceFirst("^/", ""); // object key ๋Š” path ์•ž์— / ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•œ๋‹ค.
		return s3Template.createSignedGetURL(bucketName, key, Duration.ofMinutes(1));
	}

	@Override
	public URL uploadFile(final Long postId, final MultipartFile file) throws IOException {
		final String fileName = file.getOriginalFilename();
		final String filePath = String.format("%s/%s", postId, fileName);
		final S3Resource s3Resource = s3Template.upload(bucketName, filePath, file.getInputStream());
		return s3Resource.getURL();
	}
}

 

 

(3) AWS ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ

Multipart Filter ๊ณผ Presigned URL ์˜ CPU ์‚ฌ์šฉ๋Ÿ‰ ๋น„๊ต๋ฅผ ์œ„ํ•ด AWS EC2 t3.micro ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค. 

 

 

(4) CPU Utilization, Packet ์ „์†ก๋Ÿ‰ ๋น„๊ต

5MB ์‚ฌ์ด์ฆˆ์˜ pdf ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•˜๊ณ  Cloudwatch ๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ–ˆ๋‹ค.

 

๋‹จ์ผ ์š”์ฒญ์˜ ๋‹จ์ผ ํŒŒ์ผ ์—…๋กœ๋“œ ๋น„๊ต ๊ฒฐ๊ณผ,

CPU Utilization ์—์„œ 10๋ฐฐ ์ ์€ CPU ์‚ฌ์šฉํ–ˆ๊ณ , Network I/O ํŒจํ‚ท ์ˆ˜๊ฐ€ 400๋ฐฐ ์ ๊ฒŒ ํŒจํ‚ท์„ ์†ก์ˆ˜์‹ ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

 

๋น„๋ก, ํด๋ผ์ด์–ธํŠธ์—์„œ S3 ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œํ•˜๋Š” ๊ณผ์ •์—์„œ ์ „์†ก๋œ ํŒจํ‚ท์ด ํฌํ•จ๋˜์ง€ ์•Š์•˜์ง€๋งŒ

ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ ๋‹ค๋Ÿ‰์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด๋ณด์•˜์„ ๋•Œ Presigned URL ์ด Multipart File ์— ๋น„ํ•ด ์ ์€ CPU ๋ฆฌ์†Œ์Šค ์žฅ์ ์ด ์žˆ๋‹ค.

cloudwatch ๋Œ€์‹œ๋ณด๋“œ ๊ธฐ๋ฐ˜ EC2 ์‚ฌ์šฉ๋Ÿ‰ ๋น„๊ต

 

 

(5) ์‘๋‹ต ์‹œ๊ฐ„ ๋น„๊ต

์‹ค์ œ ์‘๋‹ต ์‹œ๊ฐ„ ๋˜ํ•œ Presigned URL ์—์„œ ์ข‹์€ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

์ด์ „์— ํ™•์ธํ–ˆ๋“ฏ์ด Network I/O ์ „์†ก ํŒจํ‚ท์˜ ๊ฐฏ์ˆ˜ ์ฐจ์ด๊ฐ€ ์•ฝ 400๋ฐฐ ์ฐจ์ด๊ฐ€ ์žˆ์—ˆ๋‹ค. ์—…๋กœ๋“œ ํŒŒ์ผ์˜ ์†ก์ˆ˜์‹ ์„ ์œ„ํ•œ ๋Œ€๋Ÿ‰์˜ ํŒจํ‚ท ์ „์†ก๊ณผ ์„œ๋ฒ„์—์„œ ํŒŒ์ผ์„ ์ž„์‹œ ๋ณด๊ด€ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ์‘๋‹ต ์ง€์—ฐ ๋ฐœ์ƒํ–ˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋œ๋‹ค.

 

๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ–ˆ์„ ๋•Œ CPU ์‚ฌ์šฉ๋Ÿ‰๊ณผ Network I/O ๊ด€์ ์—์„œ Presigned URL ๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๋‚ฎ์€ ์‘๋‹ต ์†๋„๋ฅผ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

Presigned URL vs Multipart File ์‘๋‹ต ์‹œ๊ฐ„ ๋น„๊ต

 

5. ๊ฒฐ๋ก 

 ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์„ ๊ฒ€ํ† ํ•ด๋ณด์•˜๋‹ค.

 

๋ฉ€ํ‹ฐํŒŒํŠธ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ,

์„œ๋ฒ„์— ํŒŒ์ผ์„ ์ž„์‹œ ๋ณด๊ด€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋กœ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋Š” ํŒจํ‚ท์˜ ์–‘๊ณผ CPU ๋ฆฌ์†Œ์Šค์‚ฌ์šฉ ๊ด€์ ์—์„œ ์ธํ•œ ๋‹จ์ ์ด ์žˆ์ง€๋งŒ

์ง์ ‘ ํŒŒ์ผ์„ ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด ๋ณด์•ˆ์ƒ์˜ ์žฅ์ ์ด ์žˆ๋‹ค.

 

Presigned URL ์˜ ๊ฒฝ์šฐ,

ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ž„์‹œ URL ์„ ์ œ๊ณตํ•ด S3 ์— ์ง์ ‘ ์—…๋กœ๋“œ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ํŒŒ์ผ ์ด๋ฆ„์˜ ๋™์ผ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋ฉ€ํ‹ฐํŒŒํŠธ ํŒŒ์ผ์— ๋น„ํ•ด ํŒŒ์ผ ๊ฒ€์ฆ ๋กœ์ง์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋นˆ์•ฝํ•œ ๋‹จ์ ์ด ์กด์žฌํ•œ๋‹ค.

 

์ด์™€ ๊ฐ™์€ ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์ ๊ณผ ๋ฐฉํ–ฅ์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐฉ์‹์„ ์ ์šฉํ•ด๋ณด์ž.

 

 

Reference

  • ํ…Œ์ŠคํŠธ ์ƒ˜ํ”Œ ์ฝ”๋“œ : https://github.com/pbg0205/BE-tutorials/tree/main/presigned_url
  • S3 Presigned URL  https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/using-presigned-url.html

'๐Ÿ“‚ backend > spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Spring Version 7.0 Relase Notes Summary  (0) 2025.09.02
์•Œ๋ฆผ ๊ธฐ๋Šฅ Polling ์—์„œ SSE ์ „ํ™˜ํ•˜๋ฉฐ ๊ฒช์—ˆ๋˜ ์‚ฝ์งˆ (์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ)  (0) 2025.07.11
Spring6.1 ๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋œ Parameter Name Retention  (0) 2025.03.11
์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ AOP ๋ฅผ @Transactional ๋ณด๋‹ค ๋‚˜์ค‘์— ์‹คํ–‰์‹œํ‚ค๊ธฐ  (0) 2025.01.27
์ค‘๋ณต๋˜๋Š” ์Šค์ผ€์ค„๋ง ๋ถ„์‚ฐ๋ฝ์œผ๋กœ ํ•˜๋‚˜๋งŒ ์‹คํ–‰ํ•˜๊ธฐ(w.ShedLock)  (0) 2025.01.16
'๐Ÿ“‚ backend/spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Spring Version 7.0 Relase Notes Summary
  • ์•Œ๋ฆผ ๊ธฐ๋Šฅ Polling ์—์„œ SSE ์ „ํ™˜ํ•˜๋ฉฐ ๊ฒช์—ˆ๋˜ ์‚ฝ์งˆ (์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ)
  • Spring6.1 ๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋œ Parameter Name Retention
  • ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ AOP ๋ฅผ @Transactional ๋ณด๋‹ค ๋‚˜์ค‘์— ์‹คํ–‰์‹œํ‚ค๊ธฐ
cooper25
cooper25
  • cooper25
    dev cooper
    cooper25
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (84)
      • ๐Ÿ“‚ backend (34)
        • spring (19)
        • architecture (10)
        • test (5)
      • ๐Ÿ“‚ computer-science (5)
      • ๐Ÿ“‚ programming-language (12)
        • java (12)
      • ๐Ÿ“‚ infra (9)
        • mysql (4)
        • redis (2)
        • message-queue (3)
      • ๐Ÿ“‚ cloud (2)
        • aws (2)
      • ๐Ÿ“‚ frontend (1)
        • react (0)
      • ๐Ÿ“‚ education & lecture (16)
        • ์ธํ”„๋ผ ๊ณต๋ฐฉ (11)
        • ํ•ญํ”Œ ๋ฐฑ์—”๋“œ 7๊ธฐ (5)
      • ๐Ÿ“‚ ai (1)
        • claude (1)
      • ๐Ÿ“‚ etc (2)
        • ํšŒ๊ณ  (1)
        • ์ปจํผ๋Ÿฐ์Šค (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    spring
    kafka
    ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„
    ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์„ค๊ณ„
    ์ธํ”„๋ผ๊ณต๋ฐฉ
    spring camp 2025
    gof
    UUID
    ๋™์‹œ์„ฑ
    nGrinder
    react
    Redisson
    AWS
    JPA
    ์Šคํ”„๋ง์บ ํ”„ ํ›„๊ธฐ
    mysql
    spring-batch
    ํ•ญํ•ดํ”Œ๋Ÿฌ์Šค
    spring AOP
    ํšŒ๊ณ 
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
cooper25
Presigned URL ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ์™œ ์ ์šฉํ–ˆ๋ƒ๋ฉด์š”.
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”