분류 전체보기 59

Spring Batch에서 병렬 처리하기

다중 스레드 스텝 스프링 배치에서 step은 기본적으로 단일 스레드로 처리된다. 다중 스레드 스텝은 잡의 실행을 병렬화하기 가장 쉬운 방법이다. 잡 안의 step 내에서 청크 단위로 다중 스레드 작업을 하는 방식이다. 스프링 배치의 다중 스레드 스텝 개념을 적용하면, 스탭 내의 각각의 청크들이 자체 스레드에서 실행되게 할 수 있다. org.springframework.core.task.TaskExecutor 추상화를 사용하면 된다. 각 청크를 독립적으로 처리하면서 하나의 스레드 풀 내에서 처리되게 구성하고, 청크가 처리될 때 에러가 발생하면 롤백되거나 종료된다. @Bean public Step step1(){ return this.stepBuilderFactory().get("step1") .chunk(..

Study/Spring 2022.06.20

MyBatis vs JPA

프로그램 개발 시 데이터를 영구적으로 저장하기 위해 파일시스템, 관계형 데이터베이스등을 사용하여 우리는 영속성을 부여한다. 그렇지 않으면 데이터는 메모리에만 남아 프로그램이 종료되면 모두 사라지기 때문이다. 그리고 시스템 설계 구조에서 이러한 영속성을 관리해주는 부분을 persistance layer라고 부른다. 여기서 jdbc를 직접 구현할 수 있지만, 그렇게 하지 않고 보통 자바에서 제공하는 jdbc api를 사용하여 구현한다. ( jdbc : java에서 제공하는 api. persistance framework 내부에서는 다 사용) 이 persistance framework에는 대표적으로 SQLMapper와 ORM이 있다. SQLMapper : sql을 개발자가 직접 명시, api에는 필드만 map..

Study/Java 2022.06.20

Servlet programming 처리 과정

servlet 처리 과정 (1) client 요청 (2) dispatcher servlet 에서 해당 요청 처리 (3) client request에 대한 Handler mapping (3.1) Request Mapping : RequestMappingHandlerAdpator가 수행 (3.2) Interceptor 처리 (3.3) Argument Resolver 처리 : 실제 데이터를 Controller에 넘겨주는 인터페이스 (3.4) message Converter 처리 filter vs interceptor vs AOP - filter, interceptor : 서블릿 단위로 처리 vs AOP : 메소드 앞에서 Proxy 형태로 처리 - filter, interceptor : 주소로 처리 대상 지정 ..

Study/Spring 2022.06.20

아이템6. 불필요한 객체 생성을 피하라.

만약 내가 새로 인스턴스를 습관적으로 새로 생성하려고 하는 상황이 있다고 생각해보자. 그럼 바로 new 생성자를 통해서 인스턴스를 생성할 것이 아니라, 내가 만드려고 하는 대상이 불변 클래스인지 아닌지 생각해보고, 그 클래스의 정적 팩터리 메서드를 사용할 수 있는지 생각해보자. 정적 팩터리 메소드를 사용하면 불필요한 객체 생성을 피할 수 있기 때문이다. Boolean을 생성자로 생성하는 것보다 Boolean.valueOf(String)이라는 팩토리 메소드를 사용하는 것이 좋다는 얘기다. 만약 생성비용이 비싼 객체라면 어떨까? 불필요한 생성을 줄임으로써 성능을 상당히 개선할 수 있을 것이다. 이런 비싼 객체가 반복해서 필요하다면 '캐싱'을 통한 재사용이 아주 유용할 수 있다. static boolean i..

아이템9 . try-finally 보다는 try-with-resource를 사용하라

자바 라이브러리에서는 자원 사용 후 close()로 닫아줘야 하는것들이 있다. 예를들면 InputStream, OutputStream, java.sql.connection 과 같은. 전통적으로 이러한 자원들은 try-finally를 통해 자원을 닫아주었는데, 이 구문은 만약 기계의 물리적인 결함으로 인해 readline()이 실패할 경우 try에서 readLine()에 대한 실패가, finally에서 close()에 대한 실패가 발생한다. 이러한 경우는 시스템상에 close에 대한 예외처리만 잡기 때문에 물리적 결함에 대한 오류 파악이 매우 어렵다는 단점이 있다. 따라서 자바 7에서부터 제공하는 try-with-resource 구문을 사용하여 자원을 처리하는 것이 좋다. 이 구조를 사용하려면 자원이 Au..

아이템 7. 다 쓴 객체 참조를 해제하라

스택을 구현한 아래의 코드를 살펴보자. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size == 0) throw new EmptyStackException(); return elements[--size]; } /** * 원소를 위한 공..

아이템3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

싱글턴은 만드는 방식은 보통 둘 중 하나이다. 두 방식 모두 생성자는 private으로 감춰두고, 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 마련해둔다. 첫번째 방식은, public static final필드 방식이다. public class Elvis { public static final Elvis INSTANCE = new Elvis(5); public int age; private Elvis(int age) { this.age = age; } } public class Main { public static void main (String[] args){ Elvis elvis = Elvis.INSTANCE; //외부 클래스에서 접근 방식 System.out.println(e..

아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라

자바에서 생성자를 구현하는 방법은 여러가지가 있지만, 점층적 생성자 패턴과 자바빈즈 패턴, 그리고 빌드패턴에 대해 알아보자. 결론은 물론 정해져있다. 생성자에 매개변수가 많다면 빌더 패턴을 고려해야 한다. 점층적 생성자 패턴(telescoping constructor pattern) 아래와 같이 자바의 오버로딩 성격을 활용해서 클래스를 생성하는 점층적 생성자 패턴은 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기가 어렵다. public NutritionFacts(int servingSize, int servings) { this(servingSize, servings, 0); } public NutritionFacts(int servingSize, int servings, int calorie..

아이템1. 생성자 대신 정적 팩터리 메서드를 고려하라

아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라 이전에 람다식을 공부하면서, 인스턴스를 생성하지 않고 직접 클래스의 정적 메소드를 참조하는 방법에 대해 알아보았다. https://gocandoit.tistory.com/51 자바 기본서를 다시 읽다. 6 - 메소드 참조 메소드 참조 메소드 참조란, 메소드를 참조하여 매개변수의 정보 및 리턴 타입을 알아내어 람다식에서 불필요한 매개변수를 제거하는 것이다. 예를들어 아래와 같은 코드가 있을 때, 람다식은 gocandoit.tistory.com 그리고 여기서 말하는 정적 팩토리 메소드(static factory method)란 정적 메소드중, 리턴값이 그 클래스의 인스턴스값인 메소드를 말한다. 예를들어 자바의 Boolean 클래스는 리턴값이 Boolea..

프로세스 동기화

자 여기 counter 변수를 1 증가시켜야 하는 생산자 프로세스와, counter 변수를 1 감소시켜야 하는 소비자 프로세스가 있다고 해보자. 만약 이 두 프로세스가 counter변수에 동시에 접근하여 조작을 한다면 의도했던 실행결과가 보장되지 않는다. 실행 결과가 자원에 접근이 발생한 특정 순서에 의존하기 때문이다. 이러한 상황을 경쟁상황(race condition)이라고 한다. 따라서 일관적인 실행결과를 보장하기 위해서는 변수에 대해 하나의 프로세스만 접근할 수 있도록, 프로세스를 동기화할 필요가 있다. 임계영역 문제 프로세스들이 임계영역을 포함하고 있는 코드로 작성되어있는 시스템을 생각해보자. 프로세스는 아래와 같은 구조를 가지고 있을 것이다. do{ 진입 영역 // 임계 영역으로 들어가기 위한 ..

Study/OS 2022.04.17