BackEnd๐ฑ/Spring47 AbstractAggregateRoot์ ApplicationEventPublisher ๋์ ๊ณผ์ ๊ฐ์์คํ๋ง์ ์ด๋ฒคํธ ๊ธฐ๋ฅ์ ํ์ฉํ ๋ ํํ AbstractAggregateRoot ํน์ ApplicationEventPublisher๋ฅผ ์ฌ์ฉํ๋ค. ์ด ๊ธ์์๋ ๋ด๋ถ์ ์ผ๋ก ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์ํ๋ฉฐ, ์ด๋ฒคํธ๊ฐ ์ด๋ป๊ฒ ๋ฑ๋ก๋๊ณ ๋ฐํ๋์ด ์ต์ข ์ ์ผ๋ก ์์ ๋๋์ง ์ ์ฒด์ ์ธ ๊ณผ์ ์ ์ ๋ฆฌํด ๋ณธ๋ค. AbstractAggregateRoot ๋์ ๊ณผ์ AbstractAggregateRoot๋ Spring Data์์ ์ ๊ณตํ๋ ์ถ์ ํด๋์ค๋ก, ๋๋ฉ์ธ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ค ์์ฝ๊ฒ ๋ฑ๋กํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ๋์์ค๋ค. ์ฃผ๋ก DDD์์ ์ํ ๋ณ๊ฒฝ ํ ์ธ๋ถ์ ์๋ฏธ ์๋ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฃผ๋ฌธ์ด ์๋ฃ๋์์ ๋ ๋๋ฉ์ธ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ๋ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.@Entitypublic class Order extends Abstr.. 2025. 6. 28. ๋๋ GET์ผ๋ก ๋ณด๋๋๋ฐ ์ POST๋ก ๊ฐ๊น? (feat. OpenFeign ๊ธฐ์ฌ) ๊ฐ์์ต๊ทผ OpenFeign์ ์ฌ์ฉํ ๋ ์ด์ํ ๋ฌธ์ ๋ฅผ ๊ฒช์๋ค. @FeignClient(name = "test-client")public interface TestClient { @GetMapping("/test") String getData(String query);}์์ ๊ฐ์ด ์ ์๋ OpenFeignํด๋ผ์ด์ธํธ๋ฅผ ํตํด A ์๋ฒ์์ B ์๋ฒ์ API๋ฅผ ํธ์ถํ๋๋ฐ, 405 Method Not Allowed ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๋ถ๋ช B ์๋ฒ์๋ ํด๋น API๊ฐ GET ๋ฉ์๋๋ก ์ ํํ ์ ์๋์ด ์๋๋ฐ๋ ๋ง์ด๋ค.@Slf4jpublic class FeignLoggingInterceptorConfig { @Bean public RequestInterceptor requestLoggingInterce.. 2025. 5. 26. Hibernate 5.x → 6.x QueryDSL ๊ด๋ จ ์ด์ ๊ฐ์Spring Boot 2.7.x์์ Spring Boot 3.3.x๋ก ๋ฒ์ ์ ๊ทธ๋ ์ด๋๋ฅผ ์งํํ๋ฉด์ ๋ฐ์ํ ์ฌ๋ฌ ๋ฌธ์ ์ค์์ QueryDSL๊ณผ ๊ด๋ จ๋ ์ด์๋ฅผ ๊ณต์ ํ๊ณ ์ ํ๋ค. (Hibernate ๋ฒ์ ์ ์งํํ ๋ Migration Guides๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋์ ๋๋ค.)๋จผ์ Spring Boot๊ฐ 3.x ๋ฒ์ ๋๋ก ์ฌ๋ผ์ค๋ฉด์ Hibernate๋ ๊ธฐ๋ณธ์ ์ผ๋ก 6.1 ๋ฒ์ ์ด ์ ์ฉ๋๋ค. ์ด์ ๋ง์ถฐ Hibernate๋ฅผ v6.5.3.Final๋ก ์ ๊ทธ๋ ์ด๋ํ์ผ๋ ์ํฅ์ผ๋ก ์ด์ ๊น์ง ๋ฌธ์ ์์ด ๋์ํ๋ ์ผ๋ถ QueryDSL ๋ก์ง์์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ธฐ ์์ํ๋ค. 1. InvalidDataAccessApiUsageException: org.hibernate.query.sqm.AliasCollisionExceptionprivate .. 2025. 3. 28. Spring ํธ๋์ญ์ ์ ์ธ์ ์ด๋ป๊ฒ ๋กค๋ฐฑ ๋ ๊น? -2ํธ(feat. rollback-only) ๊ฐ์์ด์ ๊ธ์์๋ Spring์ @Transactional ์ด๋ ธํ ์ด์ ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์์ธ ์ฒ๋ฆฌ์ ๋ฐ๋ผ ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋๋ ๋ฉ์ปค๋์ฆ์ ๋ํด ๋ค๋ฃจ์๋ค. ์ด๋ฒ ๊ธ์์๋ ์ค์ ์ฝ๋์ ํ ์คํธ๋ฅผ ํตํด ๋ค์ํ ์ํฉ์์ ํธ๋์ญ์ ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํด๋ณผ ์์ ์ด๋ค. ๊ธ์ ์ฝ๋ ๋ถ๋ค๋ ๊ฐ ์ํฉ์์ ๊ฒฐ๊ณผ๋ฅผ ์์ธกํด ๋ณด๋ฉฐ ๋ฐ๋ผ๊ฐ๋ฉด ์ดํด์ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.๋์ผํ ํด๋์ค ๋ด์์์ ํธ๋์ญ์ ๋์๋ณธ์ธ ๋ฉ์๋์์ ์์ธ ๋ฐ์ ์ ๋กค๋ฐฑ๋ค๋ฅธ ๋ฉ์๋ ํธ์ถ ํ ์์ธ ๋ฐ์ ์ ๋กค๋ฐฑ๋ณธ์ธ ๋ฉ์๋์์ try-catch๋ก ์์ธ ์ฒ๋ฆฌ ํ ์ปค๋ฐ๋ค๋ฅธ ๋ฉ์๋ ํธ์ถ ํ ๋ณธ์ธ ๋ฉ์๋์์ try-catch๋ก ์์ธ ์ฒ๋ฆฌ ํ ์ปค๋ฐ๋ณธ์ธ ๋ฉ์๋์์ noRollbackFor ์ค์ ํ ์์ธ ๋ฐ์ ์ ์ปค๋ฐnoRollbackFor ์ค์ ๋ ๋ค๋ฅธ ๋ฉ์๋.. 2024. 12. 22. 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. ์ด์ 1 2 3 4 ยทยทยท 6 ๋ค์