묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결그로스해킹 - 데이터와 실험을 통해 성장하는 서비스를 만드는 방법
[2-2-1 강의] CAC / LTV 질문
안녕하세요. [2-2-1] 강의를 듣고 질문 남깁니다.CAC , LTV를 배웠는데요,CAC < LTV여야하고, 그리고 각 채널/소스 별로 쪼개서 판단해야한다고 하는데, 현업에서 판단하는 프로세스는 그럼 아래와 같은 걸까요? 1) 네이버 / 다음 / 구글에 페이드 마케팅을 4:3:3 비율로 태웠다. 2) 1개월 기준으로 잡고, 각각의 CAC 대비 LTV를 보니, 네이버 > 구글 > 다음 순으로 효율이 우수하다.3) 네이버 매체에 조금 더 증액을 하고 나머지 매체는 감액한다. 여기서 나오는 궁금증은,1) 우선 위와 같은 프로세스로 현업 진행하는지,2) 이 부분은 퍼포먼스 마케팅 부분인데 , 결국 그로스 해킹의 한 단계(Acquisition)로 퍼포먼스 마케팅을 보면 되는 것일까요?3) 실무적인 관점에서, 성과 측정을 진행할 때 기간 책정을 어떻게 하는 것인지? (1개월이라면 1개월의 기준은 보통 어떤 것들이 있는지, 상시로 보통 페이드마케팅을 진행하는 경우는 어떻게 봐야할지) 가 궁금합니다. 질문이 길어졌는데 회신 주시면 감사하겠습니다!
-
미해결아마존 클라우드 무료계정으로 시작하는 서버리스 애플리케이션 프로젝트
API Gateway 학습에서 CORS에러가 계속 뜬다면 보세요.
이번 검색을 통해 알게 되었는데 lambda에 header를 추가적으로 넣어야 하더군요. 아마 Nodejs 버전 문제같기도 한데 "Access-Control-Allow-Headrs": "Content-Type","Access-Control-Allow-Origin": "*","Access-Control-Allow-Methods": "OPTIONS, POST, GET"을 추가해보세요.
-
미해결스프링 시큐리티
WebSecurityConfigurerAdapter confiture 메서드의 http 파라미터의 역할
안녕하세요 선생님, 강의를 복습중에 질문이 있습니다.WebSecurityConfigurerAdapter 의 configure 메서드 에서 http 파라미터로 설정 작업을 진행하는데 있어 사용자의 설정이 어떻게 filterChanigProxy 의 필터들의 목록을 바꾸는지가 궁금합니다.파라미터의 HttpSecurity 타입의 http 파라미터는 사용자가 설정 후 빈으로 등록되어있나여?또한 HttpSecurity 타입의 빈을 사용자가 설정하는데 있어 해당 빈이 어떻게 필터체인에 구성될 필터들의 요소를 바꿔주나요?감사합니다.
-
해결됨실전! 스프링 데이터 JPA
자식 컬렉션 Order by 질문 사항있습니다
안녕하세요 JPA 수강하면서 현업에적용하고있는데 질문사항 있어 글을 남깁니다.store -< events 1:N 관계에 있어가게들중 이벤트를 최근에 생성한 가게들 우선순위로 가게 리스트를보여주고 싶지만 이벤트랑 조인할 경우 이벤트들이 여러개가 나와가게에 @OneToMany events 최근 생성된 데이터가 있을경우 가게를 위로 올리고싶은데방법이 있을까요 ?그리고 Store-< Events 에서 이벤트가 끝난 데이터들은 List 제외 시키고 싶은데mapping 할때 조건을 넣어서 따로 걸러야 하는 부분인가요 ?조건을 걸기위해 조인 하는순간 row수가 배가 되어원하는 list값만 가지고 오기가 어렵네요 위 내용과 상관없이 궁금사항 하나 더 남깁니다.위경도 좌표 거리 기반으로 가게를 보여주고 싶으나jpa에선 쉽지않아 nativeQuery(mysql 8.0) 로 작성 하여 interface로 매핑후 다시 dto로 가공 해서반환값을 주는데 다른 방법이 있는지 궁금 합니다. 추가 질문사항입니다. nativeQuery로 위경도 가까운 거리 계산 하여 리스트 생성하여 가게 인덱스에 담고 jpa findAllByIdx in :list 로 가게 관련 정보를 추출하였으나 자동 정렬되어 가까운 거리 순으로 리스트가 안만들어지는데 이럴때는 jdbc로 구현해야 하나요 ?? 페이징 처리까지 하려니 가급적이면 jpa를 쓰려고하는데 자동정렬 해제-> in 절 순서대로 넣은값으로 출력이 안되나요 ?조언 부탁드립니다. 감사합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
2022 visual studio에서 새 프로젝트 생성시 콘솔앱 .NET과 .NET Core의 차이
2022 visual studio에서 새 프로젝트를 생성하고 있는데여기 보시면 강의에서는 .NET Core에서 실행할 수 있는 명령줄로 되어 있는데 보시는 바와 같이 .NET이라고 되어 있습니다. 어떤 차이가 있을까요?
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
textview에 이미지 삽입하고 이미지만 클릭가능하게만들기
<TextView android:id="@+id/tv_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:ellipsize="end" android:maxLines="1" android:padding="5dp" android:text="title" android:drawableRight="@drawable/ic_baseline_delete_24" android:drawablePadding="5dp" android:clickable="true" android:textSize="18sp" /> 이런식으로 하면 이렇게 처리가 되더라구요근데 저는 우측에 저 쓰레기통 눌렀을때만 액션이 발생했으면 좋겠는데 이런경우에는 어떻게 커스텀할수있나요?사실 그냥 이미지뷰 나눠서 넣으면 상관없긴한데 혹시 가능한가싶어서요
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
join fetch
n + 1 문제를 해결하기 위해 join fetch를 써야 하는걸로 배웠는데 inner join으로 해석이 되는 join fetch를 혹시 한 쿼리 안에서 여러번 쓸때 어떨때는 inner join으로 해석하고 어떨때는 outer join으로 해석하게 설정을 할 수 있나요? (inner join과 outer join을 쓰고 싶은데 join fetch를 여러번 쓸경우 inner join으로만 해석이 됩니다.)
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
OrderSearch 질문입니다.
안녕하세요.OrderSearch 클래스가 강의에서는 repository패키지내에 있는데강의 자료에는 package jpabook.jpashop.domain; 로 되어있어요 보통 실무에서는 OrderSearch같은 검색조건 관련 클래스를 어느 패키지에 두나요?검색조건 관련된 것들까지 전부 도메인패키지에 넣으면 뭔가 이상한것같기도하고..근데 리포지토리는 데이터를 crud하는 용도로만 쓰는것 같아서 여기도 아닌것같고.. 답변 부탁드립니다.
-
미해결HTML+CSS+JS 포트폴리오 실전 퍼블리싱(시즌2)
이미지 파일 어디서 다운받나요..?
네이버 회원가입 폼 만드는 강의를 보니 파비콘, 네이버로고, 비밀번호 확인 아이콘등 이미지가 쓰이는데 어디서 다운로드 해야하는지 안보여요. 파일이 누락되어있는 강의가 많은 것 같습니다ㅠㅠ
-
미해결따라하며 배우는 NestJS
저는 왜 import가 자동으로 되지 않을까요?
혹시 관련 모듈이나 단축키가 있을까아ㅛ?이번 강의에서는 BaseEntity가 영상에서 보면 자동으로 import가 되던데 저는 되지 않습니다;
-
미해결HTML+CSS+JS 포트폴리오 실전 퍼블리싱(시즌2)
클립패스 오버레이 그림자 질문이요!
hexagon에 transition: 0.5s를 줘서hexagon에 hover를 할때 hexagon이 움직이고 그림자가 입체감있게 줄어들었음 좋겠는데요.그림자가 이상하게 움직입니다..ㅠㅠ.hexagon:hover::before { bottom: -130px}여기에 문제가 없는 것 같은 게..hexagon에 transition을 빼면 그림자 높이가 정상적으로 작동해요.왜 이런걸까요?코드 첨부합니다..<index.html><!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="style.css"> </head> <body> <div class="frame"> <div class="hexagon"> <div class="shape"> <div class="caption"> <h2>EAU ROSE</h2> <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Amet, similique.</p> </div> <img src="images/01img.jpg" alt=""> </div> </div> <div class="hexagon"> <div class="shape"> <div class="caption"> <h2>DOSON</h2> <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Amet, similique.</p> </div> <img src="images/02img.png" alt=""> </div> </div> <div class="hexagon"> <div class="shape"> <div class="caption"> <h2>EAU DES SENS</h2> <p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Amet, similique.</p> </div> <img src="images/03img.png" alt=""> </div> </div> </div> </body> </html><style.css>/* Google Web Font */ @import url('https://fonts.googleapis.com/css?family=Montserrat:300,400,500&display=swap'); *{ box-sizing: border-box; } body{ margin: 0; font-family: 'Montserrat', sans-serif; color: #333; display: flex; justify-content: center; align-items: center; height: 100vh; } .frame { display: flex; gap: 40px; } .hexagon { width: 400px; height: 450px; position: relative; transition: 0.5s; } .shape { clip-path: polygon(50% 0, 100% 25%, 100% 75%, 50% 100%, 0 75%, 0 25%); width: inherit; height: inherit; position: absolute; } .shape img { width: inherit; height: inherit; object-fit: cover; } .hexagon .caption { position: absolute; width: inherit; height: inherit; color: #fff; transition: 0.5s; display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; padding: 20px; opacity: 0; transform: translateY(20px); } .hexagon .caption h2 { font-size: 2em; } .hexagon:nth-child(1) .caption{ background: linear-gradient(to top, rgb(165, 42, 83), transparent); } .hexagon:nth-child(2) .caption{ background: linear-gradient(to top, rgb(42, 118, 165), transparent); } .hexagon:nth-child(3) .caption{ background: linear-gradient(to top, rgb(165, 165, 42), transparent); } .hexagon:hover .caption { opacity: 1; transform: translateY(0); } .hexagon:hover { transform: translateY(-60px); } .hexagon::before{ content: ''; position: absolute; width: 100%; height: 60px; background-color: black; background: radial-gradient(rgba(0, 0, 0, 0.44),transparent, transparent); bottom: -70px; } .hexagon:hover::before { opacity: 0.6; transform: scale(0.8); bottom: -130px; }
-
미해결스프링 시큐리티
spring mvc설정으로 인한 controller-mapping error
spring mvc방식으로 구현해보고 있는데 권한 인증인 403에러는 잘뜹니다. 하지만 controller를 통해서 들어가면 404에러가 뜹니다. 관련되서 질문드립니다.@RestControllerpublic class AdminController { @GetMapping("/admin") public String admin() { return "admin"; }} xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:security="http://www.springframework.org/schema/security" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd "> <security:http auto-config="true" use-expressions="false"> <security:intercept-url pattern="/**" access="ROLE_ADMIN"/> <security:form-login/> </security:http> <security:authentication-manager> <security:authentication-provider> <security:user-service> <security:user name="admin" password="{noop}1234" authorities="ROLE_ADMIN, ROLE_USER"/> <security:user name="user" password="{noop}1234" authorities="ROLE_USER"/> </security:user-service> </security:authentication-provider> </security:authentication-manager> <mvc:resources mapping="/jsp/**" location="/jsp/"></mvc:resources> <context:annotation-config/> <context:component-scan base-package="com.test"/> <mvc:annotation-driven /> <mvc:default-servlet-handler/> <bean id="viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean></beans> web.xml <?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring/context-spring.xml </param-value> </context-param> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/context-spring.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app> 접속 404오류 로그 DEBUG [FilterChainProxy] - Securing GET /adminDEBUG [HttpSessionSecurityContextRepository] - Retrieved SecurityContextImpl [Authentication=UsernamePasswordAuthenticationToken [Principal=org.springframework.security.core.userdetails.User [Username=admin, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, credentialsNonExpired=true, AccountNonLocked=true, Granted Authorities=[ROLE_ADMIN, ROLE_USER]], Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=B6D437E830FDEBF274A77AF35C51A114], Granted Authorities=[ROLE_ADMIN, ROLE_USER]]]DEBUG [SecurityContextPersistenceFilter] - Set SecurityContextHolder to SecurityContextImpl [Authentication=UsernamePasswordAuthenticationToken [Principal=org.springframework.security.core.userdetails.User [Username=admin, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, credentialsNonExpired=true, AccountNonLocked=true, Granted Authorities=[ROLE_ADMIN, ROLE_USER]], Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=B6D437E830FDEBF274A77AF35C51A114], Granted Authorities=[ROLE_ADMIN, ROLE_USER]]]DEBUG [FilterSecurityInterceptor] - Authorized filter invocation [GET /admin] with attributes [ROLE_ADMIN]DEBUG [FilterChainProxy] - Secured GET /adminDEBUG [DispatcherServlet] - GET "/admin", parameters={}DEBUG [SimpleUrlHandlerMapping] - Mapped to org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler@8c32dcDEBUG [DispatcherServlet] - Completed 404 NOT_FOUNDDEBUG [SecurityContextPersistenceFilter] - Cleared SecurityContextHolder to complete request
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
jupyter notebook이 실행 되지않아요 ㅠㅠ
안녕하세요수업에 맞게 jupyter notebook을 설치하고 실행했는데 오류가 발생합니다.구글링을 해봐도 찾기가 어려워서 질문남깁니다도와주세요~~ (askcompany) C:\Dev\askcompany>jupyter notebook[I 15:02:17.522 NotebookApp] Copying C:\Users\skseo/.ipython\nbextensions -> C:\Users\skseo\AppData\Roaming\jupyter\nbextensionsTraceback (most recent call last): File "C:\ProgramData\Anaconda3\envs\askcompany\Scripts\jupyter-notebook-script.py", line 10, in <module> sys.exit(main()) File "C:\ProgramData\Anaconda3\envs\askcompany\lib\site-packages\jupyter_core\application.py", line 269, in launch_instance return super().launch_instance(argv=argv, **kwargs) File "C:\ProgramData\Anaconda3\envs\askcompany\lib\site-packages\traitlets\config\application.py", line 845, in launch_instance app.initialize(argv) File "C:\ProgramData\Anaconda3\envs\askcompany\lib\site-packages\traitlets\config\application.py", line 88, in inner return method(app, args, *kwargs) File "C:\ProgramData\Anaconda3\envs\askcompany\lib\site-packages\notebook\notebookapp.py", line 2141, in initialize super().initialize(argv) File "C:\ProgramData\Anaconda3\envs\askcompany\lib\site-packages\traitlets\config\application.py", line 88, in inner return method(app, args, *kwargs) File "C:\ProgramData\Anaconda3\envs\askcompany\lib\site-packages\jupyter_core\application.py", line 244, in initialize self.migrate_config() File "C:\ProgramData\Anaconda3\envs\askcompany\lib\site-packages\jupyter_core\application.py", line 174, in migrate_config migrate() File "C:\ProgramData\Anaconda3\envs\askcompany\lib\site-packages\jupyter_core\migrate.py", line 225, in migrate if migrate_one(src, dst): File "C:\ProgramData\Anaconda3\envs\askcompany\lib\site-packages\jupyter_core\migrate.py", line 129, in migrate_one return migrate_dir(src, dst) File "C:\ProgramData\Anaconda3\envs\askcompany\lib\site-packages\jupyter_core\migrate.py", line 93, in migrate_dir shutil.copytree(src, dst, symlinks=True) File "C:\ProgramData\Anaconda3\envs\askcompany\lib\shutil.py", line 368, in copytree raise Error(errors)shutil.Error: [('C:\\Users\\skseo/.ipython\\nbextensions\\A71A7URN.XLSX', 'C:\\Users\\skseo\\AppData\\Roaming\\jupyter\\nbextensions\\A71A7URN.XLSX', "[Errno 2] No such file or directory: 'C:\\\\Users\\\\skseo/.ipython\\\\nbextensions\\\\A71A7URN.XLSX'")]
-
미해결공공데이터로 파이썬 데이터 분석 시작하기
데이터 프레임 슬라이싱
안녕하세요 선생님 혹시 데이터프레임 슬라이싱을 할때.loc 또는 .iloc 로 슬라이싱이 아닌df[A:B, C:D] 형식으로도 슬라이싱이 가능한 것인지 질문드립니다. 감사합니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
새로운 패키지가 생성되지 않아요
안녕하세요~!!이전에 질문 드렸었는데, 제가 드린 질문의 의도가 전달되지 않은것 같아서 다시 질문드립니다.https://www.inflearn.com/questions/679672종속의 비어 있는 2개의 패키지를 생성하려고 할 경우 생성되지 않습니다.ex) domain>member 패키지 생성하려고 할 경우(1) domain 패키지 생성(2) member패키지 생성 시도(3) 결과물 ->2개의 패키지가 아닌 하나의 패키지가 겹쳐서 생성?domain만들고 빈 dummy파일 만들고 member패키지 만들고 있는데 공부의 질이 떨어집니다 ㅠㅠㅠintellij cannot create package rename.. 이런식으로 google찾아보는데도 잘 안나와서요~ ㅠㅠㅠ인텔리제이 도움 부탁드립니다 ㅠㅠ
-
미해결[리뉴얼] 타입스크립트 올인원 : Part1. 기본 문법편
콜백함수 타입질문입니다.
5:35분에 콜백함수타입 지정하는부분에서function a4(a: () => void): void {} a4(() => { return "3";});타입스크립트 공부중인데 만약에 이렇게 콜백함수에 타입은 준다했을떄 함수의 인수로 a:() => void 이부분에서 a가 a4 ( ()=> { return '2'}) 이부분에서 ()=> { return '2'} 이거맞을까요?
-
미해결프론트엔드 날개달기: Vue, React 배우기 전에 꼭 알아야하는 지식
DOM(document object model)과 BOM(broswer object model)의 상관 관계
안녕하세요. dom과 bom의 상관 관계가 궁금해서 질문드립니다. dom은 자바스크립트의 내장객체로 자바스크립트를 이용해서 html의 요소(태그)에 접근이 가능하여 이를 이용해서 html이나 css내용등을 변경가능하게 해주는것으로 이해하고 있고 bom은 역시 자바스크립트의 내장객체로써 웹 브라우저와 관련된 객체의 집합으로서 각각 window, document, location, navigator, history, screen 등등이 정의 되어 있는데 이렇게 되면 bom안에 document 객체가 있음으로서 bom과 dom을 각각 따로 구분할것이 아니라 bom이 dom을 포함하는 개념인지 궁금합니다!
-
미해결Vue.js 중급 강좌 - 웹앱 제작으로 배워보는 Vue.js, ES6, Vuex
깃허브 권한 요청드립니다.
인프런 아이디 : megajsp01@gmail.com인프런 이메일 : megajsp01@gmail.com깃헙 아이디 : megajsp01@gmail.com깃헙 Username : megajsp01
-
미해결딥러닝 CNN 완벽 가이드 - TFKeras 버전
기계가 w를 업데이트를 하는 과정
안녕하세요 선생님경사하강법,오차역전파, 편미분, 잔차에 대한 개념은 이해를 했으나 궁금한점이 있습니다기계가 예측오류를 줄이기 위해서 w업데이트를 하는 과정이 잘 이해가가 가지 않습니다예를 들어 가중치들이 초기값 으로 시작했고 나온 출력값과 실제값의 차이가 크면 가중치계수를 줄이고 늘리는 방식이 어떤 과정을 통해서 되는지 아직 잘 이해가 가지 않는데 조금 만 더 쉽게 설명해주실수 있나요?예) w0 = 1, w1 = 5 - > y_hat = 10이고 y = 15이면 5만 큼의 차이가 발생했는데 여기서 5를 줄이기 위해서 어떻게 w가 업데이트 되는지 이해가 가지 않습니다
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
postService 목록 조회 단위 테스트
당연히 구글링 해보셨져? 원하는 결과를 못찾으셨나요? 어떤 검색어를 입력했는지 알려주세문제가 발생한 코드(프로젝트)를 Github에 올리시고 링크를 알려주세요. 안녕하세요. 호돌맨님.postService에서 목록 조회하는 단위테스트에 대해서 질문이 있습니다. 먼저 목록 조회 코드부터 보여드리면postService.findPosts 는 postQueryRepository에 구현체로 만들었습니다.postService@Slf4j @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class PostService { public static final String ENTITY_NAME = "post"; private final PostQueryRepository postQueryRepository; private final PostRepository postRepository; /** * Post 목록 조회 */ public Page<Post> findPosts(PostSearchCondition condition, Pageable pageable) { return postQueryRepository.findPosts(condition, pageable); } }postQueryRepository@Repository public class PostQueryRepository { private final JPAQueryFactory queryFactory; public PostQueryRepository(EntityManager em) { this.queryFactory = new JPAQueryFactory(em); } /** * Post 목록 조회 */ public Page<Post> findPosts(PostSearchCondition condition, Pageable pageable) { List<Post> content = getPostList(condition, pageable); JPAQuery<Long> count = getPostListCount(condition); return PageableExecutionUtils.getPage(content, pageable, count::fetchOne); } /** * Post 목록 */ private List<Post> getPostList(PostSearchCondition condition, Pageable pageable) { return queryFactory .select(post) .from(post) .where( searchCondition(condition.getSearchCondition(), condition.getSearchKeyword()) ) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .orderBy(post.id.desc()) .fetch(); } /** * Post 목록 카운트 */ private JPAQuery<Long> getPostListCount(PostSearchCondition condition) { return queryFactory .select(post.count()) .from(post) .where( searchCondition(condition.getSearchCondition(), condition.getSearchKeyword()) ); } /** * where searchCondition LIKE '%searchKeyword%' */ private BooleanExpression searchCondition(SearchCondition searchCondition, String searchKeyword) { if (searchCondition == null || !hasText(searchKeyword)) { return null; } if (SearchCondition.TITLE.equals(searchCondition)) { return post.title.contains(searchKeyword); } else if (SearchCondition.CONTENT.equals(searchCondition)) { return post.content.contains(searchKeyword); } else { return null; } } } 다음은 테스트 코드입니다.postServiceTest@ExtendWith(MockitoExtension.class) class PostServiceTest { //CREATE_POST public static final String POST_TITLE = "post_title"; public static final String POST_CONTENT = "post_content"; //UPDATE_POST public static final String UPDATE_TITLE = "update_title"; public static final String UPDATE_CONTENT = "update_content"; //ERROR_MESSAGE public static final String ENTITY_NAME = "post"; public static final Long NOT_FOUND_ID = 1L; public static final String HAS_MESSAGE_STARTING_WITH = "존재하지 않는 "; public static final String HAS_MESSAGE_ENDING_WITH = "id = "; @InjectMocks PostService postService; @Mock PostQueryRepository postQueryRepository; @Mock PostRepository postRepository; private Post getPost(String title, String content) { return Post.createPostBuilder() .title(title) .content(content) .build(); } @Test @DisplayName("post 목록 조회") void findPosts() { //given List<Post> posts = new ArrayList<>(); for (int i = 0; i < 30; i++) { posts.add(getPost(POST_TITLE + i, POST_CONTENT)); } //검색 안먹힘 PostSearchCondition condition = new PostSearchCondition(); condition.setSearchCondition(SearchCondition.TITLE); condition.setSearchKeyword("0"); PageRequest pageRequest = PageRequest.of(0, 10); given(postQueryRepository.findPosts(condition, pageRequest)).willReturn(new PageImpl<>(posts)); //when Page<Post> contents = postService.findPosts(condition, pageRequest); //then assertThat(contents.getTotalElements()).isEqualTo(3); assertThat(contents.getContent().size()).isEqualTo(3); } } 여기서 findPosts 단위 테스트를 진행하려고 하는데요.목록을 30개를 만들고 검색조건과 페이지 정보를 파라미터로 넘겨서 검색이 된 결과가 나올것이라고 예상했지만 검색조건은 먹히지 않고 30개의 목록만 리턴이 됩니다. 전 검색 조건대로 "0"들어간 title만 검색이되어서contents.getTotalElements() == 3, contents.getcontent().size() == 3 으로 예상을 했는데contents.getTotalElements() == 30, contents.getcontent().size() == 30 로 결과가 나와 테스트에 실패하게됩니다. 구글링으로 mockito, page, test, querydsl, parameter 등 다양하게 검색 해봤는데 원하는 결과를 얻기 못해 질문 한번 드려봅니다. 혹시나 제가 잘못된 방향으로 테스트를 진행하고 있는건지 혹은 다른 방법이 있을지 궁금합니다!깃저장소도 같이 공유드립니다.https://github.com/heechul90/heech-heechlog-server