[Java] volatile - ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ฐ€์‹œ์„ฑ ๋ฌธ์ œ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
ยท
Backend/Jave&Spring
๋“ค์–ด๊ฐ€๋ฉฐ ๋…๋ฆฝ ํ + ์ „์šฉ ์›Œ์ปค ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ์ข…๋ฃŒ ์‹ ํ˜ธ๊ฐ€ ์›Œ์ปค ์Šค๋ ˆ๋“œ์— ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. @PreDestroy์—์„œ running = false๋ฅผ ๋ถ„๋ช…ํžˆ ์ผ๋Š”๋ฐ๋„ ์›Œ์ปค ์Šค๋ ˆ๋“œ๋Š” ๋ฃจํ”„๋ฅผ ๊ณ„์† ๋Œ๊ณ  ์žˆ์—ˆ๋‹ค. private volatile boolean running = true; ํ•ด๊ฒฐ์ฑ…์€ volatile ํ•œ ํ‚ค์›Œ๋“œ์˜€์ง€๋งŒ, ์™œ ์—†์œผ๋ฉด ์•ˆ ๋˜๋Š”์ง€๋Š” ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ์ด ๊ธ€์€ ๋ฌธ์ œ์˜ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๊ตฌํ˜„์— ์ด๋ฅด๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์„ ๋‹ด์•˜๋‹ค. 1. ๋ฌธ์ œ ๋ฐœ์ƒ - volatile ์—†์ด ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์ง€๋Š”๊ฐ€ volatile ์—†์ด ์ข…๋ฃŒ ํ”Œ๋ž˜๊ทธ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ์ƒ๊ธฐ๋Š”์ง€ ์ฝ”๋“œ๋กœ ๋จผ์ € ๋ณด์ž.// volatile ์—†์Œprivate boolean running = true;// ์›Œ์ปค ..
[Spring/batch] BlockingQueue์™€ ์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•œ Telegram 429 Rate Limit ํ•ด๊ฒฐ
ยท
Backend/Jave&Spring
๋ฌธ์ œ ์ƒํ™ฉ ์Šคํ”„๋ง ๋ฐฐ์น˜ ์„œ๋น„์Šค์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—… ๋Œ€์ƒ์„ ์Šค๋ ˆ๋“œ ํ’€๋กœ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์™„๋ฃŒ ํ›„ Telegram์œผ๋กœ ๋ฐฐ์น˜ ๊ฒฐ๊ณผ๋ฅผ ์•Œ๋ฆผํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ํ‰์†Œ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋Š”๋ฐ, ๋‹จ๊ธฐ๊ฐ„(1~2์ดˆ)์— ๋๋‚˜๋Š” ๋ฐฐ์น˜ ๋Œ€์ƒ์ด ๋งŽ์€ ํŠน์ • ์‹œ๊ฐ„๋Œ€์˜ ๋ฐฐ์น˜์—์„œ๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐ˜๋ณต ๋ฐœ์ƒํ–ˆ๋‹ค. 14:30:00์— 46๊ฑด์„ ๋Œ€์ƒ์œผ๋กœ ๋ฐฐ์น˜ ์‹œ์ž‘ ํ›„, ์ˆœ์ฐจ์ ์œผ๋กœ Telegram ์•Œ๋ฆผ์„ ๋ฐœ์†กํ–ˆ๋‹ค.(๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰๋ถ€ํ„ฐ ์•Œ๋ฆผ ๋ฐœ์†ก๊นŒ์ง€ ๋ฐฐ์น˜ ๋Œ€์ƒ ๋‹น 1~2์ดˆ ์•ˆ์— ๋๋‚œ๋‹ค.) ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ 14:30:33๋ถ€ํ„ฐ Telegram ์•Œ๋ฆผ ๋ฐœ์†ก ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 14:30:33 429 Too Many Requests retry_after: 2714:30:34 429 Too Many Requests retry_after: 2..
[Java/Spring] Heap ์บ์‹œ vs Offheap ์บ์‹œ - ์บ์‹œ ํžˆํŠธ์ธ๋ฐ ์™œ ๋А๋ฆด๊นŒ?
ยท
Backend/Jave&Spring
๋ฐฐ๊ฒฝ์–ผ๋งˆ ์ „ ์—…๋ฌด์—์„œ ์บ์‹œ๋ฅผ ์ ์šฉํ–ˆ๋Š”๋ฐ๋„ ์„ฑ๋Šฅ์ด ๋‚˜์•„์ง€์ง€ ์•Š๋Š” ์ด์ƒํ•œ ์ƒํ™ฉ์„ ๊ฒช์—ˆ๋‹ค.์บ์‹œ ํžˆํŠธ๋Š” ์ •์ƒ์ด์—ˆ๋‹ค. ๊ทผ๋ฐ ๋А๋ ธ๋‹ค. ๋ฌธ์ œ๋Š” 8500๊ฐœ์งœ๋ฆฌ Map์„ ์บ์‹œ์—์„œ ๊บผ๋‚ด๋Š” ๋กœ์ง์— ์žˆ์—ˆ๋‹ค. getDataMap()์€ ๋ถ„๋ช… ์บ์‹œ์—์„œ ์‘๋‹ตํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์š”์ฒญ์ด ๋ชฐ๋ฆด ๋•Œ๋งˆ๋‹ค ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐ˜๋ณต๋๋‹ค.@Cacheable(value = "dataCache", key = "'dataMap'")public Map getDataMap() { return dataRepository.findAll();} ์›์ธ์„ ํŒŒ๊ณ ๋“ค๋‹ค ๋ณด๋‹ˆ ๋‚ด๊ฐ€ ์บ์‹œ ์„ค์ • ํŒŒ์ผ์—์„œ ๋ฌด์‹ฌ์ฝ” ์„ ์“ฐ๊ณ  ์žˆ์—ˆ๋‹ค๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋๋‹ค. 50 ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋•Œ ์ฒ˜์Œ์œผ๋กœ ์ œ๋Œ€๋กœ ์ดํ•ดํ–ˆ๋‹ค. Heap ์บ์‹œ์™€ Offheap ์บ์‹œ๋Š” ๋™์ž‘ ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š”..
[Spring/Redis] lettuce-core ๋ฒ„์ „ ๋ฌธ์ œ - Caused by: io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required.
ยท
Backend/Jave&Spring
โš ๏ธ ๋ฌธ์ œ ์ƒํ™ฉ Spring Boot์—์„œ Gradle์— ์žˆ๋Š” Dependency์˜ ๋ฒ„์ „์„ ์ •๋ฆฌํ•˜๋˜ ์ค‘์— Redis ์‚ฌ์šฉ์„ ์œ„ํ•œ Lettuce ์˜์กด์„ฑ์„ ์ˆ˜์ •ํ•˜๋˜ ์ค‘ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ์‚ฌ์šฉํ•˜๋Š” Lettuce ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…์‹œ์ ์œผ๋กœ ์ ์–ด์คฌ์—ˆ๋‹ค.implementation 'io.lettuce:lettuce-core:6.0.0.RELEASE' ํ•˜์ง€๋งŒ ํ˜„์žฌ Spring Boot ๋ฒ„์ „์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์„ ๋•Œ๋„๋ก ์ˆ˜์ •ํ•ด์คฌ๋‹ค.implementation 'io.lettuce:lettuce-core' ๋นŒ๋“œ๋Š” ์ œ๋Œ€๋กœ ๋˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. โ—๏ธ์—๋Ÿฌ ๋ฉ”์‹œ์ง€Caused by: io.lettuce.core.RedisCommandExecuti..
[Spring] CollectionUtils ํ™œ์šฉํ•œ null, empty ์ฒดํฌ
ยท
Backend/Jave&Spring
์ž๋ฐ”์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ๋•Œ ์–ธ์ œ๋‚˜ ์กฐ์‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ NullPointerException์ด๋‹ค.์‹ค์ œ๋กœ ์ตœ๊ทผ ์‹ค๋ฌด์—์„œ null ์ฒดํฌ๋ฅผ ๊ผผ๊ผผํžˆ ์•ˆํ–ˆ๋‹ค๊ฐ€ ์šด์˜์—์„œ ์—๋Ÿฌ๊ฐ€ ์ฐํžˆ๋Š” ์‚ฌํƒœ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๐Ÿ˜ฑ ๊ทธ๋ฆฌ๊ณ  List๊ฐ€ null ์ธ์ง€์™€ ๋น„์—ˆ๋Š”์ง€๋ฅผ ๋ชจ๋‘ ํ™•์ธํ•ด์ค˜์•ผ ํ•  ์ผ์ด ์ƒ๊ฒผ๋Š”๋ฐ, Spring์—์„œ ์ œ๊ณตํ•˜๋Š” CollectionUtils์„ ์“ฐ๋ฉด ํ•œ ๋ฒˆ์— ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค. 1. null vs empty์šฐ์„  null๊ณผ empty์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์ž.์•„๋ž˜ ๊ทธ๋ฆผ์€ null๊ณผ empty์˜ ์ฐจ์ด๋ฅผ ์•„์ฃผ ์ž˜ ์„ค๋ช…ํ•ด์ฃผ๋Š” ์งค์ด๋‹ค. ์™ผ์ชฝ ์นธ์„ ๋ณด๋ฉด ํœด์ง€์˜ ์ฃผ์š” ๋‚ด์šฉ๋ฌผ์ธ ํฐ ๋ถ€๋ถ„(๋ฐ์ดํ„ฐ)๊ฐ€ ์—†๊ณ , ํœด์ง€๋ฅผ ๋‹ด๊ณ  ์žˆ๋˜ ํœด์ง€์‹ฌ(๊ฐ์ฒด)๋Š” ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.์˜ค๋ฅธ์ชฝ ์นธ์„..
[Spring /JUnit] Mock ๊ฐ์ฒด์™€ ์ฃผ์†Œ๊ฐ’ ๋น„๊ต ๋ฌธ์ œ - Argument(s) are different! : org.mockito.exceptions.verification.opentest4j.ArgumentsAreDifferent
ยท
Backend/Jave&Spring
โ—๏ธ์—๋Ÿฌ ๋ฉ”์‹œ์ง€org.mockito.exceptions.verification.opentest4j.ArgumentsAreDifferent      ๐Ÿ’ป ๊ฐœ๋ฐœ ํ™˜๊ฒฝFramework : `Spring Boot 3.2.3`DB : `MySQL`(๋กœ์ปฌ), `H2`(ํ…Œ์ŠคํŠธ)Library : `JPA`, `QueryDSL 5.0.0`Test : `JUnit`     ๐Ÿ”Ž ์›์ธSpring์—์„œ Junit์œผ๋กœ Controller ๋‹จ์˜ ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ • ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š”๋ฐ, `verify()` ๋ถ€๋ถ„์—์„œ ๊ฒ€์ฆ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค.  @Nested @DisplayName("๊ตฌ์ธ ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •") public class updateHiringPostTest { private Long postId; pr..
giraffe_
'Backend/Jave&Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก