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. ์ด์ 1 2 3 4 5 ๋ค์