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

Spring batch - JobInstanceAlreadyCompleteException ํ•ด๊ฒฐ RunIdIncrementer - ์™„์ „ํžˆ uniqueํ•˜์ง€ ์•Š๋‹ค. JobInstanceAlreadyCompleteException ํ˜น์€ JobExecutionAlreadyRunningException์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ batch job์˜ run.id ์™€ job parameter๊ฐ€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ์ผ ํ™•๋ฅ ์ด ํฌ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด spring batch์—์„œ run.id๋ฅผ ์ž๋™์œผ๋กœ 1์”ฉ ์ฆ๊ฐ€์‹œ์ผœ ๋™์ผํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•œ๋‹ค. @Bean public Job myBatchJob() { return jobBuilderFactory.get("myBatchJob") .incrementer(new RunIdIncrementer()) // RunIdIncrementer ์ ์šฉ .st..
JDBC Templete + PostgreSql ERROR (Can't infer the SQL type to use for an instance of java.util.ArrayList.) org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of java.util.ArrayList. Use setObject() with an explicit Types value to specify the type to use. ์›ํ•˜๋˜ ์ž‘์—… ๊ฐ๊ฐ ๊ฒ€์ƒ‰ํ–ˆ์„ ์‹œ Query์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์ง€๋Š” ๊ฒƒ์„ ์šฐ๋ คํ•ด list์•ˆ์— id๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฐ€์ ธ์˜ค๋Š” SQL์„ ์งœ๋ ค๊ณ  ํ–ˆ๋‹ค. select * from public.game_id_name where app_id in (?) ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์ฝ”๋“œ ํ•˜์ง€๋งŒ ์œ„์˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ  postgresql์˜ ๊ฒฝ์šฐ java list ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. public Lis..
domain, entity, dao, dto, vo ?? Salenote์˜ ๊ฒฝ์šฐ WAS๊ฐ€ DB๋ฅผ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— (MVP ๊ธฐ์ค€) JPA๋ฅผ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ด JDBC Templete๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๋ง‰์ƒ Salenote ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋‹ˆ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ class๋ฅผ ๋ถ„๋ฅ˜ํ• ์ง€, ์ด๋ฆ„์€ ๋ญ˜๋กœ ํ• ์ง€ ๊ณ ๋ฏผ์ด ๋๋‹ค. domain, entity, dao, dto, vo์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ๊ฐœ๋…์ด ์žก๊ธฐ์œ„ํ•ด ๋‹ค์–‘ํ•œ ํฌ์ŠคํŒ…์„ ๋‘˜๋Ÿฌ๋ณธ ๋’ค ๋‚˜๋ฆ„๋Œ€๋กœ ์ •๋ฆฌํ–ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋กœ์ง์„ ํ˜•์„ฑํ–ˆ๋‹ค. 0. client์—๊ฒŒ ์š”์ฒญ์ด ์˜ด 1. controller๊ฐ€ ๋ฐ›์•„ service ๋กœ์ง ์‹คํ–‰ 2. service๋Š” dao๋ฅผ ์‹คํ–‰ (์„œ๋น„์Šค ํŠน์„ฑ ์ƒ WAS์—์„œ schema๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์•„ domain์€ ํ•„์š” ์—†์Œ!) 3. SQL๋ฅผ ์ž‘์„ฑํ•ด๋‘” dao์—..
์Šคํ”„๋ง ์›น ๊ฐœ๋ฐœ ๋ฐฉ์‹ (static / MVC / API) ์ข…๋ฅ˜ ์ •์  ์ปจํ…์ธ  : ์„œ๋ฒ„์—์„œ ํ•˜๋Š” ๊ฒƒ ์—†์ด ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„ : jsp php์ฒ˜๋ฆผ html์„ ๊ทธ๋ƒฅ ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ”์„œ ์ฃผ๋Š” ๊ฒƒ API : json์ด๋ž€ ๋ฐ์ดํ„ฐ ํฌ๋งท์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ, ํ™”๋ฉด์€ ํ”„๋ก ํŠธ๊ฐ€ ์•Œ์•„์„œ ์ •์  ์ปจํ…์ธ  ๊ธฐ๋ณธ์ ์œผ๋กœ Spring์€ static ํด๋”์—์„œ ์ •์  ์ปจํ…์ธ ๋ฅผ ์ฐพ์•„ ์ œ๊ณต ex) static ํด๋”์— hello-static.html ํŒŒ์ผ์„ ๋„ฃ์œผ๋ฉด localhost:8080 /hello-static.html ์ฃผ์†Œ๋กœ ๋งคํ•‘๋จ localhost:8080/hello-static.html ์š”์ฒญ ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„๊ฐ€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋กœ ์š”์ฒญ ์ „๋‹ฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ controller ํ™•์ธ "hello-static"๊ด€๋ จ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์—†์„์‹œ resources ํ™•..
Spring ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ (Gradle) java jdk ์„ค์น˜ Intelli J ์„ค์น˜ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ https://start.spring.io/ ๋” ๋น ๋ฅธ ๋นŒ๋“œ๋ฅผ ์œ„ํ•ด build and run using ๊ณผ run tests using์„ intelli j ๋กœ ๋ณ€๊ฒฝ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ spring boot spring-boot-starter-web spring-boot-starteer-tomcat spring-webmvc spring-boot-starter-thymeleaf spring-boot-starter spring-boot spring-core spring-boot-starter-logging logback, slf4j test spring-boot-starter-test junit mockito assertj spring-test ๋นŒ๋“œ ๋ฐฉ๋ฒ• ํ”„๋กœ์ ..
ZonedDateTime (UTC -> KST) dateTime์— โ€œzโ€๋ฅผ ๋ถ™์—ฌ๋‹ฌ๋ผ๋Š” ํ”„๋ก ํŠธ์˜ ์š”์ฒญ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. LocalDateTime : "2022-02-23T12:51:17" ZonedDateTime : "2022-02-23T12:51:17.233Z" ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ํ˜•์‹์— โ€œzโ€๋กœ DateTime์˜ zone์„ ํ‘œํ˜„ํ•ด์ค๋‹ˆ๋‹ค. (UTC๊ธฐ์ค€์ผ๋•Œ!) ๋ชจ๋“  LocalDateTime ๋ณ€์ˆ˜๋“ค์„ ZonedDateTime์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  DB์˜ ์นผ๋Ÿผ๋„ ZonedDateTime์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์™€ ๋ฐฑ ์‚ฌ์ด์˜ ํ†ต์‹ ์€ ๋ชจ๋‘ UTC ๊ธฐ์ค€์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. UTC์™€ KST๋Š” +9์‹œ๊ฐ„์˜ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ์กฐํšŒ๋ฅผ ํ•  ๋•Œ UTC โ†’ KST โ†’UTC๋กœ ๊ณผ์ •์„ ๊ฑฐ์ณ ์กฐํšŒํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ..
Spring ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ - JUnit5 restAPI ๊ตฌ์กฐ๋กœ request๋Š” @valid ๋กœ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค ๋” ์•ˆ์ •์ ์ธ ์„œ๋ฒ„ ์ œ๊ณต์„ ์œ„ํ•ด API ๊ฐœ๋ฐœ์ด ๋ชจ๋‘ ์™„๋ฃŒ๋œ ์‹œ์ ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค ๊ฐœ๋ฐœ๊ธฐ๊ฐ„์ด ์งง์•„ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” TDD ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ์™€์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ผ์ผํžˆ ์ง„ํ–‰ํ•˜๊ธฐ๋ณด๋‹ค ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค post / body ์˜ˆ์ œ import ... @SpringBootTest @AutoConfigureMockMvc class MissionControllerTest { @Autowired MockMvc mockMvc; @Autowired private ObjectMapper objectMapper; @Test @WithUserDetails..
GraphQL (spring) ์ˆœ์„œ๋Œ€๋กœ ์ฝ๊ธฐ https://tech.kakao.com/2019/08/01/graphql-basic/ GraphQL ๊ฐœ๋…์žก๊ธฐ GraphQL์€ ํŽ˜์ด์Šค๋ถ์—์„œ ๋งŒ๋“  ์ฟผ๋ฆฌ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. GrpahQL์€ ์š”์ฆ˜ ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ์ž์ฃผ ์ž…์— ์˜ค๋ฅด๋‚ด๋ฆฌ๊ณ  ์žˆ์œผ๋‚˜, 2019๋…„ 7์›” ๊ธฐ์ค€์œผ๋กœ ์–ผ๋ฆฌ์Šคํ…Œ์ด์ง€(early-stage)์ž„์€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ตญ๋‚ด์—์„œ GraphQL API๋ฅผ O tech.kakao.com https://jinhokwon.github.io/springboot/springboot-graphql/ Spring Boot GraphQL 1. GraphQL jinhokwon.github.io https://muuu.tistory.com/12 Spring Boot์„œ๋ฒ„์—์„œ GraphQL์š”์ฒญ ์ฒ˜๋ฆฌํ•˜๊ธฐ Spring Boot ์„œ..

๋ฐ˜์‘ํ˜•