inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

이야기를 나눠요

173만명의 커뮤니티!! 함께 토론해봐요.

만료된 메서드 fetchResult(), Blaze-persistence 세팅 관련 글 공유드립니다.

실전! Querydsl

QueryDSL 내부 메소드 중 fetchResult() 나 fetchCount()는 만료된 메소드에 대해서는 QueryDSL에서 Blaze-persistence Integration 라이브러리 사용을 권장 하는데요, Blaze-persistence도 QueryDSL 처럼 쿼리 빌더 API 로서 개발자에게 유지보수하기 좋은 객체를 제공해주고 있습니다. 게다가 최신 업데이트 날짜가 글 작성일 기준(2023.06.21) 일주일 이전이라 여전히 유지보수되고 있어서 최신 스프링버전과 호환성도 어느정도 보장되었다고 볼 수 있습니다. 개인적으로 SpringBoot 3.1.0 기준으로 다음과 같이 세팅하니 정상적으로 동작하는 걸 확인했는데요, 혹시 저처럼 deprecated 메소드를 쓰는 것이 신경쓰이시는 분들을 위해 공유드립니다. build.gradle dependencies { //Blaze-Persistence implementation 'com.blazebit:blaze-persistence-integration-querydsl-expressions-jakarta:1.6.9' implementation 'com.blazebit:blaze-persistence-integration-hibernate-6.2:1.6.9' implementation 'com.blazebit:blaze-persistence-core-impl-jakarta:1.6.9' } BlazePersistenceConfiguration.java @Configuration public class BlazePersistenceConfiguration { @PersistenceUnit private EntityManagerFactory entityManagerFactory; @Bean @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) @Lazy(false) public CriteriaBuilderFactory createCriteriaBuilderFactory() { CriteriaBuilderConfiguration config = Criteria.getDefault(); // do some configuration return config.createCriteriaBuilderFactory(entityManagerFactory); } } QuerydslBasicTest.java ..... JPAQueryFactory queryFactory; @Autowired CriteriaBuilderFactory cbf; BlazeJPAQueryFactory blazeQueryFactory; @BeforeEach public void testEntity(){ queryFactory = new JPAQueryFactory(em); // 이건 동시성 문제를 고민하지 않아도 됨, 해결됨 blazeQueryFactory = new BlazeJPAQueryFactory(em, cbf); ..... 적용 결과 기존 QueryDSL 세팅한 것에 추가로 세팅하시면, 만료된 메소드에 대해 Blaze-persistence 객체로 대체되는데요, 기존 querydsl 클래스를 상속 받는 형태여서 QueryDSL이 제공하는 메소드를 그대로 쓸 수도 있습니다. fetchResults는 fetchPage로 바꿔서 사용할 것을 권장하고 있다는 점 참고하시면 될 것 같습니다. 추가로 내부로직이라든지 설명이 더 필요하시다면 Blaze-persistence 릴리즈 노트 와 Blaze Persistence Document 를 참고하시면 좋을 것 같습니다. 이 글에 대해 지적 및 피드백 해주시면 정말 감사하겠습니다. 감사합니다. 여담 및 고민 : 개인적으로 이 라이브러리의 내부로직을 뜯어보면서 분석하고 검증할 수 있는 역량은 부족한지라 분석 및 검증하는 방법에 대해서 팁이라든지, 아니면 blaze-persistence 사용할 시 주의해야할 점이라든지 조언해주실 수 있으시면 정말 감사드립니다. 강의를 듣던 중에 서브쿼리가 발생하는 부분에서는 정상동작하지 않는 것을 발견했습니다. @Test public void findUserDto(){ QMember memberSub = new QMember("memberSub"); List<UserDto> memberDtoList = queryFactory //이건 blazeQueryFactory가 정상 동작하지 않음 .select(Projections.fields(UserDto.class, //생성자 필드 순서에 맞게 변수를 만들어야 한다. member.username.as("name"), // member.age 대신 서브쿼리로 다 최대 나이로 찍고 싶어 ExpressionUtils.as( JPAExpressions .select(memberSub.age.max()) .from(memberSub), "age") )) .from(member) .fetch(); for (UserDto userDto : memberDtoList) { System.out.println("userDto = " + userDto); } } QueryDSL 쿼리 /* select member1.username as name, (select max(memberSub.age) from Member memberSub) as age from Member member1 */ select m1_0.username, (select max(m2_0.age) from member m2_0) from member m1_0 blaze-persistence 쿼리 /* SELECT member1.username AS name, member1.age AS generatedSubquery_1 FROM Member member1 */ select m1_0.username, m1_0.age from member m1_0 blaze-persistence generatedSubquery라 하여, 서브쿼리를 하나의 alias로 처리를 해버렸는데, 후행으로 이 generatedSubquery 에 대한 정의가 따라오질 않습니다... 왜 이런 차이가 나오는지는 모르겠지만 blaze-persistence 활용할 때는 유의해야할 것 같습니다.

  • java
  • jpa
  • querydsl
  • blaze-persistence
말랑한참깨 댓글 0 좋아요 1 조회수 2811

시간이 계속 다른 날짜가 나와서 원인을 찾고 있었는데

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

코팩님 영상 보니까 코팩님도 그러네요 ㅋㅋ 이후 강의에서 고쳐주실테니 안심하고 진행하겠습니다!

  • flutter
  • 클론코딩
강수빈 댓글 1 좋아요 0 조회수 428

다 뿌셔버렸습니다.

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

최고십니다. 감사합니다.

  • flutter
  • 클론코딩
강수빈 댓글 1 좋아요 0 조회수 380

구글 지도 활용하는 강의 잘 보고 있습니다!

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

이정도는 쉬울거라고 하시면서도 반복해서 알려주시니 이해가 더 잘됩니다! 중급까지 완강하고 난 뒤에 혼자서 앱을 만들 때 구글 지도 활용할 생각에 벌써부터 싱글벙글하네요 ㅋㅋ 좋은 강의 감사합니다!

  • flutter
  • 클론코딩
강수빈 댓글 1 좋아요 0 조회수 415

google맵 polygon 기능 관하여 질문입니다.

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

안녕하세요 초급 강의 수강 후 중급 강의 수강 중인 교육 생입니다. 현재 google api의 polygon 기능을 통해 만든 구역에 색깔 이외에 이미지를 넣을 수도 있을까요??

  • flutter
  • 클론코딩
Kitjdeh 댓글 1 좋아요 0 조회수 377

Access denied for user 'root'@'localhost' (using password: NO) 참고하세요

Slack 클론 코딩[실시간 채팅 with React]

back 디렉토리 안에서 npm i 실행하고 .env 환경변수까지 잘 지정해서 저장했는데 npx sequelize db:create 명령어를 때리면 Access denied for user 'root'@' localhost ' (using password: NO) 에러가 나와서 환장하고 있었습니다. 그러다가 config.js에서 console.log(process.env)를 입력해서 넣어보니 process.env.MYSQL_PASSWORD이 아니라 process.env.PASSWORD에 .env의 패스워드가 들어있었습니다. 따라서 // 기존 "password": process.env.MYSQL_PASSWORD, // 신규 "password": process.env.PASSWORD, 이렇게 고치면 해결될수도 있습니다.

  • react
  • 웹팩
  • typescript
  • socket.io
  • babel
  • 클론코딩
이근민 댓글 0 좋아요 0 조회수 797

뒤로갈수록 따라가기 버겁습니다.

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

뒤로 갈수록 설명이 친절하지 않는 기분이 듭니다. 코딩에 익숙하나 처음 플러터를 배우시는 경험자분들에게 이 강의는 정말 더할나위없이 좋은 강의라고 생각하지만, 점점 뒤로 갈수록 기본적으로 이미 다 알고있는 것처럼 설명이 생략되는 내용이 많아지면서 저처럼 코딩 자체를 플러터로 처음 배우는 초보자에게는 따라가기 힘든 부분이 많습니다. 특히 데이터베이스 부분에서 생소한 용어와 로직이 많은데 뭔가 자세한 설명없이 휙휙 넘어가는 부분이 있어 정말 막막함을 느끼고 있습니다. 저 스스로의 노력이 가장 중요하다는 건 알고 있지만, 그래도 초보자를 위한 코딩강의라면 최소한 생략하는 부분없이 초보자가 잘 이해할 수 있도록 상세하게 설명해주셨으면 좋겠습니다.

  • flutter
  • 클론코딩
elcy12 댓글 1 좋아요 0 조회수 555

statful widget life cycle 그림 벨로그에 올려도 될까요?

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

statful widget life cycle 그림을 공부하는 거 기록중인 개인 벨로그에 올려도 될까요?

  • flutter
  • 클론코딩
dnjsry8377 댓글 1 좋아요 0 조회수 380

플러터와 AWS 연동 문의

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

안녕하세요. 먼저 질문드리기 앞서 좋은 강의 감사드립니다. 아직 강의를 다 듣지 않은 시점에서 조금은 섣부른 질문일 수도 있으나, 현재 진행중인 프로젝트 일정상 가능성여부를 보고해야하여 다음과 같은 질문을 드리는 점 양해 부탁드립니다. 질문은 다음과 같습니다. 구현조건 AWS에서 일정 시간마다 또는 결과물의 상태가 변화 할 때(e.g 피카츄에서 라이츄로 진화)마다 서버에서 데이터를 전송하여 어플리케이션에 반영 (단, 결과물 타입은 int 타입) 질문사항 1) AWS 와 플러터를 연동 가능 여부 2) 가능하다면, 초급/중급 강의에서 어떤 렉쳐를 통해 학습을 진행하면 보다 빠르게 실습이 가능한지 입니다. 다시 한 번.. 본래 커리큘럼의 취지에 맞춰 순서대로 실습하고 배우는 것이 필요하지만, 일정상 우선 제작을 해야하는 입장이라 다음과 같은 질문을 드리는 점 양해부탁드립니다.. 감사합니다.

  • flutter
  • 클론코딩
businessapp71 댓글 1 좋아요 0 조회수 1223

context-api쪽 auth.tsx를 제 나름대로 리팩토리 해보았습니다.

따라하며 배우는 노드, 리액트 시리즈 - 레딧 사이트 만들기(NextJS)(Pages Router)

[auth.tsx] import { User } from '@/shared/interfaces/user.interface'; import { createContext, FC, PropsWithChildren, useContext, useReducer, Dispatch, ReactNode, } from 'react'; interface AuthState { authenticated: boolean; user: User | undefined; loading: boolean; } export type AuthAction = | { type: 'LOGIN'; payload: User } | { type: 'LOGOUT' } | { type: 'STOP_LOADING' } | { type: undefined }; const initialState: AuthState = { authenticated: false, user: undefined, loading: true, }; const AuthContext = createContext<{ state: AuthState; dispatch: Dispatch<AuthAction>; }>({ state: initialState, dispatch: () => null, }); const authReducer = (state: AuthState, action: AuthAction): AuthState => { switch (action.type) { case 'LOGIN': return { ...state, authenticated: true, user: action.payload, }; case 'LOGOUT': return { ...state, authenticated: false, user: undefined, }; case 'STOP_LOADING': return { ...state, loading: false, }; default: throw new Error(`Unknown action type: ${action.type}`); } }; const AuthProvider: FC<PropsWithChildren<{ children?: ReactNode }>> = ({ children, }) => { const [state, dispatch] = useReducer(authReducer, initialState); return ( <AuthContext.Provider value={{ state, dispatch }}> {children} </AuthContext.Provider> ); }; const useAuthStateDispatch = () => useContext(AuthContext); export { AuthProvider, useAuthStateDispatch }; [login.tsx] import InputGroup from '@/components/ui/field/InputGroup'; import axios from 'axios'; import { AuthAction, useAuthStateDispatch } from 'context/auth'; import { NextPage } from 'next'; import Link from 'next/link'; import { useRouter } from 'next/router'; import React, { FormEvent, useState } from 'react'; const LoginPage: NextPage = () => { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [errors, setErros] = useState<any>({}); const router = useRouter(); const { dispatch } = useAuthStateDispatch(); const handleSubmit = async (e: FormEvent) => { e.preventDefault(); try { const res = await axios.post( '/auth/login', { password, username }, { withCredentials: true }, ); dispatch({ type: 'LOGIN', payload: res.data?.user }); router.push('/'); } catch (error: any) { console.log(error); setErros(error.response.data || {}); } }; return ( <div className="bg-white"> <div className="flex flex-col items-center justify-center h-screen p-6"> <div className="w-10/12 mx-auto md:w-96"> <h1 className="mb-2 text-lg font-medium">로그인</h1> <form onSubmit={handleSubmit}> <InputGroup placeholder="Username" value={username} setValue={setUsername} error={errors.username} /> <InputGroup placeholder="Password" value={password} setValue={setPassword} error={errors.password} /> <button className="w-full py-2 mb-1 text-xs font-bold text-white uppercase bg-gray-400 border border-gray-400 rounded"> 로그인 </button> </form> <small> 아직 아이디가 없나요? <Link href="/register" className="ml-1 text-blue-500 uppercase"> 회원가입 </Link> </small> </div> </div> </div> ); }; export default LoginPage; 누군가에겐 도움이 되지 않을까해서 남겨 보아요!

rhkdtjd_12 댓글 0 좋아요 1 조회수 412

프로젝트

Slack 클론 코딩[실시간 채팅 with React]

제로초님, 강의에 대한 내용은 아니지만 이번에 강의를 두 번 보고나서 이제 개인적으로 블로그를 만들어보려고 하는데, 서버도 연결해보려고 합니다. 이번에 서버를 처음 만들어보는 건데 보통 백엔드랑 프론트엔드 부분이랑 같이 만들 때, 프론트 쪽부터 먼저 만들고 백엔드 쪽을 하는게 낫나요? 아니면 백엔드쪽부터 먼저 만들어 놓고 하는 게 낫나요?

  • react
  • 웹팩
  • typescript
  • socket.io
  • babel
  • 클론코딩
성창수 댓글 2 좋아요 0 조회수 1073

코팩님 지도 관련 재밌어요!!!

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

지도 강의에서 재밌으면 댓 남겨달라고 하신걸 듣고 댓글 남겨요 더 추가 원해요! 아주 api사용 하는거 재밌어요

  • flutter
  • 클론코딩
순곰 댓글 1 좋아요 0 조회수 421

2023_02_05_강의 수강 시작합니다

애플 웹사이트 인터랙션 클론!

좋은 강의 감사합니다 ^^ 개발자들과 협업할때 답답함에 못이겨서 유튜브에 올라온 강의부터 정독했습니다, 23_02_05 강의 스타트! 화이팅!

  • html/css
  • javascript
  • 웹-디자인
  • svg
  • 인터랙티브-웹
  • 클론코딩
꿀잠 댓글 0 좋아요 0 조회수 609

백엔드 개발자의 방향성에 대해 조언을 얻고자 합니다

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

현재 국비 학원을 수료하며 프로젝트를 마친 뒤에 김영한님 강의를 듣고 있으며 spring에 대해 이제서야 이해하려 하는 취준생입니다. 문득 제가 어떤 개발을 하고 싶은지 방향성에 대해 생각해보게 되었습니다. ->어떤 개발을 하고 싶은지 방향성에 대해 되짚어 보고 있었다 ->SQL문을 짜면서 효율적인 방법은 무엇이 있을까 고민하는 과정이 스스로 가치 있는 고민을 하고 있다는 생각이 들었다. ->데이터 처리 속도 개선에 관하여 고민하는 개발자가 되고 싶다. ->대용량 트래픽을 다루는 서비스 회사에서 성장하고 싶다. 질문 ==> 위의 4문장을 설득력 있게 말하기 위해서 취준에 뛰어드는 예비 백엔드 개발자 수준에서 할 수 있는 "공부 방향"은 무엇이 있을지 조언 해주실 수 있을까요? (특정 개념이나 강의를 추천해주셔도 감사할 것 같습니다. )

  • springboot
  • java
  • spring
  • 백엔드
  • 신입
sky66951 댓글 1 좋아요 3 조회수 5676

QueryDsl SpringBoot 2.7의 gradle 설정을 공유합니다.

실전! Querydsl

plugins { id 'org.springframework.boot' version '2.7.4' id 'io.spring.dependency-management' version '1.0.14.RELEASE' id 'java' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' // queryDSL 설정 implementation "com.querydsl:querydsl-jpa" implementation "com.querydsl:querydsl-core" implementation "com.querydsl:querydsl-collections" annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" // querydsl JPAAnnotationProcessor 사용 지정 annotationProcessor "jakarta.annotation:jakarta.annotation-api" // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드 annotationProcessor "jakarta.persistence:jakarta.persistence-api" // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드 } tasks.named('test') { useJUnitPlatform() } // Querydsl 설정부 def generated = 'src/main/generated' // querydsl QClass 파일 생성 위치를 지정 tasks.withType(JavaCompile) { options.getGeneratedSourceOutputDirectory().set(file(generated)) } // java source set 에 querydsl QClass 위치 추가 sourceSets { main.java.srcDirs += [ generated ] } // gradle clean 시에 QClass 디렉토리 삭제 clean { delete file(generated) } 해당 소스는 타사 강의 보다가 본 설정에서 가져왔습니다. 기존 영한님 강의와 다른 점이 3가지 있으니 주의하시기 바랍니다. Querydsl Q파일 생성 위치가 다릅니다. 기존 영한님 강의대로 $build 로 시작하는 설정을 사용하면 테스트 실행 시 Q파일의 위치를 찾지 못해서 테스트가 실패합니다. Gradle -> Tasks -> build -> clean Gradle -> Tasks -> build -> build 혹은 classes 기존 영한님 교안에는 빌드 시 Gradle -> Tasks -> other -> compileQuerydsl 로 Q파일을 생성하지만, 이 방법의 경우 other에 해당 메뉴가 없습니다. 그래서 빌드 시에는 그냥 build 메뉴의 build 혹은 classes 로 빌드하시면 Q파일이 생깁니다. 영한님 강의에서는 gradle build 폴더가 대부분 git 버전관리에 포함되지 않으므로 따로 설정할 필요가 없지만, 이 경우 Q파일이 소스폴더에 들어가므로 .gitignore 에 아래와 같이 별도로 경로를 설정해 주어야 합니다. ### Querydsl /src/main/generated 혹시 저같이 청개구리마냥 강의에 나온 버전 사용 안 하고 최신 버전 사용하시는 분들께 도움이 되었으면 좋겠습니다. 저도 타사 강의에서 가져온 것이고 기초 테스트만 통과한 것이라서 혹시 강의에 맞지 않는 경우 영한님이나 다른 분들이 추가 정보를 주시면 좋을 것 같습니다. 여담인데 QueryDSL은 쿼리 짜긴 확실히 편한데 설정이 버전마다 중구난방이라 불편합니다. 똑똑한 개발자분들이 이런 설정도 그냥 @Configuration 으로 빼버리는 거 만들어주지 않을까 하는 기대가 있긴 합니다.

  • java
  • spring
  • jpa
  • querydsl
박민호 댓글 5 좋아요 20 조회수 11527

소프트웨어 진로 결정 관련 질문

저는 일단 정보통신공학 2학년인데 소프트 커리를 타려고 생각중이에요 2학기에 C++ 자료구조론을 배우는데 여론으로는 C++은 게임 개발이나 인공지능? 쪽에서 많이 쓰인다고 하고 제가 생각하는 프론트/백엔드의 웹 개발자는 java나 python이 주 프로그래밍 언어이고 IT기업 쪽에서도 java를 활용한 툴(Spring 등)을 선호하고 있다고 들어서 C++은 학점 챙기는 용으로 공부하고 진로를 위해서는 java를 중점적으로 공부하려고 하는데 1. 지금 java와 C++ 자료구조를 병행해서 공부를 하는 것이 나은지(공부 비중은 C++을 더 높게) 2. 일단은 C++ 자료구조를 중점적으로 공부할지 고민되어 질문글 올립니다 ㅠㅠ - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

  • java
  • c++
초롱초롱한 랫서팬더 댓글 0 좋아요 0 조회수 320

서울시뉴딜일자리_IT인턴 3개월 [급여월260만]지원사업안내_빅데이터 기반 서비스플랫폼 과정 [스터디,프로젝트,프론트엔드,백엔드,자바,코딩]

서울시에서 뉴딜일자리사업 일환으로 2차 서비스플랫폼개발자 양성과정으로 3개월 인턴십 (급여 월 260) 보내주는 프로그램 진행중인데 신청해보세요! 자세한 내용은 https://blog.naver.com/kjc_sh/222775806456 참고해주세요

  • 깃허브
  • 프로젝트
  • 인턴
  • 백엔드
  • 프론트엔드
  • java
  • spring
  • 자바
  • 스프링
한국취업센터 댓글 0 좋아요 0 조회수 488

서울시 뉴딜일자리사업으로 블록체인분야 월260만 3개월 인턴시켜주는 프로그램 추천합니다.

블록체인 분야 기술을 배우고싶은 분들 or 블록체인 분야 취업을 원하시는 분들 주목! 서울시에서 뉴딜일자리사업 일환으로 IT 블록체인과정으로 3개월 인턴십 (급여 월 260) 보내주는 프로그램 진행중인데 신청해보세요! https://blog.naver.com/kjc_sh/222745988610 자세한 내용은참고해주세요 오픈카카오톡 문의 [ https://open.kakao.com/o/stkiOIhe ]

  • java
  • spring
  • c##
  • 자바
  • 프론트엔드
  • 백엔드
  • 웹개발
  • api
한국취업센터 댓글 0 좋아요 0 조회수 452

정말 꿀팁 강의입니다...

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

본 강의에서 알려주신 판다스 및 이미지 활용 예제를 알려주셔서 감사합니다. 강의 후반에 알려주신 것 처럼 활용 할 수 있는 부분이 굉장히 많아 보입니다. 판다스 예제를 views.py에 녹여 봤는데, 잘 출력됩니다 ㅎㅎ 이후 템플릿 폴더 내부 html 파일을 생성해서 디자인 좀 추가해 출력하면 분석 툴 제작도 충분히 가능할 듯 싶네요. 강의 중반까지 듣고 시도해 보겠습니다 :)

  • pandas
  • images
이재화 댓글 1 좋아요 3 조회수 325

인기 태그

인프런 TOP Writers

주간 인기글