/////
Search

221102

작성자
조예지
최민준
날짜
2022/11/02
학습 내용
MVC, API, 에러 , Transactional
텍스트

MVC vs API, 에러들 - 조예지

MVC vs API

 Optional.of(Obj) : obj에 null을 넣으려고 하면 NullPointerException이 발생한다.
 에러 : 메이븐을 빌드하게되면 테스트코드가 서버 상에서는 통과하지 못해서 빌드를 실패한다.
 docker run 관련 에러
 Spring이 뜨기는 했으나 url attribute 이상이 생겼다.
 같은 에러가 계속 나고 비슷한 이미지가 2개가 되었다. (image 삭제하기)
 왜인지 모르게 url 관련 오류는 안나고 spring이 구동은 되는데 link failure가 발생하였다.

@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
좋음