Study 47

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

프로세스 동기화

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

Study/OS 2022.04.17

데코레이터 패턴, 프록시패턴 그리고 다이나믹 프록시

AOP는 IoC/DI , 서비스 추상화와 함께 스프링의 3대 기반 기술 중 하나이다. 스프링이 DI를 사용하는 이유가 무엇이었나 한번 생각을 해보자. 만약 Client쪽에서 어떠한 클래스를 직접 참조하게 되면 그 클래스의 비즈니스 로직을 수정이 수정되면 client쪽 서비스가 정상 작동하지 않을 수 있다. 그렇기 때문이 이 두 오브젝트의 결합도를 낮추기 위해 인터페이스를 사용하여 의존관계를 주입해주고, 오브젝트간의 결합도를 낮춘다고 했다. AOP에서도 이러한 DI가 중요하게 사용되는데, 기존에 Client가 UserService라는 객체를 직접 참조했다고 가정해보자. 이는 강한 결합도를 띄고 있는 상태이므로 Client

Study/Spring 2022.04.13

REST, REST API, RESTful 과 HATEOAS

더이상 미룰 수 없다. 너의 결혼, 나의 Rest API와 Hateoas 정리 ㅋ_ㅋ Rest, Restful 참 많이도 들어봤다. 도대체 Rest API는 무엇인가? 결론적으로 얘기하면 REST는 아키텍쳐이고, REST API는 REST를 기반으로 서비스 API를 구현 한 것이다. REST Rest란? 먼저 REST는, 자원 기반의 구조(ROA, Resource Oriented Architecture)설계에서 그 중심에 Resource가 있고 이 Resource 를 처리 하기 위해서 HTTP Method를 활용하는 아키텍쳐이다. REST에서 가장 중요한 것은 Resource이다. 이렇게 중요한 자원을 REST에서는 서버와 클라이언트간에 어떻게 주고 받느냔 말이다? 그 답은 바로 REST 안에 있다. R..

Study/Web 2022.04.12

자바 기본서를 다시 읽다. 9 - 스트림의 최종처리 메소드

스트림의 최종 처리 메소드에 대해서 알아보자. 매칭(allMatch(), anyMatch(), noneMatch()) 매칭 메소드는 최종처리시 요소들이 특정 조건에 만족하는지 Predicate 를 사용하여 조사한다. 어려울것이 없다. public static void main (String[] args){ int[] intArr = new int[]{1,3, 5}; boolean isAllEvenNum = Arrays.stream(intArr).allMatch(a->a%2==0); boolean isThereEvenNum = Arrays.stream(intArr).anyMatch(a->a%2==0); boolean isAllOddNum = Arrays.stream(intArr).noneMatch(a->a..

Study/Java 2022.04.06

자바 기본서를 다시 읽다. 8 - 스트림의 중간처리 메소드

스트림은 기본적으로 중간처리 메소드와 최종처리 메소드로 이루어진 파이프라인으로 활용할 수 있다고 이전에 알아보았다. 그렇다면 중간처리와 최종 처리시 각각 활용할 수 있는 메소드들에 어떤 것들이 있는지 알아보자. 스트림의 중간처리 메소드 distinct(), filtering() 첫번째로, 중복 데이터를 걸러내는 distinct(), 특정 기준으로 데이터를 걸러주는 filtering()에 대해 알아보자. List list = Arrays.asList("윤가영","김나영","윤다영","김라영","윤마영","윤가영"); list.stream() .distinct() // 중복제거 .filter(n-> n.contains("윤")) // 조건 .forEach(s-> System.out.println("name ..

Study/Java 2022.04.06

자바 기본서를 다시 읽다. 7 - 스트림의 개념과 파이프라인

스트림의 개념과 특징 스트림(Stream)이란, 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자를 말한다. // Iterator 와 Stream(람다식 사용)의 비교 public class IterationStreamExample { public static void main (String[] args){ List strings = Arrays.asList("홍길동","신용권","김자바"); Iterator iterator = strings.iterator(); while(iterator.hasNext()){ String name = iterator.next(); System.out.println("name is : " + name); } Stream stream = st..

Study/Java 2022.04.05

자바 기본서를 다시 읽다. 6 - 메소드 참조

메소드 참조 메소드 참조란, 메소드를 참조하여 매개변수의 정보 및 리턴 타입을 알아내어 람다식에서 불필요한 매개변수를 제거하는 것이다. 예를들어 아래와 같은 코드가 있을 때, 람다식은 단순히 두개의 값을 Math.max() 메소드의 매개값으로 전달하는 역할만 한다. ( o1 , o2 ) -> Math.max(o1, o2); 이는 메소드 참조를 통해 아래와 같이 간결하게 변환할 수 있다. IntBinaryOperator operator = Math :: max; 정적 메소드와 인스턴스 메소드 참조 정적메소드와 인스턴스 메소드를 참조하는 방식은 다음과 같다. 정적 메소드 - 클래스::메소드 인스턴스 메소드 - 참조변수::메소드 import java.util.function.IntBinaryOperator; ..

Study/Java 2022.03.29