MVC vs API, 에러들 - 조예지
MVC vs API
@Transactional,stream- - 최민준
@Transactional
public int insertLargeVolumeHospitalData2(String filename) {
List<Hospital> hospitalList;
try {
hospitalList = hospitalReadLineContext.readByLine(filename);
System.out.println("파싱이 끝났습니다.");
hospitalList.stream()
.parallel()
.forEach(hospital -> {
try {
this.hospitalDao.add(hospital); // db에 insert하는 구간
} catch (Exception e) {
System.out.printf("id:%d 레코드에 문제가 있습니다.\n", hospital.getId());
throw new RuntimeException(e);
}
});
} catch (IOException e) {
throw new RuntimeException(e);
}
if (!Optional.of(hospitalList).isEmpty()) {
return hospitalList.size();
} else {
return 0;
}
}
Java
복사
Transaction
정의
•
데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미
•
주로 Serivce 계층에 붙인다
성질
원자성
•
한 트랜잭션 내에서 실행한 작업들은 하나의 단위로 처리한다. 즉, 모두 성공 또는 모두 실패.
일관성
•
트랜잭션은 일관성 있는 데이타베이스 상태를 유지한다. (data integrity 만족 등.)
격리성
•
동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리해야한다.
영속성
•
트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다.
@Transactional
•
@Transactional은 클래스나 메서드에 붙여줄 경우, 해당 범위 내 메서드가 트랜잭션이 되도록 보장해준다.
선언적 트랜잭션이라고도 부른다
Stream
정의
•
다양한 데이터 소스(컬렉션, 배열 등)를 표준화된 방법으로 다루기 위한 것
특징
•
가독성이 좋다
•
병렬화가 가능하다
사용 방법
List<Integer> intList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
intList.add(i);
}
intList.stream() // 스트림 선언
.limit(3) // 중간 연산
.forEach(System.out::println); //최종연산
0
1
2
Java
복사
collection 자료형 뒤에 .stream()을 붙여준다
중간 연산
.distinct() //중복제거
.filter(Predicate<T> predicate) //조건에 안 맞는 요소는 제외
.limit(long maxSize) //maxSize 이후의 요소는 잘래냄
.skip(long n) //앞에서부터 n개 건너뛰기
.sorted() //기본 정렬로 정렬
.sorted(Comparator<T> comparator) //조건에 맞게 요소 정렬. 추가 정렬 기준을 제공할 때는 thenComparing()사용
//스트림의 요소를 변환. ex) map(File::getName), map(s->s.subString(3))
.map(Function<T> mapper)
//요소에 작업수행. 보통 중간 작업결과 확인으로 사용. peek(s->System.out.println(s))
.peek(Consumer<T> action)
.parallel() // 병렬처리를 가능하게 해준다
Java
복사
최종 연산
void forEach(Consumer<? super T> action) //각 요소에 지정된 작업 수행
void forEachOrdered(Consumer<? super T> action) //병렬 스트림의 경우 순서를 유지하며 수행
long count() //스트림의 요소 개수 반환
Java
복사
.parallel() 주의할 점
•
박싱을 주의 해야 한다
•
순서 연상에 주의 해야 한다
•
자료구조가 적절한지 확인해야 한다
•
병합 과정의 비용이 비싸다면, 병렬 스트림으로 얻은 이익이 상쇄된다
자료 구조에 따른 parallel() 성능
자료구조 | 분해 성능 |
ArrayList | 매우 좋음 |
LinkedList | 나쁨 |
IntStream.range | 매우 좋음 |
Stream.iterate | 나쁨 |
HashSet | 좋음 |
TreeSet | 좋음 |