들어가기전 아이템 80에서 나오는 '실행자 프레임워크'에 대해 아래의 포스팅으로 공부하자. https://devfunny.tistory.com/807?category=957918 [JAVA8 병렬프로그래밍] Executors 클래스, ExecutorService 인터페이스 Executors 클래스 - Executor 인터페이스 : 컨커런트 API의 핵심 인터페이스다. 이 인터페이스를 구현한 여러 종류의 클래스를 기본으로 제공한다. - 스레드 풀 : 스레드를 관리하기 위한 풀이다. 병렬 devfunny.tistory.com java.util.concurrent 패키지의 등장 java.util.concurrent 패키지는 실행자 프레임워크(Executor Framework)라고 하는 인터페이스 기반의 유연한..
들어가기전 https://devfunny.tistory.com/669?category=895441 [교재 EffectiveJava] 아이템 78. 공유 중인 가변 데이터는 동기화해 사용하라 synchronized 키워드 해당 메서드나 블록을 한번에 한 스레드씩 수행하도록 보장한다. 많은 프로그래머가 동기화를 배타적 실행, 즉 한 스레드가 변경하는 중이라서 상태가 일관되지 않은 순간의 devfunny.tistory.com 이번 아이템은 아이템 78의 반대 상황을 다룬다. 아이템 78에서 충분하지 못한 동기화의 피해를 다뤘다면, 이번 아이템에서는 과도한 동기화에 대한 문제점을 다룬다. 과도한 동기화 과도한 동기화는 성능을 떨어뜨리고, 교착상태에 빠뜨리고, 예측할 수 없는 동작을 일으킬 수 있다. 응답 불가와..
들어가기전 MongoDB Altas Free 버전을 셋팅하자. https://devfunny.tistory.com/850 [MongoDB] MongoDB Altas Free버전 Compass 사용하기 1) monggoDB 사이트 접속 https://account.mongodb.com/account/login?signedOut=true Cloud: MongoDB Cloud account.mongodb.com 2) 회원가입 후 로그인시, 접속되는 화면 3) create a database ■ [Build a Dat.. devfunny.tistory.com database 생성 _MONGOSH 에 명령어를 입력해보자. 1) database 'test' 생성 use test ▶ 아직까지는 새로고침을 해도 tes..
1) monggoDB 사이트 접속 https://account.mongodb.com/account/login?signedOut=true Cloud: MongoDB Cloud account.mongodb.com 2) 회원가입 후 로그인시, 접속되는 화면 3) create a database ■ [Build a Database] ■ [Create] ■ [Create Cluster] 3) 이동된 화면에서 유저 생성 ■ How would you like to authenticate your connection? ■ Where would you like to connect from? [Add My Current IP Address] 를 누르면 현재 자신의 IP를 자동으로 등록해준다. ■ [Finish and Cl..
실전! Querydsl 강의 정리 3편 들어가기전 Spribgboot + Querydsl 설정 https://devfunny.tistory.com/844 [Querydsl 1편] SpringBoot2.7 + Querydsl5.0 설정하기 (Entity, Dto class to QClass) 실전! Querydsl 강의 정리 2편 Querydsl 설정 build.gradle ▶ querydsl 의존성 추가 //querydsl 추가 implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" // querydsl 라이브러리 annotationProcess.. devfunny.tistory.com 예제 Entity 설정하기 https://devfunny.tis..
목표 Customer 테이블에 등록된 테스트 데이터 중 firstname 컬럼이 "A"로 시작하는 데이터를 찾아, 해당 데이터를 json 포맷으로 customer.json 파일을 생성해보자. Job 생성 JsonConfiguration.java package com.project.springbatch._58_writer_json; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; impo..
실전! Querydsl 강의 정리 2편 DTO 클래스 생성 MemberDto.java package study.querydsl.dto; import com.querydsl.core.annotations.QueryProjection; import lombok.Data; import lombok.Getter; import lombok.Setter; import lombok.ToString; @Getter @Setter @ToString public class MemberDto { private String username; private int age; public MemberDto() { } } MemberTeamDto.java package study.querydsl.dto; import com.quer..
실전! Querydsl 강의 정리 2편 Querydsl 설정 build.gradle ▶ querydsl 의존성 추가 //querydsl 추가 implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" // querydsl 라이브러리 annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}" // Querydsl 관련 코드 생성 기능 제공 ▶ 전체코드 buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-managem..
Job 생성 아래와 같은 Job을 만들자. Processor 체이닝 리스트 기대 결과 CustomItemProcessor1 [item1, item2, item3, item4, item5, item6, item7, item8, item9, item10] CustomItemProcessor2 [item11, item22, item33, item44, item55, item66, item77, item88, item99, item1010] Job 수행 CompositionItemConfiguration.java package com.project.springbatch._66_processor_delegate; import lombok.RequiredArgsConstructor; import org.spring..
ThreadLocal ThreadLocal 클래스에는 get, set 메서드가 있는데 이를 호출하는 스레드마다 다른 값을 사용할 수 있도록 관리해준다. ThreadLocal 클래스의 get 메서드를 호출하면 현재 실행중인 스레드에서 최근에 set 메서드를 호출해 저장했던 값을 가져올 수 있다. 스레드 로컬 변수는 변경 가능한 싱글턴이나 전역 변수 등을 기반으로 설계되어있는 구조에서 변수가 임의로 공유되는 상황을 막기위해 사용하는 경우가 많다. 쉽게말해서, ThreadLocal이란 스레드 단위로 로컬 변수를 제공하는 클래스다. ThreadLocal 동작방식 ThreadLocalMap 스레드가 코드를 실행하면서 만나게되는 모든 ThreadLocal 변수를 threadLocals 객체에 저장한다. Thread..
volatile 변수 volatile로 선언된 변수의 값을 바꿨을때 다른 스레드에서 항상 최신 값을 읽어갈 수 있도록 해준다. ▶ 변수의 값을 읽을때 CPU cache에 저장된 값이 아닌 Main 메모리에서 읽는다. 기존에는 CPU Cache에만 반영되고, 실제 Main Memory에는 반영되지 않는다. Volatile은 Main Memory에 즉시 저장한다. 특정 변수를 선언할때 volatile 키워드를 지정하면, 컴파일러와 런타임 모두 '이 변수는 공유해 사용하고, 따라서 실행 순서를 재배치 해서는 안된다.' 라고 이해한다. volatile 변수는 프로세서의 레지스터에 캐시되지도 않고, 프로세서 외부의 캐시에도 들어가지 않기 때문에 항상 다른 스레드가 보관해둔 최신의 값을 읽어갈 수 있다. ▶ 그러므..
스레드 프로세스는 두가지 특정 자원, 제어로 구분할 수 있는데 '제어'만 분리한 실행 단위를 '스레드'라고 한다. 프로세스 하나는 스레드 한 개 이상으로 나눌 수 있다. 스레드들은 프로세스의 직접 실행 정보를 제외한 나머지 프로세스 관리 정보를 공유한다. 스레드의 구조 스레드는 별도의 스택이 필요하고, 프로그램 카운터가 독립적이라서 같은 프로세스의 여러 스레드들이 동시에 코드의 동일한 부분이나 다른 부분을 실행할 수 있다. 스레드는 관련 자원과 함께 메모리를 공유할 수 있는데, 이 때문에 손상된 데이터나 스레드의 이상 동작을 고려해야한다. 응용 프로그램은 적어도 하나의 프로세스가 있고, 프로세스에는 스레드가 1개 이상 있다. 같은 프로세스의 스레드들은 동일한 주소 공간을 공유한다. (위 사진에서 스택을 ..
프로세스 일반적인 프로세스의 정의는 '실행중인 프로그램'이다. 프로그램이 실행중이라는 의미는 디스크에 있던 프로그램을 메모리에 적재하여 운영체제의 제어를 받는 상태가 되었다는 것이다. 디스크 -> 메모리 (자신만의 메모리 영역(주소공간)이 있다는 의미) ▶ 프로그램이란 프로그램은 컴파일한 코드와 초기화 전역변수, 문자열과 문자열 상수 등 정적 데이터를 포함하는 정적인 개체다. 프로세스는 스택, 힙, 데이터, 코드 메모리 구조를 이루고, 프로그램 카운터나 레지스터처럼 현재 어떤 자원을 사용하는지 관련 정보가 들어있는 동적인 개체다. 프로세스 정의 정의 사용자 관점에서 프로세스 주소 공간을 가지고 실행하는 프로그램 시스템 관점에서 프로세스 실행중인 프로그램 프로세스는 프로그램 실행의 인스턴스도 된다. 예를들..
문제 https://www.acmicpc.net/problem/7568 7568번: 덩치 우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩 www.acmicpc.net 풀이코드 package com.algorithm._01_그리디_구현; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * @Date 2022/07/31 * @URL https://www.acmicpc.net/problem/7568 */ /* 몸무게 x, 키 y -> (x, y) 사람 ..
예제 파일 생성 JobController.java @RestController @RequiredArgsConstructor public class JobController { private final JobRegistry jobRegistry; private final JobOperator jobOperator; private final JobExplorer jobExplorer; } Customer.java package com.project.springbatch._77_operation; import lombok.AllArgsConstructor; import lombok.Data; import java.util.Date; @Data @AllArgsConstructor public class Cust..