분류 전체보기 191

Map Parallel (Map 병렬처리) 방법

Map은 Thread Safe 하지 않기 때문에 병렬처리가 되지 않는다. 이를 해결하기 위해 Map.entrySet을 호출하여 처리한다. 병렬 Stream으로 선언했으나 forEach 구문 내에서는 단일 쓰레드로 처리된다. (Map 때문) historyList.parallelStream() .collect(Collectors.groupingBy(History::getBbsId)) // 조회환 history 데이터를 bbsId 별로 그룹핑 .forEach((key, value) -> { // Article 테이블 데이터 inQuery 조회 // ArticleId만 추출 List articleIdList = value.stream().map(History::getArticleId).collect(Collec..

JAVA/Java Stream 2021.03.30

단위 테스트 작성 규칙

단위 테스트 작성시 지켜야할 3가지 규칙 규칙1. 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 규칙2. 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 규칙3. 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 세 가지 규칙을 지키면, 개발과 테스트가 대략 30초 주기로 묶인다. 테스트 코드와 실제 코드가 함께 나올뿐더러 테스트 코드가 실제 코드보다 불과 몇 초 전에 나온다. 이렇게 일하면 매일 수십 개, 매달 수백 개, 매년 수천 개에 달하는 테스트 케이스가 나온다. 실제 코드를 사실상 전부 테스트하는 테스트 케이스가 나온다. 하지만 실제 코드와 맞먹을 정도로 방대한 테스트 코드는 심각한 관리 문제를 유발하기도 한다. 단위 테스트 코드 품..

MapStruct 설정 (ModelMapper 대안)

ModelMapper가 많이 사용하고 사용하기 편하나 성능 이슈가 있고, 아래 URL을 통해 확인할 수 있다. Performance of Java Mapping Frameworks | Baeldung MapStruct comes out on top, followed by JMapper as a close second. The other libraries follow far behind: Orika, ModelMapper, and Dozer. www.baeldung.com 따라서, 성능 이슈에 대응하기 위해 ModelMapper 대신 MapStruct를 대신 사용한다. MapStruct 설정 build.gradle 파일에 아래 의존성 추가 implementation 'org.mapstruct:mapstru..

DB 함수 호출

DB 함수 호출을 위해서는 방언(Dialect) 설정이 필요하며, 각 DB 마다 제공하는 함수명, 동작이 다르기 때문에 방언 사용시 서비스별 DB에 맞춰 수정이 필요하다. 방언 Class 지정 (Application.yml) 방언 Class에 선언된 사용 가능한 함수 확인 방언 class에 등록된 함수 외에 함수를 사용하기 위해선 CustomDialect를 구현하면 된다. 참고 https://055055.tistory.com/83 JPA Dialect 김영한님의 강의 내용 정리, oracle dialect 상속 및 사용자 함수 추가 Dialect? 표준 SQL인 ANSI SQL외에, DBMS인 Oracle, MySQL, MS-SQL, PostgreSQL마다 문법과 함수가 조금씩 다른 경우가 있다. 이러한..

JPA/queryDsl 2021.03.22

1장 - 용어 정리

자바가 지원하는 타입(Type) : 자료형 참조 타입 (reference type) : 객체 interface : 인터페이스 class : 클래스 array : 배열 primitive : 기본타입 annotation : 인터페이스의 일종 enum : 열거 타입, 클래스의 일종 클래스의 멤버 field method member class member interface 메서드 시그니처 메서드 이름과 입력 매개변수(parameter)의 타입으로 이뤄지며, 반환값의 타입은 시그니처에 포함되지 않는다. implement : 클래스가 인터페이스를 구현한다 extend : 클래스(인터페이스)가 다른 클래스(인터페이스)를 확장한다. 공개 API (exported API) : API(Application Programm..

2장 아이템1 - 생성자 대신 정적 팩터리 메서드를 고려하라

핵심 정리 정적 팩터리 메서드와 public생성자는 각자의 쓰임새가 있으니 상대적인 장단점을 이 해하고 사용하는 것이 좋다. 그렇다고 하더라도 정적 팩터리를 사용하는 게 유리한 경우 가 더 많으므로 무작정 publk 생성자를 제공하던 습관이 있다면 고치자 정적 팩터리 메서드 예제 public static Boolean valueOf(boolean b){ return b ? Boolean.TRUE : Boolean.FALSE; } 장점 고유한 이름을 가질수 있다. 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. 호출될 때마다 새로운 인스턴스를 생성하지 않아도 된다. 불필요한 객체 생성을 피할 수 있다. 이 덕분에 불변 클래스(immutable class)는 인스턴스를 미리 만들어 놓거나 새로..