[Spring] Spring Batch를 사용한 대량 데이터 저장 (2)
·
Spring
이제 Spring Batch를 내가 개발중인 프로젝트에 구현해봅시다.  구현하기 전에 필요한 건 프로젝트에 의존성을 설정하는 것과, 배치 관련 메타 테이블을 생성하는 것이다.   설정 build.gradleimplementation 'org.springframework.boot:spring-boot-starter-batch' build.gradle에 Spring Batch의 의존성을 추가한다.   메타 테이블 생성 메타 테이블을 생성하는 방법은 자동 생성, 수동 생성 두 가지 있다. 자동 생성spring: batch: jdbc: initialize-schema: always 메타 테이블 스키마를 자동으로 생성하는 설정 코드이다.  수동 생성-- Autogenerated: do not ed..
[Spring] Spring Batch를 사용한 대량 데이터 저장 (1)
·
Spring
개요이전까지 과부하 테스트를 위해 많은 양의 데이터가 필요할 때, 일일이 데이터를 INSERT 해주거나, 반복문, JMeter의 Loop를 사용해 데이터를 추가했다.  위의 이미지는 100,000개의 게시글 데이터를 JMeter의 Loop문을 사용해 테스트한 결과이다.  약 6분의 시간이 소요되었다. 생각보다 많은 시간이 소요되었다..  그래서 이 6분이라는 시간을 단축시킬 수 있는 방법이 있는지 찾아보다가 Spring Batch 라는 기술을 찾게되었다.  Spring 프레임워크에서 Spring Batch를 사용해 대용량 데이터를 처리하는 래퍼런스가 많은 것을 확인하고, 이번 기회에 Spring Batch를 사용해 데이터를 추가해보기로 했다.   Spring Batch란 Spring Batch란 대용량 ..
[Spring] Controller 테스트 코드 (Feat : Spring Security)
·
Spring
계층 별로 테스트를 진행할 때, Repository나 Service는 @DataJpaTest나 @SpringBootTest 어노테이션의 경우엔 실제 Bean 객체를 사용하는 것이기 때문에 별 문제없이 테스트를 진행할 수 있다.  하지만 Controller는 조금 다르다. Controller는 사용자의 요청을 전달받는 계층이기 때문에 말 그대로, 데이터를 잘 받을 수 있는지를 테스트하는 영역이다.  그렇다면 다른 계층과 Controller의 테스트 방식이 어떻게 다른지, 어떤 기술을 사용하는지 한번 알아보자.  @WebMvcTest @WebMvcTest는 Controller를 테스트할 때 가장 많이 사용하는 어노테이션이다.  아래는 Spring Framework 공식 홈페이지에 나와있는 @WebMvcTes..
[Java] 리플렉션
·
백엔드/Java
리플렉션 자바에서 리플렉션이란 런타임 시점에 동적으로 특정 클래스의 필드, 메서드, 생성자에 접근해 사용하는 자바 API이다.  가져오는 클래스의 정보는 모두 접근 제어자에 관계 없이 가져온다.  그리고 자바는 정적 언어이기 때문에 컴파일 시점에 객체 타입을 결정하지만, 자바 리플렉션 API를 사용한다면 런타임 시점에 타입을 동적으로 결정할 수 있다.  리플렉션 예제 코드public class Member { // 필드의 접근 제어자가 모두 다름 private String name; private int age; private String address; public String phone; // 기본 생성자는 필수 public Member() {} // 메서드..
[Java] 멀티스레딩 - 가상 스레드
·
백엔드/Java
가상 스레드를 이해하기 위해선 일단 JVM 스레드와 OS 스레드를 구분할 수 있어야 한다. JVM 스레드 (플랫폼 스레드), OS 스레드  두 스레드의 흐름은 다음과 같다.JVM에 있는 스레드가 start() 되면 새로운 OS 스레드를 만들어달라고 OS에 요청한다.새로운 OS 스레드가 생성될 때, JVM은 OS에게 요청하여 이 스레드에 필요한 스택 공간을 할당받는다.이 OS 스레드가 CPU에 접근하여 JVM Thread가 하고자하는 작업을 수행한다. 결국 OS는 스택 할당 및 CPU 스케줄링의 과정을 도맡아 하기 때문에, JVM 스레드의 실행에 대해 책임이 있다. JVM 스레드는 OS 스레드로 매핑된 후 CPU에서 실행되며, 이 과정에서 OS의 스케줄링 알고리즘에 따라 실행 순서가 결정되기 때문이다.  ..
[Java] 멀티스레딩 - 스레드 간 통신
·
백엔드/Java
세마포어  이전에 나온 synchronized 키워드나 락을 사용한 이유는 임계영역에 여러 스레드가 접근하는 것을 막고, 오직 하나의 스레드만 접근 가능하게하기 위해서였다. 세마포어도 이러한 이유 때문에 사용하는 기술이다. 하지만 여기서 더 나아가 세마포어는 오직 하나의 스레드만 허용하게 만들 수 있고, 더 늘릴 수도 있다. 즉, 임계영역에 접근하는 스레드의 수를 조절할 수 있는 것이다.  세마포어의 로직을 이해하기 가장 좋은 예시는 주차장이다. 주차장에 자리가 6자리 있는데, 모든 자리에 차가 주차되어있는 경우, 새롭게 들어온 차는 대기해야 한다.만약 한자리가 빠지는 경우, 주차 가능한 공간이 한 자리 늘어나고, 대기하고 있던 차량 중, 가장 먼저온 차량이 비어있는 자리에 주차한다.그 뒤에 온 차량은 ..