[Spring] Static Method VS Bean ์ฃผ์ž…

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 ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค.