제 생각과 docs 그리고 다른 분들의 생각 등을 참고하여 작성한 글입니다. 정답이 아닐 수 있으므로 잘못된 부분은 댓글 또는 메일 부탁드립니다!

Spring batch BadSqlGrammarException

Description 스프링 배치를 처음 실행하려고 하면 BadSqlGrammarException 에러가 발생하는 현상이 있습니다. Error message java.lang.IllegalStateException: Failed to execute ApplicationRunner ... ... ... Caused by: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]; nested exception is java.sql.SQ..

Spring 2022.06.21 0

JPA @Converter와 Dirty Checking 이슈

서론서비스에서 JSON 데이터를 자바 객체로 다루기 위해 @Converter를 사용하는 경우가 많습니다. 저 역시 익숙하게 잘 사용하고 있었는데, 단순히 데이터를 조회했을 뿐인데도 Hibernate가 update 쿼리를 발생시키는 이상한 현상을 겪었습니다.명확한 update 로직도 없고, setter도 호출하지 않았습니다. 그런데도 대량의 update가 발생했고, 결국 트랜잭션 타임아웃으로 이어졌습니다. (테스트 환경에서..ㅎㅎ)이 문제는 JPA의 Dirty Checking과 @Converter의 조합에서 발생하는 전형적인 사례입니다.본론 1: @Converter는 편리합니다예를 들어 meta라는 JSON 필드를 자바 객체로 매핑하려면 아래와 같이 @Converter를 정의할 수 있습니다:@Convert..

Spring 2025.04.10 2

java.lang.UnsupportedOperationException

서론 java.lang.UnsupportedOperationException은 특정 연산이나 기능이 현재의 상황에서 지원되지 않을 때 발생하는 예외입니다. 이 예외는 주로 불변 객체나 수정이 불가능한 상태의 컬렉션에서 발생하며, 이에 대한 적절한 처리가 필요합니다. 이 예외가 발생하는 두 가지 예제를 통해 어떻게 해결할 수 있는지에 대해 설명하겠습니다. Arrays.asList()로 생성된 고정 크기 리스트에 원소 추가 Collections.singletonList()로 생성된 리스트에 원소 추가 결론 이처럼 불변 컬렉션으로 선언된 객체에 대해서 가변 하게 사용하면, java.lang.UnsupportedOperationException가 발생할 수 있습니다. 아래 코드는 올바른 예제입니다. 이상입니다...

Java 2023.12.28 0

Linux Terminal Backspace Issue

Description 리눅스 터미널에서 Backspace 키가 공백이나 제어 문자 (^H 또는 ^?)로 인식되는 경우에 해결 방법을 제시하겠습니다. Solution export TERM=vt100 Conclusion 이런 경우는 일반적으로 터미널 설정과 관련이 있습니다. 터미널은 환경 변수인 TERM을 사용하여 터미널의 유형을 식별합니다. TERM 변수는 터미널이 어떤 기능과 동작을 지원하는지에 대한 정보를 제공합니다. "export TERM=vt100" 명령은 TERM 환경 변수를 "vt100"으로 설정하는 것을 의미합니다. vt100은 오래된 터미널 유형 중 하나로, 대부분의 터미널에서 동작하는 터미널 에뮬레이터입니다. vt100으로 설정하면 백스페이스 키를 올바르게 인식할 수 있습니다. Refere..

Etc 2023.05.31 0

Spring batch란

해당 글은 이론 위주의 설명입니다. 실제로 구현한 예제는 여기에서 볼 수 있습니다. 이번에 배치 모듈을 사용해보게 됐습니다. 한 번도 배치 모듈을 사용해본 적이 없었지만, 앞으로 배치를 자주 사용하게 될 것 같아 공부하면서 내용을 정리해보려 합니다. 왜 사용할까? 크롤러로 어떤 사이트의 정보를 주기적으로 긁어 온다고 가정해보겠습니다. 크롤링할 때마다 개발자가 직접 API로 수행해야 할까요? 아닙니다. 자동으로 할 수 있다면 좋을 것입니다. 또한, 크롤링하는 정보의 양이 상당히 많다면 서버의 자원을 다 써버려서 다른 작업을 수행하기에 어려운 상태가 됩니다. 그렇다면, 사용량이 적은 시간대인 새벽에 처리한다면 좋을 것입니다. 그리고, 1억 개를 처리한다고 할 때 5만 번째에서 실패를 했는데 자동으로 5만 1..

Spring 2022.06.30 0