·스프링 배치(Spring Batch)는 대용량 처리와 반복적인 작업을 수행하는데 사용되는 자바 및 스프링 기반으로 프레임워크입니다.

 

🤔 스프링 배치를 사용하는 이유는 무엇일까요?

1. 대용량 데이터 처리 : 스프링 배치는 대용량 데이터 처리에 특화되어 있습니다. 대용량 데이터를 일괄적으로 읽고(Read), 처리(Process), 쓰기(Write)가 가능합니다.

👉 처리와 쓰기에는 데이터 가공 로직이 포함될 수 있습니다.

2. 반복 작업 자동화 : 스프링 배치는 주기적으로 실행되는 반복적인 작업을 자동화할 수 있습니다. 

3. 트랜잭션 : 스프링 배치는 트랜잭션 관리를 지원하기 때문에 안정적인 데이터 처리를 보장할 수 있습니다. 장애 발생 및 프로그램 중단 상황에서도 작업의 일관성을 유지할 수 있습니다.

4. 장애 복구 : 스프링 배치는 장애 및 프로그램 중단 이후 실패한 작업(Job)을 재시작할 수 있는 기능을 제공합니다. 이를 통해 시스템의 안정성을 향상시킬 수 있습니다.

5. 모니터링 및 관리 : 스프링 배치는 작업의 모니터링 및 관리를 위한 다양한 기능을 제공하고 있습니다.

 

 

🤔 스프링 배치의 대표 작업 3가지

  • Read : 데이터를 읽어오는 작업을 수행합니다. 외부시스템(데이터베이스, 파일, 큐 등)에서 데이터를 읽어옵니다.
    • FlatFileItemReader : 텍스트 파일을 읽으며, 각 라인은 하나의 아이템으로 처리됩니다.
    • JdbcCursorItemReader : JDBC를 사용해서 DB 데이터를 읽으며. 커서를 이용하므로 대용량 데이터 처리에 적합합니다.
    • JpaPagingItemReader : JPA를 사용해서 DB 데이터를 읽으며, 페이징을 사용하여 대용량 데이터를 효율적으로 처리할 수 있습니다.
    • JmsItemRader : JMS(Java Message Service)를 사용하여 메시지 큐에서 데이터를 읽어오며, 메시지 큐에 들어있는 메시지를 하나씩 읽어올 수 있습니다.
    • IteemReaderAdapter : 사용자 정의 Reader를 스프링 배치의 ItemReader 인터페이스와 연결해주는 어댑터 입니다. 기존 Reader를 재사용할 때 유용합니다.
    • StoredProcedureItemReader : 저장 프로시저를 사용하여 DB 데이터를 읽어옵니다.
    • MultiResourceitemReader : 여러 개의 리소스(파일 등)에서 데이터를 읽어옵니다.
  • Process : 읽어온 데이터를 가공하거나 변환합니다.
  • Writer : 가공된 데이터를 쓰거나 저장합니다. 이 단계에서는 DB 테이블에 데이터를 저장하거나, 파일로 출력하거나, 메시지를 저장하는 등의 작업을 수행합니다. 
    • JdbcBatchItemWriter : JDBC를 사용하여 데이터를 DB에 저장합니다.
    • FlatFileItemWriter : 텍스트 파일에 데이터를 쓰는 Writer 입니다. CSV, XML, JSON 등 다양한 형식의 파일을 생성할 수 있습니다.
    • JpaItemWriter : JPA를 사용하여 DB에 저장합니다.
    • CompositeItemWriter : 여러 개의 Writer를 조합하여 사용할 수 있습니다. 
    • MultiResourceItemWriter : 여러 개의 리소스(파일 등)를 사용할 수 있습니다.
    • ItemWriterAdapter : 사용자 정의 Writer를 스프링 배치의 ItemWriter 인터페이스와 연결해주는 어댑터입니다.

 

 

🤔 스프링 배치의 아키텍처

 

 

  • Application : 이 모듈은 스프링 배치 어플리캐이션이라고도 하며 스프링 프레임워크를 기반으로 하는 배치 어플리케이션을 개발하는데 필요한 기능들을 제공합니다. 이 모듈은 배치 작업의 구성, 실행, 모니터링, 관리 등의 기능을 제공합니다.
  • Batch Core : 이 모듈은 스프링 배치의 핵심 기능을 제공합니다. 이 모듈은 배치 작업의 실행 흐름을 관리하고, 각 단계(Read, Process, Write) 등의 구현체를 포함하고 있습니다. 이를 사용하여 실제 데이터 처리를 수행합니다. 그리고 배치 작업의 잡(Step), 잡 인스턴스(Job Instance), 스텝(Step) 등의 개념을 정의하고 이를 실행하며, 트랜잭션 관리와 예외 처리 등의 기능도 포함합니다.
  • Batch Infrastructure : 이 모듈은 스프링 배치 기반 인프라스트럭처를 제공합니다. Reader, Processor, Writer 등의 구현체를 포함하고 있으며, 이를 사용해서 실제 데이터 처리를 수행합니다. 또한 트랜잭션 관리, 데이터 엑세스, 메시지 등의 기능도 제공합니다.

 

 

 

안녕하세요. 대학원 신입생 모집 기간을 맞아 제가 졸업한 단국대학원에 대해 공유 드립니다.

저는 정보융합기술·창업대학원 IT컨버전스학과 졸업생 입니다.

(2021년 후기 입학 및 2023년 7월 졸업)

 

# 제가 왜 대학원 진학을 결정했는지 말씀 드립니다.

1. 최종 학력 갱신

2. 휴먼 네트워크

3. 논문 작성

4. 전공 추가 학습

최종 학력을 갱신함으로써 자신감을 얻었고 앞으로 인생에 더 많은 기회를 얻을 수 있을거라 생각합니다. 또한 개발자로 재직 중인 상태에서 더 다양한 IT 실무자와 다른 분야의 실무자를 많이 만날 수 있었습니다. 그리고 논문을 작성함으로써(피똥 쌌지만..) 인생의 버킷 리스트도 달성했습니다. 물론 관련 공부도 많이 했습니다.

 

# 왜 단국대학교를 선택했는지 말씀드립니다.

1. 토요일 수업 진행

 - 대부분의 대학원은 평일 2~3회 수업이 진행됩니다. 하지만 단국대학원은 주말에 3교시를 몰아서 수강하기 때문에 업무에 지장 받지 않는 장점이 있습니다.

2. 4학기 졸업

 - 대부분의 대학원은 5학기 과정으로 진행됩니다. 한 학기 빨리 졸업할 수 있는 장점이 있습니다.

3. 등록금 지원

 - 일반 기업 재직(20%) 와 추가 장학금(20%) 총 40%의 학비를 지원받을 수 있습니다. 한 학기 약 600만원 의 등록금 중 240만 원 가까운 금액을 지원받을 수 있고 졸업까지 최대 2000만 원의 학비만 납부하는 장점이 있습니다.

4. 가까운 거리와 교통

 - 단국대학교는 경기도 용인시 수지구에 있습니다. 죽전역과 가까우며 학교 내부에 버스 종점이 있기 때문에 접근성이 매우 좋습니다.

 - 저는 대부분 자차를 이용했는데 주차장도 넉넉하고 주차 비용도 합리적입니다. (한 학기 주말 정기권 3~4만 원 or 일일 4천 원)

5. 젊어지는 연령대

 - 대학원 학생들은 기업 사장님들이 많아 연령대가 높다는 인식이 있었습니다. 하지만 대부분 제 또래(30대 초반)이며 학기가 지날수록 점점 더 젊어진다는 느낌을 받았습니다. 하지만  

6. 다양한 동문

 - 휴먼 네트워크 구축도 대학원 진학의 목표 였습니다. 저는 과대표도 2학기 수행 했는데, 덕분에 동문 및 학우 분들과 가깝게 지낼 수 있었습니다.

 

# 단국대를 졸업하며 느꼈던 큰 장점을 말씀 드립니다.

교수님들의 수준이 정말 높다고 생각됩니다.

  감히 제가 교수님들을 평가할 수 있겠냐만은, 입학을 고려하시는 분들께 단언할 수 있습니다. 대학원은 단순히 커리큘럼에 있는 내용만 학습하는 곳이 아니라고 생각 됩니다. 실무/이론 등 교수님들께서 갖고 게신 정말 많은 지식들을 얻어가실 수 있습니다.

 

# 마지막으로..

대학원을 고민하시는 분들 모두 다양한 목적과 고려 사항이 있을 것으로 보입니다. 여러 가지 고민을 하실텐데 수도권에 계시면 단국대학원이 좋은 선택이 될 수 있을것 같습니다 ^^

 

 

 

 

[정보융합기술·창업대학원]

https://cms.dankook.ac.kr/web/gict

 

[정보융합기술·창업대학원 공지사항]

https://cms.dankook.ac.kr/web/gict/-23

IT 컨버전스 학과

Intellij Spring 'Could not find or load main class' Caused by 'java.lang.ClassNotFoundException'

 

* 스프링 부트에서 'Gradle'이 아니 'Maven' 을 사용할 때 발생한 에러 입니다. (Gradle 도 동일할 수 있습니다.)

 

Maven 프로젝트 생성 및 개발 진행 중 특정 시점으로 소스를 롤백이 필요했습니다.

소스 롤백 후 start를 하는데 클래스를 찾을 수 없다는 에러가 발생 했고, 에러 해결 방법을 찾아 봤습니다.

 

아래와 같이 진행 해주세요.

1.Build 메뉴의 'Build Project' 또는 'Rebuild Project' 를 실행 해주세요.

(인텔리제이는 가끔 클래스를 최신화 하지 않기 때문에, build를 다시 해주세요.)

도커를 윈도우 환경에서 설치하는 순서입니다.

 

1. 도커 설치를 위해 사용중인 PC의 가상화 옵션을 사용으로 바꿔주세요.

* 가상화 : 미사용일 경우 아래와 같이 사용으로 변경 해주세요

 [Windows 하이퍼바이저 플랫폼]과 [가상 머신 플랫폼] 항목을 체크 해주세요.

 

 

 

2. 도커 윈도우 다운로드 사이트에서 설치 파일을 다운로드 해주세요.

https://hub.docker.com/editions/community/docker-ce-desktop-windows/

 

Docker Desktop for Windows by Docker | Docker Hub

Docker Desktop for Windows Docker Desktop for Windows is Docker designed to run on Windows 10. It is a native Windows application that provides an easy-to-use development environment for building, shipping, and running dockerized apps. Docker Desktop for W

hub.docker.com

 

 

 

3. 다운로드된 설치 파일을 실행 해주세요.

 

 

 

4. 설치된 도커를 실행 해주세요

 

 

 

5. 도커 약관에 동의 해주세요

 

 

 

6. 튜토리얼이 필요하신 분은 'Start'버튼을 눌러 확인 해주시고, 아니신 분은 'Skip tutoral'을 눌러주세요.

 

 

 

7. 도커 설치가 완료됐습니다.

'The server cannot be started because one or more of the ports are invalid. Open the server editor and correct the invalid ports.'

 

새로운 스프링 프로젝트를 생성 및 등록하고 톰캣을 실행하려고 하니 해당 에러가 발생했습니다.
실행시킨 톰캣의 포트가 유효하지 않아 발생된 에러로 아래와 같이 해결해 주시면 됩니다.

 

 

1. 'Server' 탭의 톰캣 더블클릭 

 

 

2. 'Ports'의 'Tomcat admin port' 및 'HTTP/1.1' 포트가 입력 됬는지 확인

 -> 보통 새로 설정 하면 'Tomcat admin port'가 '-' 로 설정되있는 경우가 있어 위의 에러가 발생 합니다.

 

 

 

3. 정상적으로 실행된 톰캣입니다.

스프링 프로젝트 JUnit 테스트에서 Method 'initializationError' not found. Opening the test class. 가 발생하는 원인은,

프로젝트에 JUnit 라이브러리가 추가되지 않았기 때문입니다.

아래의 과정을 거쳐 라이브러리를 등록 해주세요.

 

 

 

1. 프로젝트 우클릭 -> Properties -> Java Build Path -> Libraries -> Add Library

 

 

 

2. JUnit 선택

 

 

 

3. 의존성 추가된 JUnit 버전을 선택 하세요. 저는 JUnit4를 사용중입니다.

 

 

 

 

4. 등록 후 Apply and Close를 클릭 하고 실행 하시면 됩니다.

 

스프링 프로젝트를 진행 하다보면 IDE(이클립스 or STS 등) 을 사용 하는데, 

가끔씩 'Problems opening an editor. Reason: {project name} does not eixist' 에러가 발생 합니다.

2개 이상의 프로젝트가 맞물려 작동하는 계층 구조에서 상위 프로젝트를 import 하지 않았거나, 'Close Project' 된 경우 주로 발생 합니다.

 

1. 프로젝트 Close 여부. 아래 그림은 프로젝트가 closed된 경우입니다.

 

2. 프로젝트가 import 되지 않은 경우. import해주시면 됩니다.

 

3. import 했는데도 안 될때. (Gradle 이나 Maven 의 빌드를 우선 진행 하시고, 그래도 안되면 아래르 따라해주세요)

3-1. 프로젝트 -> 우클릭 -> Project Facets -> Convert to faceted form

 

3-2 . Application 체크 -> Apply and Close

OOP의 4대 특성중에는 다형성(Polymorphism)은 같은 자료형이지만 다양한 변수나 메소드를 대입하여 다양한 결과를 얻어내는 능력을 말합니다.

 

오버라이딩(Overriding)

- 상위 클래스에서 선언된 메소드를 하위 클래스에서 재정의 해서 사용하는 방식입니다.

- 부모 클래스의 생성자를 자식 클래스에서 선언하는 것(super()) 도 오버라이딩입니다.

- 오버라이딩의 충족 조건(1. 메소드 이름, 2. 메소드 매개 변수의 숫자와 데이터 타입&순서, 3. 메소드 리턴 타입)

 

오버로딩(Overloading)

- 메소드명은 같지만 리턴 타입이나 매개변수에 다르게 해서 여러가지 메소드를 선언 하는 방식입니다.

- 하나의 메소드 이름으로 여러 기능을 구현 할 수 있습니다.

- 매개 변수가 다르거나 리턴 타입이 달라야 합니다. 

- 하지만 리턴 타입이 달라도 매개 변수가 같으면 안됩니다.

 

오버라이딩과 오버로딩의 사용법

- 오버라이딩을 사용 할 때 하위 클래스의 메소드에 @Override어노테이션을 사용하여 명시적으로 사용 할 수 있습니다.

package java_study;

public class Polymorphism {
	public static void main(String[] args) {
		Child_poly cp = new Child_poly();
		cp.overridingHello();
		cp.overloadingMethod();
		cp.overloadingMethod("hey");
		cp.overloadingMethod("yolo", 100);
	}
}

class Parent_poly {
	public void overridingHello() {
		System.out.println("Hello from Parent");
	}
}

class Child_poly extends Parent_poly {
	// @Override
	public void overridingHello() {
		System.out.println("Hello from Child");
	}
	
	public void overloadingMethod() {
		System.out.println("overloading without paremter");
	}
	
	public void overloadingMethod(String str) {
		System.out.println("str : " + str);
	}
	
	public void overloadingMethod(String str, Integer i) {
		System.out.println("str : " + str + " / Integer : " + i);
	}
	
	public Integer overloadingMethod(Integer i) {
		return i;
	}
	
}

객체 지향 프로그래밍은 객체를 프로그램의 기본 단위로써 나누고 그 객체들이 상호 작용 하는 프로그램이라 배웁니다.

그렇다면 여기서 말하는 객체란 정확히 무엇일까요? 함께 학습이 필요한 클래스와 인스턴스도 같이 알아보겠습니다.

 

 

클래스(Class)

 - 객체가 정의된 '설계도'

 - 객체를 생성 하기 위해서 클래스가 꼭 필요함

 - 객체의 생성을 위한 용도이지 객체로써 직접 사용 할 수 없음

 

객체(Obejct)

 - 클래스를 이용해 만들어진 객체

 - 모든 인스턴스는 객체에 포함됨

 

인스턴스(Instance)

 - 인스턴스화는 클래스로부터 객체를 만드는 과정임. ex) Unit unit = new Unit():

 - 클래스를 사용해서 만들어진 객체를 '인스턴스 객체'라고 부름

 - 모든 인스턴스는 객체에 포함됨

 

 

아래 코드를 보면 이해를 좀 더 쉽게 할 수 있습니다.

우선 class Unit 에서 다양한 변수 및 메소드를 설정 할 수 있습니다. 이 과정을 설계도에 작업이라 생각 하시면 됩니다.

그리고 메인 클래스에서 Unit marine = new Unit()은 클래스를 인스턴스화 하는 부분입니다.

그 인스턴스를 포함하고 있는 부분은 ClassInstanceObject인 객체입니다.


// 큰 의미의 객체와 인스턴스
public class ClassInstanceObject {
	public static void main(String[] args) {
		// 클래스를 인스턴스화 하고 있는 부분
		Unit marine = new Unit();
		Unit medic = new Unit();
	}
}

// 클래스 (설계도)
class Unit {
	
}

OOP의 4대 특성중에는 상속(Inheritance)이 있습니다. 이는 코드의 재사용과 확장성을 용이하게 해줍니다.

 

상속의 특징

 - 상속 되는 클래스를 부모 클래스 및 Super 클래스라 하고, 그 반대는 자식 클래스 및 Sub 클래스라고 합니다.

 - 자식 클래스는 부모 클래스에 정의된 변수나 메소드를 사용 할 수 있습니다.

 - 부모 클래스의 변수나 메소드의 접근 제어자가 private이면 사용 할 수 없습니다. (protected는 자식에게만)

 - 하지만 부모 클래스는 자식 클래스의 변수나 메소드를 사용 할 수 없습니다.

 - 2개 이상의 클래스를 부모 클래스를 상속 받을 수 없습니다. 오직 하나만 상속 받을 수 있습니다.

 - 기본적으로 모든 클래스는 Object를 상속 받고 있습니다.(extends Object를 굳이 안 해줘도 됨)

 

 

상속의 사용법

 - 자식 클래스명 옆에 extends 키워드와 함께 부모 클래스명을 입력 하시면 됩니다.

main 메소드에서 Unit클래스를 상속받은 marine 인스턴스는 createdUnitMsg()와 createdBionicUnitMsg()를 사용 할 수 있습니다.

public class Inheritance {
	public static void main(String[] args) {
		Bionic marine = new Bionic();
		marine.createdUnitMsg();
		marine.createdBionicUnitMsg();
	}
}

class Bionic extends Unit {
	public void createdBionicUnitMsg() {
		System.out.println("created a bionic unit");
	}
}

class Unit {
	public void createdUnitMsg() {
		System.out.println("created an unit");
	}
}

+ Recent posts