์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ AOP ๋ฅผ @Transactional ๋ณด๋‹ค ๋‚˜์ค‘์— ์‹คํ–‰์‹œํ‚ค๊ธฐ

2025. 1. 27. 17:56ยท๐Ÿ“‚ backend/spring
@Transactional AOP ๋กœ์ง๊ณผ ๋ถ„์‚ฐ๋ฝ AOP ์„ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— @Transactional ์„ ๋‚˜์ค‘์— ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์—ˆ๋‹ค. ์ด๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€ํ† ํ–ˆ๋˜ ์ฝ”๋“œ ๊ธฐ๋ก์ด๋‹ค. ํ•ด๋‹น ๋‚ด์šฉ์€ kurly techblog ์—์„œ ๋ถ„์‚ฐ๋ฝ ๋‚ด์šฉ์„ ๋ณด๊ณ  ์ ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ๋“  ๊ณ ๋ฏผ์ด๋‹ค.

 

์ฐธ๊ณ ์ž๋ฃŒ : ํ’€ํ•„๋จผํŠธ ์ž…๊ณ  ์„œ๋น„์ŠคํŒ€์—์„œ ๋ถ„์‚ฐ๋ฝ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• - Spring Redisson

  • https://helloworld.kurly.com/blog/distributed-redisson-lock/

 

[1] ๋ถ„์‚ฐ๋ฝ์€ ๋ฝ ์ ์œ /ํ•ด์ œ ๋ธ”๋ก ์•ˆ์—์„œ Transaction ๋ฅผ ๋ฌถ์–ด์•ผ ํ•œ๋‹ค.

๋ถ„์‚ฐ๋ฝ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ๊ทธ ์ด์œ ๋Š” ๋ถ„์‚ฐ ํ™˜๊ฒฝ์˜ ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์œ„ํ•จ์ด๋‹ค. ๋ถ„์‚ฐ๋ฝ์€ ์ž„๊ณ„ ์˜์—ญ์— ๋‹ค๋ฅธ ์š”์ฒญ์ด ์ ‘๊ทผ์„ ๋ง‰์•„ ์ปดํฌ๋„ŒํŠธ๊ฐ„ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ฐ ์ €์žฅ์†Œ๋Š” ๋…๋ฆฝ์ ์ธ ๋กœ์ปฌ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์ง€๋งŒ, ์ด์ข… ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(hetero database) ์˜ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ฅผ ๋ถ„์‚ฐ๋ฝ์„ ์‚ฌ์šฉํ•ด ๋‹จ์ผ ์š”์ฒญ๋งŒ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ด ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ๋ณด์žฅํ•œ๋‹ค.

 

๋งŒ์•ฝ ๋ถ„์‚ฐ๋ฝ๊ณผ ํ•จ๊ป˜ ํŠธ๋žœ์žญ์…˜์„ ์„ ์–ธํ•ด ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ถ„์‚ฐ๋ฝ์€ ๋ฝ ์ ์œ /ํ•ด์ œ ๋ธ”๋ก ์•ˆ์— ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰์‹œ์ผœ์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ lock block ๋‚ด๋ถ€์— ํŠธ๋žœ์žญ์…˜์„ ์„ ์–ธํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ํ›„ํ–‰ ํŠธ๋žœ์žญ์…˜์ด ์ž„๊ณ„ ์˜์—ญ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์ž‘์—…์—์„œ ์ผ๊ด€์„ฑ์ด ๊บ ์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 

๋ถ„์‚ฐ๋ฝ ๋ธ”๋Ÿญ ์•ˆ์— ๊ผญ ํŠธ๋žœ์žญ์…˜์„ ๋ฌถ๊ธฐ

 

[2] custom Aspect ๊ฐ€ @Transactional ๋ณด๋‹ค ์‹คํ–‰์ด ๋Šฆ์€ ์ด์œ ๋Š”?

 ์ด์ „ ๋ถ„์‚ฐ๋ฝ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด @Transactional ์™€ ๋ถ„์‚ฐ๋ฝ AOP ์ ์šฉ์„ ์œ„ํ•ด ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜ @DistributedLock ์„ ์„ ์–ธํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์˜ˆ์ƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ถ„์‚ฐ๋ฝ Aspect ์„ ์ ์šฉํ•˜๋ฉฐ @Transactional ๋ณด๋‹ค ๋Šฆ๊ฒŒ ์‹คํ–‰๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด ์ƒํ™ฉ์€ ๊ณง ์ •ํ•ฉ์„ฑ ๋ณด์žฅ ๋ฐ ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ AopForTransaction ์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด @Transactional ์„ ๋ถ„๋ฆฌํ•˜๊ณ ์ž ํ–ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ํ•ด๋‹น ๋ฐฉ์‹์„ ๋™์˜ํ•˜๋ฉฐ ๊ธฐ์กด์— ์„ ์–ธํ•œ @Transactional ์„ ์ ์šฉํ•˜๊ณ  AopForTranaction ์„ ๋„์ž…ํ•ด ์ ์šฉํ–ˆ๋‹ค.

 

๐Ÿšจ ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋ถ„์‚ฐ๋ฝ์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด??

๋ถˆํ•„์š”ํ•œ DB connection ๊ณผ ๊ฐ™์€ ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ๋ชจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์€ ์ ์ ˆํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์ด๋ผ๋Š” ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ @Transactional ์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ๊ณต์‹ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ๋ถ„์‚ฐ๋ฝ ์‚ฌ์šฉ์‹œ ๋ฌด์กฐ๊ฑด DB Transaction ํ™œ์„ฑํ™” ์‹œํ‚จ๋‹ค.

 

[3] @Transactional ์˜ ์šฐ์„  ์ˆœ์œ„๋Š” ๊ฐ€์žฅ ๋‚ฎ๋‹ค. (Ordered.LOWEST_PRECEDENCE)

@Transactional ์šฐ์„  ์ˆœ์œ„๋ฅผ ํ™•์ธํ•ด๋ณด์ž.  spring docs ์„ ๋ณด๋ฉด @Transactional ์˜ ์šฐ์„  ์ˆœ์œ„๋Š” ๊ฐ€์žฅ ๋‚ฎ๋‹ค. ํ•˜์ง€๋งŒ ์ฃผ์˜์‚ฌํ•ญ์ด ์žˆ๋‹ค.

๋งŒ์•ฝ ๋‹ค๋ฅธ ๋กœ์ง์—์„œ @Order ์–ด๋…ธํ…Œ์ด์…˜ ์„ ์–ธ ๋˜๋Š” Ordered ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ด ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์•„๋ฌด๋ฆฌ @Transactional ์ด ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ๋”๋ผ๋„ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.

 

spring docs :Using @Transactional

  • https://docs.spring.io/spring-framework/reference/data-access/transaction/declarative/annotations.html

์šฐ์„  ์ˆœ์œ„ ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฒƒ ํ™•์ธ ๐Ÿ‘

 

 

[4] @Transactional ์˜ ์šฐ์„  ์ˆœ์œ„ ์ฝ”๋“œ๋กœ ํ™•์ธํ•ด๋ณด๊ธฐ

(1) SpringBoot autoconfiguartion ์ฐ๋จนํ•˜๊ธฐ

SpringBoot 3.x ๋ถ€ํ„ฐ๋Š” spring.factories ๋Œ€์‹  AutoConfiguration.imports๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ์„ค์ •์„ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•œ๋‹ค. SpringBoot 3.x ์ž๋™ ์„ค์ •์€ ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

 

  1. @SpringBootApplication ๋‚ด๋ถ€์˜ @EnableAutoConfiguration์ด ์ž๋™ ์„ค์ •์„ ํ™œ์„ฑํ™”ํ•จ.
  2. AutoConfiguration.imports์—์„œ ์ž๋™ ์„ค์ • ํด๋ž˜์Šค ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ด.
  3. AutoConfigurationImportSelector๊ฐ€ ์ž๋™ ์„ค์ • ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•จ.
  4. @ConditionalOnClass์™€ @ConditionalOnMissingBean ๋“ฑ์˜ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์—ฌ ์ž๋™ ์„ค์ •์„ ์ ์šฉํ•จ.
  5. ํ•„์š”ํ•  ๊ฒฝ์šฐ ํŠน์ • ์ž๋™ ์„ค์ •์„ excludeํ•˜์—ฌ ๋น„ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ.

AutoConfiguration.imports ์œ„์น˜
TransactionAutoConfiguration ์ด ์กด์žฌํ•œ๋‹ค.

 

 

[๐Ÿ’ ์ถ”๊ฐ€์ ์œผ๋กœ AutoConfiguration ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์•„๋ž˜๋ฅผ ํ†ตํ•ด์„œ ํ™•์ธํ•ด๋ณด์ž.]

  • spring-boot-autoconfigure-3.4.1.jar!/META-INF/spring-autoconfigure-metadata.properties

 

# jdbc autoconfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration.AutoConfigureBefore=org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration

# hibernate autoconfiguration
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration.AutoConfigureBefore=org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration

# transaction autoconfiguration
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration=
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration$AspectJTransactionManagementConfiguration=
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration$AspectJTransactionManagementConfiguration.ConditionalOnBean=org.springframework.transaction.aspectj.AbstractTransactionAspect
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration$EnableTransactionManagementConfiguration=
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration$EnableTransactionManagementConfiguration.ConditionalOnBean=org.springframework.transaction.TransactionManager
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration$TransactionTemplateConfiguration=
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration$TransactionTemplateConfiguration.ConditionalOnSingleCandidate=org.springframework.transaction.PlatformTransactionManager
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration.ConditionalOnClass=org.springframework.transaction.PlatformTransactionManager

 

 

(2) @EnableTransactionManager ๊ฐ€ ์—†์œผ๋ฉด TransactionAutoConfiguration ์„ค์ •์—์„œ @EnableTransactionManager ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

TransactionAutoConfiguration ์„ ์‚ดํŽด๋ณด์ž.

 

์•„๋ž˜ spring-autoconfigure-metadata.properties ๋ฅผ ํ™•์ธํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค. ํ•ด๋‹น ์˜๋ฏธ๋Š” EnableTransactionManagementConfiguration ๋ฅผ ํ•ด๋‹น ํด๋ž˜์Šค ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฉฐ, ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„ @Configuration ์ด ์ถ”๊ฐ€๋˜์–ด ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.

spring-autoconfigure-metadata.properties

 

 

์ด๋ฅผ TransactionAutoConfiguration ์—์„œ ํ™•์ธํ•ด๋ณด๋ฉด

๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ EnableTransactionManagementConfiguration ์„ @Configuration ์„ ํ†ตํ•ด ๋“ฑ๋กํ•˜๊ณ  @EnableTransactionManager ์„ค์ •์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

 

(3) @EnableTransactionManager ๋Š” TransactionManagementConfigurationSelector ์„ ํ†ตํ•ด ์„ค์ •ํ•œ๋‹ค.

@EnableTransactionManager ๋Š”TransactionManagementConfigurationSelector ์— ๊ด€ํ•œ ์„ค์ • ํŒŒ์ผ์„ ํ˜ธ์ถœํ•ด ๊ด€๋ จ ์„ค์ •์„ ํ™œ์„ฑํ™” ํ•œ๋‹ค.

 

 

 

 

์ด ๋•Œ, TransactionManagementConfigurationSelector ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด AdviceMode.PROXY ์— ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋˜์–ด ProxyTransactionManagerConfiguration ์˜ ์„ค์ •์„ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

  • AdviceMode.PROXY ๋Š” JDK-Dynamic-Proxy ๋˜๋Š” CGLIB Proxy ๋ฅผ ํ™œ์„ฑํ™” ํ•˜๋Š” ๊ฒฝ์šฐ์— ์„ ์–ธํ•˜๋Š” ์ƒ์ˆ˜์ด๋‹ค. ํ•ด๋‹น ๋‚ด์šฉ์—์„œ๋Š” ํ•ด๋‹น ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค.

 

 

(4) ProxyTransactionManagementConfiguration ์—์„œ TransactionInteceptor ์„ ์–ธ ๋ฐ ์ˆœ์„œ ์„ค์ •

  1. BeanFactoryTransactionAttributeSourceAdvisor
    • Spring AOP ๊ธฐ๋ฐ˜ ํŠธ๋žœ์žญ์…˜ ์ ์šฉ์„ ์œ„ํ•œ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ
    • AOP์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์–ด๋“œ๋ฐ”์ด์Šค(Advice)๋กœ ์ ์šฉํ•  ๋Œ€์ƒ์„ ์„ค์ •ํ•˜๋Š” ์—ญํ• 
  2. TransactionInterceptor
    • ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘, ์ปค๋ฐ‹, ๋กค๋ฐฑํ•˜๋Š” ์‹ค์ œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ

 

์•„๋ž˜ ๋นจ๊ฐ„ ๋„ค๋ชจ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด advisor ์˜ ์ˆœ์„œ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด @EnableTransactionManager ์˜ order option ์„ ๊ฐ€์ ธ์™€ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์กฐํšŒํ•ด ์ฃผ์ž…ํ•˜๊ณ  ์ด๋ฅผ @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์˜ ์‹คํ–‰ ์ˆœ์„œ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๊ฒฐ๊ตญ ์ด ๋ถ€๋ถ„์ด @Transactional ์ด ์„ ์–ธ๋˜์–ด BeanFactoryTransactionAttributeSourceAdvisor ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜๋Š” ์—ญํ• ์ด๋‹ค.

 

 

๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€ @Transactional ์€ @Order ์‹คํ–‰ ๋˜๋Š” Ordered interface ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ์˜ ์šฐ์„  ์ˆœ์œ„๋Š” ๊ฐ€์žฅ ํ•˜์œ„!

 

[5] @Transactional ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰ํ•˜๊ธฐ = @Aspect ์— @Order ์„ ์–ธํ•ด ์ˆœ์„œ ์„ค์ •ํ•˜๊ธฐ

@Transactional ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @Order ์–ด๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐ๋œ๋‹ค. ์•ž์„œ ์ด์•ผ๊ธฐํ–ˆ๋“ฏ์ด @Order ์˜ ์šฐ์„  ์ˆœ์œ„๋Š” ๊ฐ’์ด ๋‚ฎ์„์ˆ˜๋ก ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค.

 

Ordered.LOWEST_PRECEDENCE ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด Integer.MAX_VALUE ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ @Transactional ๋ณด๋‹ค ๋จผ์ € ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Integer.MAX_VALUE ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์„ ์–ธํ•˜๋ฉด ํ•ด๊ฒฐ๋  ๊ฒƒ์ด๋‹ค.

 

์ ์šฉ ์ฝ”๋“œ

 

 

 

[6] ๊ฒฐ๋ก 

์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ž๋™ ์„ค์ •์— ๊ด€ํ•ด ์ž˜ ์ง€์›ํ•ด์ค˜ ์ด์ „์˜ ์„ค์ •์— ํ•œ์„ธ์›”์ด ๊ฒฐ๋ ธ๋˜ ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค ํŽธํ•˜๋‹ค.

์„ธ๋ถ€ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์•Œ์ง€ ๋ชปํ•ด๋„ ์ถ”์ƒํ™”๊ฐ€ ์ž˜ ๋˜์–ด ์žˆ์–ด ํ”„๋กœํผํ‹ฐ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ด€๋ จ ์„ค์ •์„ ์ž๋™์œผ๋กœ ํ•ด์ค€๋‹ค.

 

ํ•˜์ง€๋งŒ, ์ž๋™ ์„ค์ •์˜ ํŽธ์•ˆํ•จ์— ์ทจํ•ด ์‚ฌ์šฉํ•˜๋Š”๋ฐ๋งŒ ์ต์ˆ™ํ•ด์ง€๋ฉด ์กฐ๊ธˆ๋งŒ ๋‹ค๋ฅธ ์ผ€์ด์Šค๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

๋น„๋ก ๋ชจ๋“  ์Šคํ”„๋ง ์ฝ”๋“œ๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์ดํ•ดํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์Šคํ”„๋ง์—์„œ ํ•ต์‹ฌ์ด ๋˜๋Š” ์ฝ”๋“œ๋“ค์€ ํ•„์š”ํ•  ๋–„๋งˆ๋‹ค ์ฝ์–ด๋ณด๋Š” ์—ฐ์Šต์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

 

๊ฐ„๋งŒ์— ๋‚ด๋ถ€ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋งˆ์น˜ ๋ฏธ๋กœ ์ฐพ๋“ฏ์ด ์–ด๋ ค์›€์€ ์žˆ์—ˆ์ง€๋งŒ ๋‹ค์Œ์— ๋‹ค๋ฅธ ์Šคํ”„๋ง ์ฝ”๋“œ๋ฅผ ๋ณผ ๋•Œ๋Š” ์ˆ˜์›”ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ด๋ณธ๋‹ค. ๐Ÿ‘จ‍๐Ÿ’ป

 

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

Presigned URL ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ์™œ ์ ์šฉํ–ˆ๋ƒ๋ฉด์š”.  (1) 2025.06.01
Spring6.1 ๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋œ Parameter Name Retention  (0) 2025.03.11
์ค‘๋ณต๋˜๋Š” ์Šค์ผ€์ค„๋ง ๋ถ„์‚ฐ๋ฝ์œผ๋กœ ํ•˜๋‚˜๋งŒ ์‹คํ–‰ํ•˜๊ธฐ(w.ShedLock)  (0) 2025.01.16
Spring REST Docs + Swagger UI ๋ฅผ ํ†ตํ•œ API ๋ฌธ์„œํ™”  (0) 2024.12.07
๋น„๊ด€์  ๋ฝ vs ๋‚™๊ด€์  ๋ฝ(In JPA)  (0) 2024.11.28
'๐Ÿ“‚ backend/spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Presigned URL ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ์™œ ์ ์šฉํ–ˆ๋ƒ๋ฉด์š”.
  • Spring6.1 ๋ถ€ํ„ฐ ๋ณ€๊ฒฝ๋œ Parameter Name Retention
  • ์ค‘๋ณต๋˜๋Š” ์Šค์ผ€์ค„๋ง ๋ถ„์‚ฐ๋ฝ์œผ๋กœ ํ•˜๋‚˜๋งŒ ์‹คํ–‰ํ•˜๊ธฐ(w.ShedLock)
  • Spring REST Docs + Swagger UI ๋ฅผ ํ†ตํ•œ API ๋ฌธ์„œํ™”
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)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

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

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

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

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

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
cooper25
์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ AOP ๋ฅผ @Transactional ๋ณด๋‹ค ๋‚˜์ค‘์— ์‹คํ–‰์‹œํ‚ค๊ธฐ
์ƒ๋‹จ์œผ๋กœ

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