수신 객체 지정 람다 수신 객체를 명시하지 않고 람다의 본문 안에서 다른 객체의 메서드를 호출할 수 있게 한다. with 라이브러리 함수 with를 사용하여 어떤 객체의 이름을 반복하지 않고도 그 객체에 대해 다양한 연산을 수행할 수 있다. with 사용 전 /** 매번 result 반복 사용 */ fun alphabet1() : String { val result = StringBuilder() for (letter in 'A'..'Z') { result.append(letter) } result.append("\nNow I know the alphabet!") return result.toString() } fun main() { println(alphabet1()) } with 사용 후 fun al..
코틀린 람다 전달 함수형 인터페이스를 인자로 원하는 자바 메서드에 코틀린 람다를 전달할 수 있다. 자바 void postponeComputation(int delay, Runnable computation); 코틀린에서 람다를 위 함수에 넘겨보자. postponeComputation(1000) { println(42) } 컴파일러는 자동으로 람다를 Runnable 인스턴스(Runnable을 구현한 무명 클래스의 인스턴스)로 변환해준다. 무명 클래스에 있는 유일한 추상 메서드를 구현할 때 람다 본문을 메서드 본문으로 사용한다. Runnable은 run()이 그런 추상 메서드다. Runnable을 구현하는 무명 객체를 명시적으로 만들어서 사용할 수도 있다. 객체 식을 함수형 인터페이스 구현으로 넘긴다. po..
1번째 Job 생성 ChunkConfiguration.java import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.sprin..
JPA 연관관계 키워드 키워드 설명 방향 (Direction) - 단방향, 양방향이 있다. - 단방향 관계 : 회원과 팀의 관계가 있을때 회원 -> 팀 또는 팀 -> 회원 중 한쪽만 참조하는 것 - 양방향 관계 : 회원 -> 팀, 팀 -> 회원 양쪽 모두 서로 참조하는 것 - 방향은 객체 관계에서만 존재하고 테이블 관계는 항상 양방향이다. 다중성 (Multiplicity) - 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M) 이 있다. 연관관계의 주인 (owner) - 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야한다. 단방향 연관관계 객체 연관관계 회원 객체는 Member.team 필드(멤버변수)로 팀 객체와 연관관계를 맺는다. 회원 객체와 팀 객체는 단방향 관계다. 회원..
@Entity 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야한다. 기본 생성자는 필수다. (public 또는 protected) final 클래스, enum, interface, inner 클래스에는 사용할 수 없다. 저장할 필드에 final을 사용하면 안된다. JPA가 엔티티 객체를 생성할때 기본 생성자를 사용하므로 이 생성자는 반드시 있어야한다. @Table 엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다. 다양한 매핑 사용 Member.java import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.util.Date; @Entity @Table..
엔티티 매니저 데이터베이스를 하나만 사용하는 애플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성한다. EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook"); 위 코드를 호출하면 META-INF/persistence.xml에 있는 정보를 바탕으로 EntityManagerFactory를 생성한다. ... 이제부터 필요할 때마다 엔티티 매니저 팩토리에서 엔티티 매니저를 생성하면 된다. EntityManager em = emf.createEntityManager(); 엔티티 매니저 팩토리는 엔티티 매니저를 만드는 공장으로 이해하면 된다. 공장을 만드는 비용은 상당히 크므로, EntityManagerFac..
ORM ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스를 매핑한다. ORM 프레임워크는 객체와 테이블을 매핑한다. ORM 프레임워크 사용 장점 1) 객체를 데이터베이스에 저장할때 INSERT SQL을 직접 장성하지 않고 객체를 자바 컬렉션에 저장하듯이 ORM 프레임워크에 저장한다. 2) 개발자가 데이터 중심인 관계형 데이터베이스를 사용하더라도 객체지향 어플리케이션 개발에 집중할 수 있다. 하이버네이트 대부분의 패러다임 불일치 문제를 해결해주는 ORM 프레임워크다. 하이버네이트(hibernate.org)라는 오픈소스 ORM 프레임워크가 등장하면서 하이버네이트를 기반으로 새로운 자바 ORM 기술 표준이 만들어졌는데, 이것이 바로 JPA다. 패러다임 불일치란? 추상화, 상속..
예제 Counter.java package org.example.atomic; public class Counter { private int c = 0; public void increment() { c++; } public void decrement() { c--; } public int value() { return c; } } 위 예제는 멀티 스레드에서 접근하는 요청에 대한 정합성 확보가 어렵다는 문제점이 있다. 이를 해결하기 위해 각 메서드에 synchronized 키워드를 붙여 객체에 록을 걸어보자. SynchronizedCounter.java package org.example.atomic; public class SynchronizedCounter { private int c = 0; pub..
분할 반복 Spliterator 자바 8에서 Split과 Iterator의 합성어로 Spliterator 인터페이스를 제공한다. Iterator 예제 HelloPerson.java package org.example.Spliterator; import java.util.ArrayList; import java.util.List; public class HelloPerson { private String firstName; private String lastName; private String country; public HelloPerson(String firstName, String lastName, String country) { this.firstName = firstName; this.lastNa..
스트림의 병렬 처리 스트림 API에서는 parallelStream 메서드를 이용해서 스트림 객체를 생성하는 것만으로도 병렬 처리가 된다. 손쉽게 대량의 데이터를 병렬 처리하는 코드를 작성할 수 있다. ParallelReduceMinMax.java package org.example.streamparallel; import java.util.Arrays; import java.util.List; public class ParallelReduceMinMax { public static void main(String[] args) { List intList = Arrays.asList(4, 2, 8, 1, 9, 6, 7, 3, 5); // 최대 값 구하기 - 병렬 int max = intList.paralle..
Future 포크/조인 프레임워크에서 살펴본 RecursiveTask와 RecursiveAction의 명세서를 살펴보면 두 클래스 모두 Future 인터페이스를 구현한 추상 클래스이며 Future 인터페이스는 자바 5에서 공개한 컨커런트 API에 포함되어있다. Future 인터페이스는 비동기 연산의 결과를 표현한다. 해당 인터페이스에서 제공하는 메서드 목록을 보면 연산 작업이 완료되었는지 확인하고, 완료될 때까지 대기하고, 모든 연산이 완료된 후의 결과를 조회하는 기능을 제공한다. 제공 메서드 메서드 설명 cancel() 현재 task의 중단을 시도한다. isDone(), isCancelled() 비동기 연산이 종료 혹은 취소되었는지 확인한다. get() 결괏값을 응답받을 때까지 대기한다. 예제코드 Fu..
포크/조인 프레임워크 컨커런트 API를 최종적으로 완성한 것은 자바 7에서 제공한 포크/조인 프레임워크다. 포크/조인 프레임워크는 java.util.concurrent 패키지의 핵심인 ExecutorService 인터페이스를 구현한 클래스다. 새로운 기능이 아니라, 인터페이스의 구현체가 추가된 것으로 이해하면 된다. 이 프레임워크의 주된 목적은 멀티 프로세서 혹은 멀티 코어를 가지고 있는 하드웨어 자원을 최대한 효율적으로 활용해서 병렬 처리가 가능하도록 하는 것이다. - 포크 (Fork) : 다른 프로세스 혹은 스레드(태스크)를 여러 개로 쪼개서 새롭게 생성한다는 의미이다. - 조인 (Join) : 포크해서 실행한 프로세스 혹은 스레드(태스크)의 결과를 취합한다는 의미이다. 어떤 할일이 있을때 그 일을 ..