๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

BackEnd๐ŸŒฑ/Spring44

Spring ํŠธ๋žœ์žญ์…˜์€ ์–ธ์ œ ์–ด๋–ป๊ฒŒ ๋กค๋ฐฑ ๋ ๊นŒ? -1ํŽธ ๊ฐœ์š”์Šคํ”„๋ง์—์„œ @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜์ด ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. ๋กœ์ง์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉด commit์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋˜๊ณ , ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด rollback์„ ํ†ตํ•ด ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ทจ์†Œ๋œ๋‹ค. ๋‹ค๋งŒ ์ด๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์œผ๋กœ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋” ๋‚˜์•„๊ฐ€ ์„ธ๋ถ€์ ์œผ๋กœ ๋กค๋ฐฑ์ด ์ •ํ™•ํžˆ ์–ธ์ œ ๋ฐœ์ƒํ•˜๊ณ (1ํŽธ), ํŠน์ • ์ƒํ™ฉ์„ ์˜ˆ์‹œ๋กœ ํ•ด๋‹น ๋กœ์ง์ด ๋กค๋ฐฑ์ด ๋ ์ง€ ์•ˆ ๋ ์ง€์— ๋Œ€ํ•ด ๋งž์ถฐ๋ณด๋Š” ์‹(2ํŽธ)์œผ๋กœ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.  Check Exception, Unchecked Exception๋จผ์ € ์ž๋ฐ”์—์„œ๋Š” ์˜ˆ์™ธ๋ฅผ ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Exception๊ณผ Error ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„๊ณ  ์žˆ๋‹ค.Exception์€ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ์ฐธ์กฐ๋œ ๊ฐ’์ด ์ž˜๋ชป๋œ ๊ฒฝ์šฐ์ธ .. 2024. 10. 4.
[gradle] implementation, api ์ฐจ์ด ๊ฐœ์š”Gradle์—์„œ ์˜์กด์„ฑ์„ ์„ค์ •ํ•  ๋•Œ๋Š” compileOnly, runtimeOnly, implementation, api ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ api์™€ implementation์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•  ๋•Œ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ, ์ด ๋‘˜์€ ๋ชจ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ์ด์ ์„ ์•Œ์•„๋‘๋ฉด ์ข‹๋‹ค.dependencies { api 'org.apache.httpcomponents:httpclient:4.5.7' implementation 'org.apache.commons:commons-lang3:3.5'}์ฐธ๊ณ ๋กœ ์ด์ „ Gradle ๋ฒ„์ „์—์„œ๋Š” implementation ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์—ˆ๊ณ , ๋Œ€์‹  comp.. 2024. 9. 7.
[JPA] deleteAll(), deleteAllInBatch(), deleteInBatch() ์ •๋ฆฌ ๊ฐœ์š”Hibernate(JPA)์—์„œ๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ์•„๋ž˜์˜ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋“ค์„ ์ง€์›ํ•œ๋‹ค.delete(),deleteById()deleteAll(), deleteAllById()deleteInBatch()deleteAllInBatch(), deleteAllByIdInBatch()๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€๋งŒ, ๋„ค์ด๋ฐ๋งŒ ๋ณด๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๊ฒƒ๋“ค์ด ๋ช‡๋ช‡ ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ deleteInBatch()์™€ deleteAllInBatch(), ๊ทธ๋ฆฌ๊ณ  deleteAll()๊ณผ deleteAllInBatch()์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋“ค์ด๋‹ค.์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” ์œ„ ๋ฉ”์„œ๋“œ๋“ค์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ญ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€๋ฅผ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๊ณ , ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์™€ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ์‚ญ์ œ ๋™์ž‘์„ ๋ถ„์„ํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค.  ์‚ฌ์ „ ์„ธํŒ…DB.. 2024. 8. 12.
๋‹จ๋ฐฉํ–ฅ @OneToMany์˜ ๋ฌธ์ œ์  ๊ฐœ์š”JPA๋ฅผ ํ•™์Šตํ•˜๋‹ค ๋ณด๋ฉด @OneToMany๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‹จ๋ฐฉํ–ฅ๋ณด๋‹ค๋Š” ์–‘๋ฐฉํ–ฅ ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๋ง์„ ์ž์ฃผ ๋“ฃ๊ฒŒ ๋œ๋‹ค.์™œ ๊ทธ๋Ÿฐ์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ๋ฐฉํ–ฅ @OneToMany๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ์ ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ณ , ์–‘๋ฐฉํ–ฅ์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์–ด๋–ค ์ ์ด ๊ฐœ์„ ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž๋งคํ•‘ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ ๋‹จ๋ฐฉํ–ฅ @OneToMany ๋™์ž‘ ๊ณผ์ •@JoinColumn ์‚ฌ์šฉํ•œ ๋‹จ๋ฐฉํ–ฅ @OneToMany  ๋™์ž‘ ๊ณผ์ •์–‘๋ฐฉํ–ฅ @OneToMany๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ๋™์ž‘ ๊ณผ์ • 1. ๋งคํ•‘ ํ…Œ์ด๋ธ” ์‚ฌ์šฉ๋งคํ•‘ ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•œ @OneToMany ์—”ํ‹ฐํ‹ฐ ์„ค๊ณ„ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.@Entity@NoArgsConstructor(access = lombok.AccessLevel.PROTECTED)public class Book { @I.. 2024. 7. 26.
@TransactionalEventListener ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์  ๋ฌธ์ œ ์ƒํ™ฉ@Service@RequiredArgsConstructorpublic class CurrentValueChangeService { private final ExampleRepository exampleRepository; private final ApplicationEventPublisher applicationEventPublisher; @Transactional public void changeValue(String value) { Example example = exampleRepository.find(1L); String beforeValue = example.getCurrentValue(); example.updateCurren.. 2024. 7. 3.
ํ˜‘์—…์„ ์œ„ํ•ด Swagger ์ข€ ๋” ์ž˜ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ ๋ชฉ์ฐจAPI ๊ทธ๋ฃนํ™”API ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ @Deprecated ํ™œ์šฉํ•˜๊ธฐ๋ช…์„ธ๋งŒ ๋จผ์ € ์ „๋‹ฌํ•˜๊ธฐAuthorize์— jwt ๋„ฃ์„ ๋•Œ prefix์— Bearer ์ƒ๋žต์‹œํ‚ค๊ธฐ๋ธŒ๋ผ์šฐ์ € ์ƒˆ๋กœ๊ณ ์นจ ํ›„์—๋„ ์ธ์ฆ์ •๋ณด ์œ ์ง€์‹œํ‚ค๊ธฐ๊ธฐํƒ€ ์ž์ž˜ํ•œ ์ƒ์„ธ ์„ค์ •๋“ค  1. API ๊ทธ๋ฃนํ™”Swagger์—์„œ API๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋…ผ๋ฆฌ์ ์ธ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์–ด ๊ด€๋ฆฌํ•˜๊ณ  ๋ฌธ์„œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์„ค์ • ํ›„์—๋Š” ์œ„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ๊ด€๋ จ๋œ ์—”๋“œํฌ์ธํŠธ๋งŒ ๋ณผ ์ˆ˜ ์žˆ์–ด ์›ํ•˜๋Š” API๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Swagger์—์„œ API๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ํ™•์ธํ•ด์„œ ์ ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.springfox-swagger2๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ@Configuration@EnableSwagger2publi.. 2024. 5. 15.
ThreadPoolExecutor ๋™์ž‘์— ๊ด€ํ•œ ์˜คํ•ด ๊ฐœ์š” Java์—์„œ ์Šค๋ ˆ๋“œํ’€์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ThreadPoolExecutor, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๋”์šฑ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Spring์—์„œ ์ œ๊ณตํ•˜๋Š” ThreadPoolTaskExecutor์˜ ๋™์ž‘ ๋ฐฉ์‹์— ๊ด€ํ•ด ์ œ๊ฐ€ ๊ทธ๋™์•ˆ ์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๋‘ ๊ฐ€์ง€์˜ ์˜คํ•ด๋ฅผ ์ •๋ฆฌํ•˜๊ณ ์ž ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์„ค์ •์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ์„œ๋ฒ„ ์‹คํ–‰ ์‹œ์— ์ง€์ •ํ•œ ์Šค๋ ˆ๋“œ ํ’€ ํฌ๊ธฐ๋งŒํผ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค. corePoolSize์™€ maxPoolSize๋Š” ์„œ๋กœ ์ƒ๊ด€์—†๋‹ค. ํ์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด maxPoolSize์€ ์‚ฌ์‹ค์ƒ ์˜๋ฏธ ์—†๋Š” ์„ค์ •์ด๋‹ค. corePoolSizeํฌ๊ธฐ ์ด์ƒ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜จ๋‹ค๊ณ  ํ•ด์„œ maxPoolSize๋งŒํผ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. https:.. 2024. 3. 11.
MySQL ๋ฒ„์ „์— ๋”ฐ๋ฅธ @Transactional(readOnly=true)์˜ ๋™์ž‘ ๊ณผ์ • ๊ฐœ์š” ์ด ๊ธ€์€ ํƒœํ˜„๋‹˜์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด RDBMS๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ, ์šฐ๋ฆฌ๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”, ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ, ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€ ๋“ฑ ์—ฌ๋Ÿฌ ์ด์œ ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— @Transactional(readOnly=true) ์–ด๋…ธํ…Œ์ด์…˜์„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์–ด๋– ํ•œ ์›๋ฆฌ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” @Transactional(readOnly=true)์˜ JDBC ๋‹จ๊ณ„์—์„œ์˜ ๋™์ž‘ ๊ณผ์ •์„ ์œ„์ฃผ๋กœ ์‚ดํŽด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋™์ž‘ ๊ณผ์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— @Transactional(readOnly=true)์„ ๊ฑธ๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋™์ž‘ํ•˜๋Š” ์ „์ฒด์ ์ธ ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ค€๋น„ ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ ์ „ํŒŒ ๋น„์ฆˆ๋‹ˆ์Šค.. 2024. 1. 24.
Hibernate์˜ @Formula๋ฅผ ์ด์šฉํ•œ ์—ฐ๊ด€ ๊ด€๊ณ„ ์—”ํ‹ฐํ‹ฐ ์ง‘๊ณ„ ๊ฐœ์š” Hibernate์˜ @Formula ์–ด๋…ธํ…Œ์ด์…˜์€ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๋‚ด์—์„œ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” '๊ฐ€์ƒ ์ปฌ๋Ÿผ'์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. @Formula๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์ปฌ๋Ÿผ๋“ค์˜ ๊ฐ’์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฐ’์€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋งŒ ๊ณ„์‚ฐ๋˜์–ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ ์ฝ”๋“œ @Formula ์–ด๋…ธํ…Œ์ด์…˜์˜ ์ „ํ˜•์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ์˜ ์ง‘๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์‹œ๊ธ€๊ณผ ์—ฐ๊ฒฐ๋œ ๋Œ“๊ธ€์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋Š” ๊นƒํ—ˆ๋ธŒ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. @Entity public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) pri.. 2023. 12. 20.