전체 글 67

Spring Batch와 직렬화 엑세스(ORA-08177) 오류 원인 및 해결

SQLException: ORA-08177: can't serialize access for this transactionSpring Batch 설정 중 '이 트랜잭션에 대한 직렬화 액세스를 할 수 없습니다.'는 에러가 발생했다. 결론부터 말하자면, 현재 애플리케이션의 트랜잭션 격리 수준이 직렬화(Serializable)로 설정되어 있는데, 이 규칙을 지키지 못해 발생한 에러이다. 여기서 '격리 수준'이란 트랜잭션 간의 동시성 문제를 해결하기 위한 규칙을 의미한다. 그중 Serializable 옵션은 한 트랜잭션이 특정 데이터를 읽는 동안, 다른 트랜잭션이 동일한 데이터에 접근/수정하는 것을 막기 위해 그 데이터에 잠금을 걸어 동시 접근을 방지한다. 따라서, 모든 트랜잭션이 마치 직렬로 실행되는 것처럼 ..

Spring 2024.12.14

[Spring Batch] ORA-00955 에러 해결하기

Spring Batch의 초기 구성을 설정하는 과정에서 여러 오류가 발생할 수 있다.이전 글에 이어 발생할 수 있는 ORA-0085 에러에 대해 알아보자. SQLSyntaxErrorException: ORA-00955: 기존의 객체가 이름을 사용하고 있습니다.Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of class path resource [org/springframework/batch/core/schema-oracle10g.sql]: CREATE TABLE BATCH_JOB_INSTANCE ( JOB_INSTANCE_ID..

Spring 2024.12.12

[Spring Batch] Table "BATCH_JOB_INSTANCE" not found

Batch 프로젝트의 초기 Config를 구성하는 과정에서 로컬과 개발 서버에서는 정상적으로 동작하는데,이상하게 운영 서버에서 실행하면 에러가 발생했다.해결하는 과정에서 여러 에러를 마주쳤는데, 최대한 상기하며 정리해보겠습니다. BadSqlGrammarException [SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]운영에 배포하기 전에 개발서버에서 정상 동작하는 것을 확인했었다. 그리고 에러 로그도 SQL Exception 관련 문제라고 말하지만 문제가 되는 테이블은 Spring Batch에서 관리하는 메타 테이블이기 때문에 mapper 쪽을 잘못 작성해서 발생한 문제는 아니다. 어쨌든..

Spring 2024.11.20

의존성 역전 원칙(DIP)과 인터페이스 소유권의 역전

'의존성 역전 원칙(DIP)'은 '의존성 주입'의 약자인 DI(Dependency Injection)와 비슷하게 생겼기에 유사한 개념이라고 혼동할 수 있다.연관이 아예 없는 것은 아니지만 어쨌든 ' SOLID'라고 객체지향 설계 원칙에서 제일 마지막에 등장하는 원칙인 'Dependency Inversion Principle' 과 이로 인해 생각해 볼 Spring Web MVC 구조에 대해서도 정리해 봤다. 의존성 역전 원칙(Dependency Inversion Principle) 이란?DIP의 정의는 아래와 같다. 이해하기 힘든 문장들을 코드와 함께 하나하나 파헤쳐 보자."상위 수준 모듈은 하위 수준 모듈에 의존해서는 안 된다. 둘 모두 추상화에 의존해야 한다. 또한, 추상화는 구체적인 사항에 의존해서는..

Spring 2024.11.17

Spring Boot(스프링부트) 핵심 특징과 Spring과의 관계

Spring Boot와 Spring의 관계Springboot(스프링부트)라는 단어를 처음 마주하면 그래서 Spring Framework와 다른 거야? 다르다면 어떻게 다른 건데?라는 궁금증이 생긴다. 굳이 구분을 짓자면 이름에서도 알 수 있듯이 Springboot는 Spring과 별개이다. 그래서 Spring의 버전과 Springboot의 버전을 말할 일이 있다면 잘 주의해서 말해야 한다. 하지만 그렇다고 Springboot가 Spring을 대체하거나 승계하여 나온 새로운 기술도 아니다. 결론부터 말하자면, Springboot는 Spring Framework를 더 쉽게 사용하도록 돕는 도구들의 모음이다. 즉, Springboot는 Spring을 효과적으로 사용하는 방법에 대한 강한 의견이 반영된 프레임워..

Spring 2024.10.30

Method invocation may produce NullPointerException 과 Optional 활용

IDE에서 "Method invocation may produce NullPointerException" 경고 메시지를 발견했다. 왜 이런 Warning이 표시되는가?Method invocation '~~~' may produce NullPointerException 경고를 해석해 보면 메서드 호출 시 NullPointerException이 발생할 수 있다는 것을 의미한다.저의 경우엔 getString() 메서드를 호출할 때 paramters 객체가 null일 수도 있다는 말인데.. 사실 위 코드는 Spring에서 제공하는 인터페이스를 활용하는 거라 JobParameters가 null일 수가 없는 코드이기는 했다. IDE가 이런 메시지를 나타내는게 이해가 안 되긴 하지만, 좀 생각해 보니 getStrin..

Java 2024.10.11

코드로 살펴보는 DispatcherServlet과 Servlet 인터페이스 (2)

이전 글에서 DispatcherServlet이 Aware 인터페이스를 활용해 어떤 역할을 하는지 알아봤다.이번에는 Servlet 인터페이스로부터 파헤쳐 보자. Servlet 인터페이스로부터 시작하는 DispatcherServlet먼저 서블릿(Servlet)이라는 개념을 찾아보면 '자바 웹 애플리케이션에서 HTTP 요청을 처리하기 위한 서버 측 컴포넌트'라고 정의되어 있다. 그러니까 Java에서 웹 요청을 처리하는 기술이자 구성 요소(오브젝트)라는 말인데.. 주로 Spring으로 웹 개발을 했었던 나에겐 당연한듯 익숙했던 Servlet이라는 대명사의 의미에 왜 Java라는 특정 언어에 종속된 단어가 포함되어 있는 거지? 싶어서 더 찾아봤다.결론적으로 Servlet이라는 개념은 Java에만 해당하는 개념으로..

Spring 2024.10.06

코드로 살펴보는 DispatcherServlet과 Aware (1)

DispatcherServlet의 역할과 계층 구조클라이언트로부터 웹 요청이 들어왔을 때 WAS는 Spring Container가 가진 Object한테 요청에 대한 처리를 위임한다. 그리고 Spring에서 이 역할을 하는 것이 정확히는 DispatcherServlet인데, 위 행동을 하기 위해 어떤 Object가 어떤 요청 처리를 담당하고 있는지 알 수 있는 '매핑 정보'를 필요로 한다.즉 Spring 애플리케이션이 실행되면 DispatcherServlet이 빈으로 등록될 때 매핑 정보를 주입해 줘야 하는데, 어떻게 이게 가능한 걸까? 상속과 구현 계층 구조를 확인해 보자. Aware로 시작하는 DispatcherServlet내부 소스를 보면 가장 안쪽에 Aware이라는 마커 인터페이스(Marker In..

Spring 2024.09.26

IoC/DI란? 그리고 Spring이 적용하는 OCP(개방 폐쇄 원칙)

Spring Container는 흔히 Spring IoC/DI Container 라고 불릴 정도로IoC와 DI는 Spring에서 빠질 수 없는 가장 대표적인 특징이다.그런데 DI(의존성 주입) 그리고 IoC(제어의 역전)라는 단어만 따로 보면 직관적으로 이해하기 어렵다.분리되어 있는 두 개념을 한 번에 정리하면서,객체 지향 설계 원칙 중 하나인 OCP(개방 폐쇄 원칙)를 알아보자. Spring IoC/DI Container의 의미의존성 주입(Dependency Injection)이라는 용어는 의존관계를 주입해 준다는 것을 말하는데, 여기서 '의존 관계'라는 건 Spring에서만의 특별한 개념이 아니라 어떤 A라는 객체가 B라는 클래스 or 오브젝트를 사용하는 것을 뜻한다. 이때 'A는 B에 의존하고 있다..

Spring 2024.09.21

Servlet Container란? 그리고 Spring과의 관계

Servlet과 Servlet ContainerServlet은 URI정보 및 클라이언트의 요청 정보를 분석하는 기능을 담당하는 Java 표준 기술이다. 그리고 이 표준 기술을 이용한 Servlet Container 중 가장 대표적인 예로 Tomcat이 있다. 다시 말해, 우리가 많이 사용하는 Tomcat이라는 WAS는 (Servlet) Container 기술을 구현한 라이브러리 중의 하나이며, Tomcat 자체가 Java의 표준이 아니다. 이외에도 종류가 많은데 특히 Springboot에서는 Tomcat 과 Jetty, undertow(언더토우) 이 3가지의 Container를 Standalone하게 동작할 수 있도록 지원하고 있다(쉽게 변경 및 선택이 가능하다) Spring Boot Reference ..

Spring 2024.09.17