월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨실전! Querydsl
fetchResults(), fetchCount() deprecated
안녕하세요countQuery 최적화까지 잘 들었는데요. queryDsl 특정버전 이상에서는 fetchResults(), fetchCount() 가 deprecated 되어었네요.그러면 앞으로 queryDsl 로 페이징을 처리할 때는.count(), content() 쿼리 동시에 X : searchPageSimple() 함수에서 사용한 fetchResult() 는 사용X 이므로.쿼리 최적화 방법도 X : 리턴값에 fetchCount() 를 사용해야 하므로.count(), content() 쿼리 별도로 날리고 (https://www.inflearn.com/questions/806452 참고) count() 쿼리시에는 sql의 count() 함수와 fetchOne() 을 사용한다.정리하면 3번의 방법을 사용하되, 이번 강의에서 말씀해주신 특정 조건에만 날아가는 쿼리도 사용은 못하는 것(fetchCount() Depcreaed 이므로) 맞을까요? 감사합니다.
- 미해결실전! Querydsl
constructor 방식 Enum List argument type mismatch 질문
안녕하세요 영한님! 저는 강의 후에 개인 프로젝트를 진행중인데요@Column(nullable = false) @ElementCollection private List<Tech> techs;Post class에 해당 Enum type List가 있습니다.package project.como.domain.post.model; import lombok.AllArgsConstructor; import lombok.Getter; @Getter @AllArgsConstructor public enum Tech { Java("Java"), Spring("Spring"); private String stack; } 그런데 Projections.constructor 방식으로 Dto를 만들때 에러가 발생합니다.List<PostAbstractResponseDto> content = queryFactory .select(Projections.constructor(PostAbstractResponseDto.class, post.title, post.category, post.state, post.techs )) .from(post) .where(stateEq(condition.getState()), categoryEq(condition.getCategory()), techsContains(condition.getTechs())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch();post.techs와 조건식을 제외하고 조회할 때는 정상적으로 잘 동작하지만, post.techs를 넣는 경우에 argument type mismatch 에러가 발생하네요. 무슨 문제인지 궁금합니다. 감사합니다 :)
- 미해결실전! Querydsl
연관관계 편의 메소드 관련 , select시 return이 2개 나올때 질문
jpa로 토이프로젝트를 하고 있는데 아래와 같이 여정 정보를 저장하는 코드 입니다.저장할 Journey를 Entity로 변경 후 setTravel로 매핑합니다.그 후 전체 Travel 데이터를 return하는데 return되는 값에 저장했던 Journey가 2개 들어 있습니다. 왜그런지 이유를 잘 모르겠습니다. ㅠ.ㅠ @Transactional public List<TravelDto.Response> addJourney(Traveler traveler, Long travelId, JourneyDto.Request newJourney) throws IOException { Travel travel = travelRepository.findTravelByTravelerIdAndTravelId(traveler.getId(), travelId); Journey newJourneyEntity = newJourney.toEntity(); newJourneyEntity.setTravel(travel); return getTravel(traveler); } public List<TravelDto.Response> getTravel(Traveler traveler) { return travelRepository.findByTravelerIdOrderByOrderKeyAsc(traveler.getId()) .stream() .map(TravelDto.Response::new) .collect(Collectors.toList()); } public void setTravel(Travel travel) { if (this.travel != null) { this.travel.getJourneys().remove(this); } this.travel = travel; travel.getJourneys().add(this); }
- 미해결실전! Querydsl
JPAQueryFactory 의 @Bean 등록
안녕하세요,위 사진처럼 JPAQueryFactory를 별도로 생성해주거나, 아니면 JPAQueryFactory 를 별도로 @Bean 등록해서 생성자 파라미터로 주입받거나 두가지 방식으로 아무거나 해도 되잖아요? 그런데 문득 궁금한데, 습관처럼 사용하던 EntityManager 같은 것들은 Spring이 자동으로 @Bean 으로 등록해서 관리하고 있는 거죠? 그렇다면 JPAQueryFactory는 왜 별도로 스프링이 @Bean 으로 자동 등록해두지 않은 거죠? 감사합니다.
- 미해결실전! Querydsl
Projections.fields()와 Projections.bean() 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]>> 로컬 환경스프링부트 3.1.2hibernate-core 6.2.6안녕하세요!Projections.bean()은 setter를 이용해서 인스턴스를 만든다고 하셨는데, getter/setter를 전부 제거해도 테스트를 통과하고 인스턴스도 잘 초기화가 되어버렸습니다.좀 이상하기도 하고 bean()와 fields()가 동작 방식이 거의 같은 것 같아 확인해보니 new QBean<T>를 할 떄 fields()에는 fieldAccess 파라미터에 true를 인수로 넣는 차이밖에 없더라고요.public static <T> QBean<T> fields(Class<? extends T> type, Expression<?>... exprs) { return new QBean<T>(type, true, exprs); }라이브러리 코드를 보면fieldAccess가 true면 this.fields에 값을 바인딩하고 this.setters는 emptyList로 초기화하고 fieldAccess가 false일 경우 this.fields를 emptyList로 초기화하고 this.setters에 값을 바인딩하는데요.if (fieldAccess) { this.fields = initFields(bindings); this.setters = Collections.emptyList(); } else { this.fields = Collections.emptyList(); this.setters = initMethods(bindings); }실무에서 활용할 때 이 두 함수 관련해서 주의점이 있을까요?
- 해결됨실전! Querydsl
init 메서드에 @Transactional
init() 메서드에 @Transactional 을 넣어주는 이유는 무엇인가요? 감사합니다.
- 해결됨실전! Querydsl
valid 체크 메서드
안녕하세요인증할 때 != null 이라던가 StringUtils.hasText() 를 사용하시던데ObjectUtils.isEmpty() 함수를 사용하면 한번에 다 처리가 가능한데 사용안하는 이유가 있을까요? 다른 강의에서도 못 본 것 같아서요. 감사합니다.
- 미해결실전! Querydsl
select 절 서브쿼리 결과를 where 절에 조건으로 넣을 수 있나요?
Querydsl로 쿼리를 짜던 중 ExpressionUtils 과 JPAExpressions를 이용해 서브쿼리 작성 후 select 절에서 원하는 데이터를 조회 하는 것은 가능했는데요, 이 조회 된 값을 그대로 where 절에서 조건식으로 사용하고 싶은데, 혹시 해당 상황을 QueryDsl이 제공을 해주나요?찾아보니 쉬이 찾아지지 않아서 골치가 아프네요...예를들면 짜려는 쿼리는 아래와 같습니다.select a.member_name, ( select count(*) from user b where a.member_no = b.member_no) as 'cnt'from member awhere cnt > 1;혹시 방법이 있을까요? (상황상 group by 나 having 절을 사용하긴 어렵습니다..)
- 미해결실전! Querydsl
entity onetomany로 가져온 데이터 delete 안되는 문제
예를 들어 Team, Member 엔티티가 있고 일대다 매핑을 했습니다.Team에는 Memberlist라는 필드를 넣어주고 onetomany어노테이션을 달아주고 지연로딩, cascadeAll을 달아줬습니다.질문은 team을 find해서 가져오고 team.getmemgerList로 멤버리스트를 가져온다음에 memger.getId를 해서 id 값을 가져온다음MemgerRepository.deleteById 메서드를 호출해서 멤버를 삭제하려 하였습니다. 그런데 이렇게 하니까 delete문이 나가지 않는 문제가 발생했습니다. 에러는 나지 않는데 말이죠.그렇게 한참 헤메다가 id 값으로 member를 find하고 그 다음 delete하니까 삭제가 되었습니다. 이 문제에 대해서 알고싶습니다 감사합니다.
- 해결됨실전! Querydsl
최초 테스트에서 질문있습니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]스프링부트 버전 3.1.2Querydsl 버전 5.0.0테스트 코드에서 질문 드릴 것이 있사옵니다. @Test void contextLoads() { Hello hello = new Hello(); em.persist(hello); JPAQueryFactory query = new JPAQueryFactory(em); QHello qHello = new QHello("h"); System.out.println("========START"); Hello result = query .selectFrom(qHello) .fetchOne(); System.out.println("========END"); assertThat(result).isEqualTo(hello); }같은 트랙잭션에서 영속성 컨텍스트의 데이터를 얻어올 테니 result와 hello가 같은 게 당연한데요. querydsl로 select하는 부분에서 insert와 select query가 나가더라고요. ========START 2023-08-02T13:14:13.697+09:00 DEBUG 2696 --- [ Test worker] org.hibernate.SQL : insert into hello (id) values (?) 2023-08-02T13:14:13.699+09:00 INFO 2696 --- [ Test worker] p6spy : #1690949653699 | took 0ms | statement | connection 4| url jdbc:h2:tcp://localhost/~/datajpa insert into hello (id) values (?) insert into hello (id) values (1); 2023-08-02T13:14:13.717+09:00 DEBUG 2696 --- [ Test worker] org.hibernate.SQL : select h1_0.id from hello h1_0 2023-08-02T13:14:13.718+09:00 INFO 2696 --- [ Test worker] p6spy : #1690949653718 | took 0ms | statement | connection 4| url jdbc:h2:tcp://localhost/~/datajpa select h1_0.id from hello h1_0 select h1_0.id from hello h1_0; ========END1차 캐시에서 데이터를 가져올텐데 굳이 query가 왜 나가는지 궁금합니다. 1차 캐시가 새로 갱신되었을리도 없고 갱신되어서도 안 된다고 생각했습니다.
- 미해결실전! Querydsl
test 소스에서 @Autowired EntityManager em; 시 오류가 납니다 ㅠㅠ
java 소스에서는 EntityManager em 사용시 오류가 안나는데,test소스에서 EntityManager em @Autowired 시 빨간줄로 오류가 생깁니다 ㅠㅠ.. build.gradel, tsetd의 application.yml 같이 올립니다 무슨이유 인지 모르겠습니다 ㅜㅜ..buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'java' id 'org.springframework.boot' version '2.7.1' id 'io.spring.dependency-management' version '1.1.0' //querydsl 추가 //id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } group = 'saft' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' // NotEmpty compileOnly 'org.projectlombok:lombok' //runtimeOnly 'com.h2database:h2:1.4.199' implementation 'com.h2database:h2' //querydsl 추가 //implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" //annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}" implementation 'com.querydsl:querydsl-jpa:5.0.0' // implementation 'com.querydsl:querydsl-apt:5.0.0' // 추가 ↓ annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" //파라미터 확인 라이브러리 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.8' // MapStruct implementation 'org.mapstruct:mapstruct:1.4.2.Final' annotationProcessor "org.mapstruct:mapstruct-processor:1.4.2.Final" annotationProcessor( 'org.projectlombok:lombok', 'org.projectlombok:lombok-mapstruct-binding:0.1.0' ) //test추가 annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { useJUnitPlatform() } /* //querydsl 추가 시작 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } compileQuerydsl{ options.annotationProcessorPath = configurations.querydsl } configurations { compileOnly { extendsFrom annotationProcessor } querydsl.extendsFrom compileClasspath } //querydsl 추가 끝 */ def generatedDir = "src/main/generated" clean { delete file(generatedDir) }spring: profiles: active: test datasource: url: jdbc:h2:tcp://localhost/~/saft username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: true use_sql_comments: true logging.level: org.hibernate.SQL: debug # org.hibernate.type: trace
- 해결됨실전! Querydsl
@Deprecated
안녕하세요 queryDsl의 기본 문법에 대해서 듣고 있는데요.현재 기준, fetchResults(), fetchCount() 가 deprecated 되었네요.(자바11, springboot 2.7 버전에 맞는 queryDsl)강의 끝부분에서 말씀하신, 복잡한 페이징 & 쿼리 부분에서는 coun와 select 쿼리가 다르니까 따로 작성해서 해야된다는 말씀 것과 연관되어서 그런 것 맞을까요? 그러면 @Deprecated 된 현재는 fetchResults(), fetchCount() 는 사용을 지양하고 별개의 쿼리로 각각의 값들을 얻어 조합해서 response 해주는 것이 맞죠?
- 해결됨실전! Querydsl
생성자
안녕하세요jpa 인강 다 듣고 querydsl 강의 듣고 있습니다. 다름이 아니라 기본생성자의 접근제한자를 PROTECTED 로 제한한 이유가 있을까요? 기본생성자 자체가 필요한 이유는 프록시 객체 생성시 필요하다고 알고 있는데요, 굳이 PROTECTED 로 설정한 이유를 알고 싶습니다. 감사합니다.
- 미해결실전! Querydsl
QueryDsl 설정 관련 질문입니다.
영한님께서 알려주신 Spring boot 3.x버전 방식으로 설정을 하면이렇게 build에 QClass가 생성되긴 하지만 막상 QHello를 쓰려고 하니 import를 하지 못하더라구요 그래서 구글링을 해서 다른 방식으로 해봤더니src에 생성이 되어서 import를 할 수 있었습니다.두 설정의 차이점은build.gradle - 영한님 설정구글링 설정이 부분에서 차이가 있었습니다.제가 보기엔 구긍링 방식은 생성위치를 src로 지정했기 때문에 src에 생성이 된 것 같은데 영한님과 같이 build에 생성을 하게 되면 어떻게 import를 할 수 있는지 궁금합니다.
- 미해결실전! Querydsl
querydsl에서 groupby, having 절을 포함한 경우 페이징 처리에 관한 질문 좀 드리겠습니다!
안녕하세요 querydsl로 페이징 처리를 구현하는 도중에 어려움에 부딪혀서 질문 작성하게 됐습니다!List<CloverPayDTO.PageResponse> contents = queryFactory .select(Projections.constructor( CloverPayDTO.PageResponse.class, memberInformation.memberName, member.id, member.nickName, cloverPoint.amount.sum().coalesce(0), member.regDt, member.lastLoginTime) ) .from(cloverPoint) .rightJoin(member) .on(cloverPoint.memberId.eq(member.id)) .join(memberInformation) .on(member.memberInformation.id.eq(memberInformation.id)) .where( goeStartDateAndLoeEndDate(member.regDt, searchRequest.getRegStartDate(), searchRequest.getRegEndDate()) .and(goeStartDateAndLoeEndDate(member.lastLoginTime, searchRequest.getLastLoginStartDate(), searchRequest.getLastLoginEndDate())) .and(eqKeyword(searchRequest.getKeywordType(), searchRequest.getKeyword())) ) .groupBy(memberInformation.memberName, member.id, member.nickName, member.regDt, member.lastLoginTime) .having(goeMinCloverAmountAndLoeMaxCloverAmount(searchRequest.getMinCloverAmount(), searchRequest.getMaxCloverAmount())) .orderBy(member.regDt.desc()) .offset(pageable.getOffset()) .limit(searchRequest.getSize()) .fetch(); private BooleanExpression goeMinCloverAmountAndLoeMaxCloverAmount(int minCloverAmount, int maxCloverAmount) { if (maxCloverAmount == 0) { return null; } return cloverPoint.amount.sum().coalesce(0).goe(minCloverAmount) .and(cloverPoint.amount.sum().coalesce(0).loe(maxCloverAmount)); }위와 같이 Repository에서 데이터를 조회하고 있습니다. 페이징을 처리해야 하는 로직이라 PageableExecutionUtils를 활용하여 Page 객체를 만들어 사용하려고 하는데 group by + having 절을 활용하는 경우 countQuery를 어떤 식으로 구현해야 할지 모르겠습니다... ㅠㅠ단순 SQL인 경우 인라인뷰를 활용하여 조건에 부합하는 count를 가져오겠는데 querydsl에서 인라인뷰는 지원하지 않는다고 알고 있습니다.다른 방식으로 contents.size()를 넘겨서 처리할까 싶었지만 이게 최선인지 잘 모르겠기에 영한님은 이런 경우 어떤식으로 로직을 처리하시는지 알고 싶습니다!!감사합니다!
- 미해결실전! Querydsl
on join 을 사용할 경우 select 에 하나의 객체만 넣으면 안되나요?
@Test public void join_on() { List<Tuple> result = query .select(member, team) .from(member) .leftJoin(member.team, team) .on(team.name.eq("teamA")) .fetch(); for (Tuple tuple : result) { System.out.println(tuple); } }이게 강사님께서 설명해주신 코드입니다. 이렇게 조회하게 되면 정상적으로 tuple 에 team name 이 "teamA" 것만 포함됩니다.근데 여기서 select 에 member 만 추가하게 되면 다음과 같습니다.@Test public void select_one() { List<Member> result = query .selectFrom(member) .leftJoin(member.team, team) .on(team.name.eq("teamA")) .fetch(); for (Member member1 : result) { System.out.println(member1); System.out.println(member1.getTeam()); } }이럴 경우 member getTeam 을 통해 team 을 확인하면 "teamB" 인 team도 포함되어 있습니다. 왜 이렇게 되는지 궁금해서 sql 을 봤는데 순서대로 아래가 강사님이 짜주신 select(member, team) 으로 발생한 sql 이고select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username, t1_0.team_id, t1_0.name from member m1_0 left join team t1_0 on t1_0.team_id=m1_0.team_id and t1_0.name=? 아래가 제가 임의로 짠 select(member) 만 해서 발생한 sql입니다.select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0 left join team t1_0 on t1_0.team_id=m1_0.team_id and t1_0.name=?보면 select 하는 부분만 다르고 left join 하는 부분은 완벽하게 같은데.. 왜 위의 코드로 실행하면 정상적으로 teamA 만 join 되고 아래 코드로 실행하면 teamB까지 join 되는 건가요..?
- 해결됨실전! Querydsl
이런식으로 sort 적용하는 것도 문제가 없을까요?
OrderSpecifier 클래스를 사용해서 정렬을 적용해보려 했으나블로그 글마다 너무다 제각각이고 상세한 설명을 찾기가 힘들어방법을 고민하던 중 다음과 같은 방법으로 정렬을 적용해서 postman으로 get 요청을 해보니 정상적으로 정렬이 동작하는 것을 확인했는데요.제가 적용한 방법을 설명하면 다음과 같습니다.- 요청 응답 구조는 강의와 같이 controller <-> Repository 구조로 만들었습니다.먼저 컨트롤러가 /search로 Get 요청을 받으면 Repository에서 MemberTeamDto가 아닌 Member 엔티티를 반환받고 컨트롤러에서 MemberTeamDto로 변환하여 반환하였습니다.이런식으로 해서 요청을 하니 제가 적용한 나이 기준 내림차순이 적용되는 것을 확인했는데이 방법으로 정렬을 적용해도 문제가 없을까요 ?? controller @GetMapping("/search") public Page<MemberTeamDto> searchPageOrder(MemberSearchCondition condition, Pageable pageable) { Page<Member> members = memberRepository.searchPageOrder(condition, pageable); List<MemberTeamDto> content = members.getContent().stream() .map(member -> new MemberTeamDto( member.getId(), member.getUsername(), member.getAge(), (member.getTeam() != null) ? member.getTeam().getId() : null, (member.getTeam() != null) ? member.getTeam().getName() : null) ) .collect(Collectors.toList()); return new PageImpl<>(content, pageable, members.getTotalElements()); } Repository @Override public Page<Member> searchPageOrder(MemberSearchCondition condition, Pageable pageable) { List<Member> content = queryFactory .selectFrom(member) .leftJoin(member.team, team) .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .orderBy(member.age.desc()) // orderBy를 사용한 id 기준 내림차순 정렬 .fetch(); JPAQuery<Long> countQuery = queryFactory .select(member.count()) .from(member) .leftJoin(member.team, team) .where(usernameEq(condition.getUsername()), teamNameEq(condition.getTeamName()), ageGoe(condition.getAgeGoe()), ageLoe(condition.getAgeLoe())); return PageableExecutionUtils.getPage(content, pageable, () -> countQuery.fetchOne()); }
- 미해결실전! Querydsl
sort관련 질문드립니다.
직접 파라미터를 받아 처리하는걸 권장 한다고 하셨는데 @Data public class MemberSearchDto { private String username; private String teamName; private Integer ageGoe; private Integer ageLoe; private String sort; private String orderBy; } sort=desc; orderby=username 으로 값을 받는다면 .orderBy(addSort(searchDto.getSort(),searchDto.getOrderBy())) private OrderSpecifier<?> addSort(String sort, String orderBy) { if(StringUtils.hasText(sort) && StringUtils.hasText(orderBy) && (sort.equals("desc") || sort.equals("asc"))){ if(orderBy.equals("username")){ return sort.equals("desc") ? member.username.desc() : member.username.asc(); } } return member.age.desc(); } 이런식으로 처리하면 되는지 궁금합니다.
- 미해결실전! Querydsl
데이터 조회에 대해서 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]entity로 반환 후에 DTO에 맵핑하는 방식이 쯤 더 효과적인지 아니면 DTO프로젝션으로 진행하는게 효과적인지가 궁금합니다.아니면 상황에 따라서 적절하게 쓰는게 좋다면 어떠한 상황인지 궁금합니다.
- 미해결실전! Querydsl
한 테이블 내 같은 컬럼 여러개 or 처리
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요, 강의를 듣다 궁금한게 생겨 질문드립니다..! '/filter?price=중저가라인,고가라인'처럼 url로 넘어온 price인자 String을 ,단위로 쪼개 List에 넣은 뒤 쿼리를 짜기를 원합니다. 현재 select * from table where price = '중저가라인' or price = '고가라인'; 과 같은 쿼리를 원합니다. 여기서 고가라인이 동적으로 조건에 포함될 수도 있고 안될 수도 있는 상황입니다. 어떤식의 로직이 필요한지 설명을 부탁드려도 될까요?