Java 프로그램에서 데이터베이스를 사용하는 새로운 방법
데이터 처리 함수식 방식
Java 8은 함수식 지원을 추가했을 뿐만 아니라 새로운 함수식으로 데이터를 처리하는 방식으로 집합(Collection) 클래스를 확장했습니다.일반적인 상황에서 자바가 대량의 데이터를 처리할 때 대량의 순환과 교체기가 필요하다.
예를 들어 고객(Customer) 대상을 저장하는 콜렉션이 있다고 가정해 보세요.
Collection<Customer> customers;
Belgium에서 온 고객에게만 관심이 있다면, 모든 고객 대상을 교체하고 필요한 것만 저장해야 합니다.
Collection<Customer> belgians = new ArrayList<>();
for (Customer c : customers) {
if (c.getCountry().equals("Belgium"))
belgians.add(c);
}
이것은 5줄 코드를 썼을 뿐만 아니라, 그다지 추상적이지도 않다.만약 당신이 천만 명의 상대가 있다면 어떻게 될까요?당신은 두 개의 라인을 통해 모든 대상을 필터링하여 속도를 높일 수 있습니까?그러면 모든 코드를 다시 쓰기 위해 대량의 위험한 다중 스레드 코드를 사용해야만 할 것이다.Java8을 통해 코드 한 줄만으로 동일한 기능을 구현할 수 있습니다.함수식 프로그래밍에 대한 지원을 통해 Java8은 함수 하나만 써서 어떤 고객(대상)에 관심이 있는지 보여주고 그 함수를 사용하여 집합을 필터링하면 됩니다.Java 8의 새 Steams API는 다음과 같은 작업을 지원합니다.
customers.stream().filter(
c -> c.getCountry().equals("Belgium")
);
위의 Java 8 버전의 코드는 더욱 짧을 뿐만 아니라 이해하기 쉽다.그것은 거의 진부한 말(순환이나 교체기 등)이 없다.코드가 filter () 방법을 호출했습니다. 이 코드는 고객 (대상) 을 필터하는 데 사용되는 것이 분명합니다.순환 중인 코드를 해석하는 데 시간을 낭비해서 데이터에 대해 무엇을 하는지 이해할 필요가 없다.만약 네가 이 코드를 병행 실행하고 싶다면 어떻게 해야 합니까?다른 유형의stream만 사용하면
customers.parallelStream().filter(
c -> c.getCountry().equals("Belgium")
);
더욱 감동적인 것은 이런 함수식 스타일의 코드도 데이터베이스에 똑같이 적용된다는 것이다데이터베이스에서 함수식 방식 사용하기
전통적으로 프로그래머는 특수 데이터베이스 조회 문장으로 데이터베이스에 접근하는 데이터를 필요로 한다.예를 들어, 다음은 JDBC 코드를 사용하여 Belgium에서 온 고객을 찾는 것입니다.
PreparedStatement s = con.prepareStatement(
"SELECT * "
+ "FROM Customer C "
+ "WHERE C.Country = ? ");
s.setString(1, "Belgium");
ResultSet rs = s.executeQuery();
대부분의 이 코드들은 문자열이다. 이렇게 하면 컴파일러가 오류를 발견할 수 없을 뿐만 아니라, 이 경솔한 코드는 안전 문제를 초래할 수 있다.그리고 이런 대량의 샘플 코드는 쓰기 데이터 접근 코드를 매우 번거롭게 한다.일부 도구, 예를 들어 jOOQ는 특수한 자바 라이브러리를 사용하여 데이터베이스 조회 언어를 제공하면 오류 검사와 안전 문제를 해결할 수 있다.또는 대상 관계 매핑 도구를 사용하면 대량의 재미없는 코드를 피할 수 있지만, 일반적인 접근 조회에만 사용할 수 있으며, 복잡한 조회가 필요하거나 특수한 데이터베이스 조회 언어를 사용해야 한다.Java8을 사용하면 스트리밍 API를 통해 데이터베이스를 함수식으로 조회할 수 있습니다.예를 들어 Jinq는 어떤 미래 데이터베이스 API가 함수식 프로그래밍을 가능하게 할 수 있는지 탐색하는 개원 프로젝트이다.여기가 바로 Jinq를 사용하는 데이터베이스 조회입니다.
customers.where(
c -> c.getCountry().equals("Belgium")
);
이 코드는 거의 스트리밍 API를 사용하는 코드와 같다.사실 미래의 Jinq 버전은 데이터베이스 조회를 흐르는 API로 직접 쓸 수 있습니다.코드가 실행될 때 Jinq는 데이터베이스 조회 코드로 자동으로 번역됩니다. 이전의 JDBC 조회와 같습니다.이렇게 되면 새로운 데이터베이스 조회 언어를 배운 적이 없어도 효율적인 데이터베이스 조회를 쓸 수 있다.너는 같은 스타일의 코드를 자바 집합에 사용할 수 있다.너도 특별한 자바 컴파일러나 가상 머신이 필요 없어.모든 코드는 일반 자바 8 JDK에서 컴파일되고 실행됩니다.만약 코드에 오류가 있다면, 컴파일러는 그것들을 찾아서 일반적인 자바 코드처럼 보고할 것이다.
Jinq는 SQL92와 같은 복잡한 조회를 지원합니다.Selection(선택), projection(투영), joins(연결), 하위 검색이 지원됩니다.자바 코드를 데이터베이스 조회로 번역하는 알고리즘은 매우 유연하여 받아들일 수 있는 것이라면 모두 번역할 수 있다.예를 들어 Jinq는 복잡하지만 아래의 데이터베이스 조회를 번역할 수 있다.
customers
.where( c -> c.getCountry().equals("Belgium") )
.where( c -> {
if (c.getSalary() < 100000)
return c.getSalary() < c.getDebt();
else
return c.getSalary() < 2 * c.getDebt();
} );
보시다시피 자바 8의 함수식 프로그래밍은 데이터베이스 조회에 매우 적합합니다.게다가 조회가 치밀하고 심지어 복잡한 조회도 감당할 수 있다.내부 운영
그런데 이게 다 어떻게 일하는 거예요?어떻게 일반적인 자바 컴파일러로 하여금 자바 코드를 데이터베이스 조회로 전환시킬 수 있습니까?Java 8은 이것을 가능하게 하는 특별한 점이 있나요?
이러한 함수성 스타일을 지원하는 새로운 데이터베이스 PI의 관건은'상징적 실행'이라는 바이트 코드 분석 수단이다.비록 당신의 코드는 일반적인 자바 컴파일러에 의해 컴파일되어 일반적인 자바 가상 컴퓨터에서 실행되지만, Jinq는 당신이 컴파일된 자바 코드가 실행될 때 분석하고 데이터베이스 조회를 구축할 수 있습니다.Java 8 Streams API를 사용할 때 짧은 함수를 분석할 때 상징적으로 실행되는 작업 효과가 가장 좋다는 것을 자주 발견할 수 있습니다.
이 상징적인 집행이 어떻게 작동하는지 이해하려면 가장 간단한 방법은 하나의 예를 사용하는 것이다.다음 쿼리가 어떻게 Jinq에서 SQL 쿼리 언어로 변환되었는지 확인해 보겠습니다.
customers
.where( c -> c.getCountry().equals("Belgium") )
처음에 변수customers는 하나의 집합이고 그에 대응하는 데이터베이스 조회는 다음과 같다.
SELECT *
FROM Customers C
그리고where () 방법이 호출되어 함수가 전달됩니다.where () 방법에서 Jinq는 이 함수를 엽니다.class 파일, 이 함수가 컴파일된 바이트 코드를 얻어 분석합니다.이 예에서 진정한 바이트 코드를 사용하지 않고 간단한 명령으로 이 함수를 대표하는 바이트 코드를 사용합니다.
d = c.getCountry()
e = “Belgium”
e = d.equals(e)
return e
여기서 우리는 함수가 자바 컴파일러에 의해 이 네 가지 명령으로 컴파일되었다고 가정합니다.where () 방법을 호출할 때 Jinq가 본 것은 바로 이것입니다.어떻게 해야만 Jinq가 이 코드들을 이해할 수 있습니까?Jinq는 실행 코드를 통해 분석합니다.하지만 Jinq는 코드를 직접 실행하지 않습니다.이것은'추상적'으로 코드를 실행합니다. 실제 변수와 실제 값을 사용하지 않습니다. Jinq는 코드를 실행할 때의 모든 값을 표시하기 위해 기호를 사용합니다.이것이 바로 이 분석이 왜'상징적 집행'이라고 불리는가이다.
Jinq는 모든 명령을 실행하고 모든 부작용이나 코드가 프로그램 상태에서 바뀌는 모든 것을 추적합니다.다음은 진q가 상징적인 실행 방식으로 이 네 줄 코드를 실행할 때 발견한 모든 부작용을 보여 주는 도표입니다.
상징적 집행의 예
그림에서 첫 번째 지령이 실행된 후에 Jinq는 두 가지 부작용을 발견했다. 변수 d가 이미 변했다. 방법Customer.getCountry () 가 호출됩니다.상징적인 실행이기 때문에 변수 d는'USA'나'Denmark'와 같은 진정한 값을 제시하지 않았고 c.getCountry () 의 상징적인 값으로 분배되었다.
이 모든 지령이 상징적으로 집행된 후에 Jinq는 부작용을 간소화했다.변수 d와 e는 국부 변수이기 때문에 그들의 모든 변화는 함수가 종료된 후에 버려지기 때문에 이러한 부작용은 무시할 수 있다.Jinq도 고객을 안다.getCountry() and String.equals () 방법은 변수를 수정하거나 출력을 표시하지 않았기 때문에 호출도 무시할 수 있습니다.이로써 Jinq는 이러한 결론을 얻을 수 있다. 이 함수를 실행하면 하나의 작용만 발생하고 c.getCountry () 를 되돌려준다.equals("Belgium").
일단 Jinq가 where () 방법에서 전달된 함수를 알게 되면 데이터베이스 조회에 대한 지식을 혼합하고customers 집합을 우선하여 새로운 데이터베이스 조회를 만들 수 있습니다.
데이터베이스 조회 생성
이것이 바로 Jinq가 어떻게 당신의 코드에서 데이터베이스 조회를 생성하는지입니다.상징적 실행의 사용은 이런 방법이 서로 다른 자바 컴파일러가 출력하는 서로 다른 코드 모델에 대해 상당히 강하다는 것을 의미한다.만약 Jinq가 만난 코드가 데이터베이스 조회로 전환되지 못하는 부작용이 있다면, Jinq는 당신의 코드를 변하지 않게 유지할 것입니다.모든 것이 정상적인 Java 코드로 작성되었기 때문에 Jinq는 그 코드를 직접 실행할 수 있습니다. 코드가 예상한 결과를 가져올 것입니다.
이 간단한 번역 실례는 너에게 어떻게 번역 작품을 조회하는지 알게 해야 한다.너는 이 알고리즘들이 너의 코드에서 데이터베이스 조회를 정확하게 생성할 수 있다고 확신할 수 있다.
아름다운 전경
자바 8이 가져온 자바에서 데이터베이스 작업을 하는 새로운 방식을 맛보게 해줬으면 좋겠어요.자바 8이 지원하는 함수식 프로그래밍은 자바 집합을 위한 코드와 같은 방식으로 데이터베이스에 코드를 쓸 수 있도록 합니다.머지않아 기존의 데이터베이스 API가 이러한 유형의 조회를 지원하기 위해 확장될 수 있기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.