1. ๊ฐ์
DTO ๋งคํ ๋ฐฉ์์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๋ค. ์๋ฅผ ๋ค์ด, MapStruct ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ ๋งคํ, ๋ณ๋์ ๋งคํผ ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋งคํ, from/toXXX์ ๊ฐ์ static ๋ฉ์๋๋ฅผ ์ด์ฉํ ๋งคํ ๋ฑ์ด ์๋ค. ์ด ์ค ์ด๋ค ๋ฐฉ์์ด ๊ฐ์ฅ ์ฐ์ํ๋ค๊ณ ๋จ์ ์ง๊ธฐ๋ ์ด๋ ต๋ค.
์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ฅผ ๊ณ ๋ คํ ๋์, ๋ณ๋์ ๋งคํผ ํด๋์ค๋ฅผ ํ์ฉํ๋ ๋ฐฉ์์ ์ ํํ๊ธฐ๋ก ํ๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ๋ ํ๋์ ๊ณ ๋ฏผ์ด ์๊ฒผ๋ค. ์ด ๋งคํผ ํด๋์ค๋ฅผ Bean์ผ๋ก ๋ฑ๋กํ์ฌ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ, ์๋๋ฉด static ๋ฉ์๋๋ก ์ ์ํ์ฌ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ?
Spring bean๊ณผ Static ํจ์์ ์์ฑ ์์ ์ ์๋์ ๊ฐ๋ค.
1. Spring bean : JVM ๋ก๋ → Tomcat ์คํ → Component Scan ์์
2. StaticClass Method : JVM์์ ํด๋์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ๊ฐ๋ ์์
Spring Bean ์์ฑ ์์ ๋ณด๋ค StaticClass ๋ด๋ถ์ Method ์์ฑ ์์ ์ด ์์ ๋ค. ๋ฟ๋ง ์๋๋ผ, Spring bean๊ณผ StaticClass์ Method ๋ชจ๋ ์ฑ๊ธํค์ ๋ณด์ฅํ๋ค๋ ์ ์์ ๊ณตํต์ ์ ๊ฐ์ง๋ค.
๊ทธ๋ ๋ค๋ฉด 'Spring Bean์ ๋์ฒดํด์ StaticClass๋ฅผ ์ ์ํด์ ์ฌ์ฉํด๋ ๋ ๊น'ํ๋ ์๊ฐ์ด ๋ค์๊ณ ์ด ๊ธ์ ์์ฑํ๊ฒ ๋์๋ค.
2. Spring Bean, Static
๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, Spring bean์ Spring IoC ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ ์๋ฐ ๊ฐ์ฒด์ด๋ค.
IoC ์ปจํ ์ด๋์ ์ํด ๊ด๋ฆฌ๋๋ Bean์ ์ฑ๊ธํค์ ์ ์งํ๋ฉฐ ์์ฑ๊ณผ ์ฌ์ฉ, ์๋ฉธ๊น์ง์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ์ ๋ํ ์ฌ์ฉ์์ ๋ถ๋ด์ ๋์ด์ฃผ๊ณ , ์์กด์ฑ ์ฃผ์ ์ ํตํด ํ์ํ Bean์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋น์ทํ ๋งฅ๋ฝ์์ StaticClass๋ ์์ ์ ClassName ์์ฒด๋ก ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๊ฒ ํ๋ค.
System.out ์ผ๋ก๋ง ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ์ด์ ๊ฐ static ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ New() ํค์๋๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ์๋ ์๊ณ , ์ฌ์ฉ์๋ StaticClass์ ๋ด๋ถ ๋ฉ์๋๋ ํ๋์ ๊ณง๋ฐ๋ก ์ ๊ทผํ ์ ์๋ค.
2. ์ธ์ ์ฐ๋ฆฌ๋ ์ด๋ค์ ์ฌ์ฉํ๋๊ฐ?
Spring Bean์ ๊ฒฐ๊ตญ ๋ค๋ฅธ Bean๊ณผ์ ์์กด์ฑ์ ๊ฐ์ง๊ณ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ์ ์ ํฉํ๋ค.
๋ฌผ๋ก ์์กด์ฑ ์์ด ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉ๋๋ Bean๋ ์์ ์ ์์ง๋ง, ํ์ฌ๋ ์์กด์ฑ์ด ์๋๋ผ๋ ๋ฏธ๋์ ์์กด์ฑ์ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด Bean์ผ๋ก ๋ฑ๋กํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
๋ฐ๋ฉด, Static ํด๋์ค๋ฅผ ํ์ฉํ ๋ฉ์๋๋ ์์กด์ฑ์ด ํ์ ์๋ ๋จ์ํ ๋ณํ ๋ก์ง์ ์ํํ ๋ ๋ ์ ํฉํ ์ ์๋ค.
๊ฒฐ๊ตญ, ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ๊ฐ? ์๋๊ฐ? ๊ฐ Spring Bean๊ณผ Static ๋ฉ์๋ ์ฌ์ฉ์ ๊ตฌ๋ถ ์ง๋ ํต์ฌ ๊ธฐ์ค์ด ๋๋ค.
Spring Bean์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
@Component
public class S3Handler {
private final AmazonS3 amazonS3;
private final String bucketName;
public S3Handler(AmazonS3 amazonS3, @Value("${aws.s3.bucket}") String bucketName) {
this.amazonS3 = amazonS3;
this.bucketName = bucketName;
}
public String uploadFile(String key, File file) {
amazonS3.putObject(new PutObjectRequest(bucketName, key, file));
return amazonS3.getUrl(bucketName, key).toString();
}
public S3Object downloadFile(String key) {
return amazonS3.getObject(bucketName, key);
}
}
์ด๋ฐ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ค๋ก @Component ๋ฑ๋กํ๋๊ฒ ์ณ๋ค.
- AmazonS3์ ๊ฐ์ AWS SDK ๊ฐ์ฒด๋ฅผ ์์กด์ฑ ์ฃผ์ (DI)์ ํตํด ๊ด๋ฆฌํ ์ ์๋ค.
- @Value("${aws.s3.bucket}")์ ๊ฐ์ ํ๊ฒฝ ๋ณ์ ๊ฐ์ ์ฃผ์ ํ ์ ์๋ค.
Static ์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
public class Util {
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// ๋ ์ง ๋ณํ
public static String formatLocalDate(LocalDate date) {
return date.format(DATE_FORMATTER);
}
public static LocalDate parseDate(String dateStr) {
return LocalDate.parse(dateStr, DATE_FORMATTER);
}
// ์ ๋ณํ
public static double roundToTwoDecimalPlaces(double value) {
return new BigDecimal(value).setScale(2, RoundingMode.HALF_UP).doubleValue();
}
public static String formatCurrency(double value) {
return String.format("$%.2f", value);
}
}
์ด๋ฐ ์ฝ๋๋ ์ธ๋ถ ์๋น์ค(AWS, DB ๋ฑ)๋ ๋ค๋ฅธ Bean์ ์ฃผ์ ๋ฐ์ง ์๋๋ค. ๋ํ ๋จ์ํ ๋ณํ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๋ฏ๋ก static ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ๋ค.