묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨PM을 위한 데이터 리터러시(프로덕트 데이터 분석)
지표 정의하기 연습 문제
먼저 올리신 분들이 없어서 너무 창피하지만...열심히 하겠다는 다짐을 지키기 위해 허접한 과제 제출해보겠습니다....ㅎ 1. 기능이 잘 작동하고 있는지 확인하려면?배달 서비스를 담당하는 PM입니다.배너 영역, 메뉴 카테고리, 이런 음식 어때요, 동네 맛집 기능이 잘 작동하고 있는지 확인하려면 어떤 지표를 확인해야 할까요?지표를 정의하고, 지표가 어떤 식으로 움직이면 잘 동작한다고 볼 수 있을까요?우선 저는 기본적으로 클릭률(버튼 클릭 수 / 버튼 노출 수)를 주요 지표로 삼았습니다. 다소 뻔할 수는 있지만 기능들의 클릭률이 올라간다면 해당 기능들이 유저들의 어플 사용에 이용되고 있다는 것을 어느정도 예상할 수 있다고 생각했기 때문입니다.또 다른 지표로는 유저가 메인화면 진입 후 최초로 클릭한 기능의 비중을 살펴보는 것이 좋을 것 같다고 생각했습니다. 예를 들어서, 이렇게 해보면 좋을 것 같다는 생각이 들었습니다.우리 어플의 어떤 기능이 유저들에게 직관적으로 잘 어필될까?'앱 최초 사용자들이 메인화면 진입 후 최초로 클릭한 기능'어떤 기능이 인기가 많을까?, 어떤 기능을 통해 우리 어플이 유저의 생활에 자리 잡고 있을까?'기존 유저들이 메인화면 진입 후 최초로 클릭한 기능'만일 이번 프로젝트에서 배너 영역에 대한 관심을 올리고자 노력했다면'유저 메인화면 진입 후 배너 영역을 최초로 클릭하는 유저들의 비중'과 같은 지표를 일정 수치 이상으로 올리는 것을 목표로 삼는 것도 좋을 것 같습니다. 그리고 문제에서는 '검색'기능을 언급하지 않으신 걸로 보아 검색기능을 제외한 홈화면의 주요 기능들의 작동성이 알고 싶은 상황인 것 같습니다. 따라서 추가적으로 주문까지 전환이 완료된 건에 대해서 고객 여정이 '검색'으로 시작되었는지, 혹은 문제에서 말하는 '홈화면 기능'으로 부터 시작 되었는지에 대해서 해당 비중을 지표로 삼는 것도 중요하다고 생각했습니다. 2. 검색 만족도 지표배달 서비스를 담당하는 PM입니다.고객이 검색 기능에 만족했는지 확인하려면 어떤 지표를 봐야할까요?검색하는 흐름을 떠올려보면서 그 안에 있는 이벤트를 조합해보세요고객이 '검색을 통해 원하는 정보를 얻었는가?'를 구현하고 있는지를 알아보는 것이 중요하다고 생각했습니다.따라서 '일별 검색 기능을 수행한 사람 중 검색 결과를 클릭한 사람 수의 비율'(검색 결과 클릭률)을 지표로 삼겠습니다.사실 검색 기능도 최종 전환을 위해 존재하는 것이기 때문에당일 검색 기능을 사용해본 사람들을 대상으로(중요)'검색 기능을 통해 주문한 수 / 홈화면 기능을 통해 주문한 수'를 지표로 삼고 확인해볼 것 같습니다.검색 기능을 사용했는데도, 굳이 홈화면으로 나가서 카테고리 버튼을 통해 주문한다는 것은 '검색 결과가 마음에 들지 않는다.'를 방증하는 셈이라고 생각하기 때문입니다. 3. 검색 필터 기능의 활성화 지표배달 서비스를 담당하는 PM입니다.검색 필터 기능은 잘 사용되고 있을까요? 필터 기능의 활성화 지표를 정의하면 어떻게 할 수 있을까요?검색 필터를 사용하는 흐름을 떠올려보면서, 그 안에 있는 이벤트를 조합해보세요총 세가지 스텝을 거쳐야 한다고 생각한다.필터 활성화 건 수 / 총 검색 결과 클릭 건 수 를 살펴보며 검색 결과에 검색 필터 기능이 좋은 영향을 끼쳤을 지에 대해서 예상해본다.위의 지표가 예상 값 이상으로 나왔다면, 검색 결과 클릭으로 이어진 건에서 '어떤 필터가 높은 비중을 차지하고 있는가?'에 대해서 알아보기 위해 적용된 필터 count를 내림차순으로 확인해본다.검색 결과 클릭에 가장 큰 영향을 미치는 것을 보이는 필터를 자동 적용 하거나, 검색 필터 UI를 비중이 높은 순으로 배치하는 것도 좋을 것이라고 생각한다. 4. 검색 필터 기능의 활성화 지표배달 서비스를 담당하는 PM입니다.배달 서비스에서 가장 중요한 지표는 무엇일까요? 왜 그 지표가 중요할까요?그것을 어떻게 개선할 수 있을까요?한국 시장의 상황을 생각해보았다.코로나 이후 배달의 민족 매출 상승에도 불구하고 순이익 하락이 심해진 이유는 바로 외주 용역비(배달 비용) 때문이다. 배민원과 쿠팡잇츠의 단건배송에 대한 눈 먼 시장 점유 싸움으로 인해서 결론적으로는 라이더 들의 인건비만 늘어났다고 볼 수 있다.따라서 현재 한국 배달서비스에서 가장 중요하다고 생각하는 output 지표는 매출이 아닌 '순이익'이라고 생각한다. 순이익은 매출-비용이기 때문에, 매출은 올리고 비용을 낮추는 것을 구현해야 한다.(당연한 말이다)어떤 부분에서 매출을 늘려야 하는가? 에 대해서 생각해 봤을 때는 답은 바로 '부가 서비스'인 것 같다.이 상태로 배달서비스에 힘쓴다면 인해 매출은 늘지만, 외주 용역비 역시 더 큰 폭으로 늘어날 것이기 때문이다.따라서 배달 서비스로 고객 리텐션을 잡되, 기존 고객들의 부가 서비스 이용으로의 확장이 현재로서는 가장 중요하지 않을까 생각한다. 실제로 배민은 퀵커머스 시대를 열고자 하는 노력을 들이고 있고 '배쇼라', 'B마트', '전국 별미' 등의 다양한 서비스를 추진 중이다.따라서 순이익을 위한 input 지표 중 하나로는 '기존 고객의 부가서비스 유입률'(기존 고객 중 부가서비스 유입 고객 수 / 부가서비스 미사용 기존 고객 수)로 정하고, 부가 서비스별 리텐션을 높이기 위한 노력을 들여야 한다고 생각한다. 5. 추천 알고리즘의 성능 지표여러분은 이커머스 서비스에서 추천 알고리즘을 만드는 조직의 PO입니다.추천 알고리즘은 유저의 정보와 유저 로그를 토대로 구매할 것 같은 제품을 보여줍니다.추천 알고리즘의 성능을 확인하기 위해 어떤 지표를 파악해야 할까요? 왜 해당 지표일까요?우선 직관적으로 확인하기 위해서는 추천 알고리즘의 결과 클릭률을 검토하며, '사용자의 니즈에 맞는 상품을 추천하는가?'를 잘 구현했는지를 확인할 것 같습니다. 해당 지표가 높게 나온다면 추천 제품이 사용자의 관심을 끌었다는 것을 나타낼 수 있다고 생각하기 때문입니다.더 나아가서는 추천 알고리즘을 타고 상품페이지에 들어온 유저 전환율(CVR)이 일반적인 유입의 경우와 비교했을 때 더 나은 수치를 보이는가?를 비교해볼 것 같습니다.이 지표가 '알고리즘의 성능'을 나타내기에 다소 부적합하다고 판단되면, 상품 구매건을 대상으로 유저 접속부터 구매까지 걸린 고객 여정 시간을 지표로 삼겠습니다.이후에 추천을 통해 들어왔을 때와 일반적인 유입으로 들어왔을 때의 지표를 비교해 전자가 더 높게 나타난다면 '추천 알고리즘이 적합한 추천 상품을 통해 고객의 구매 여정 원활화에 도움을 주었다.' 라고 판단할 수 있을 것 같습니다. 6. 여러분들이 자주 사용하는 서비스의 지표여러분들이 자주 사용하는 서비스에서 가장 중요한 지표는 무엇일까요? 왜 해당 지표가 제일 중요할까요? 그 외 확인해야 하는 지표를 2개 더 뽑아본다면 무엇이 있을까요?YOUTUBE가장 중요한 지표기존 구독자 유지율(구독 Retention)이유매출의 주요 원인이기 때문따라서 구독자 수를 유지+증가시키는 것이 가장 중요하다고 생각하며, 구독자 수는 어떤 시도를 하더라도 떨어져서는 안됨(가드레일 지표)구독자가 떨어진다는 것은 '구독'의 차별성이 희미해졌다는 것을 말해준다고 생각.(제품성 하락)보조 지표무과금 -> 신규 구독자 CVR신규구독자 / 구독 취소자 --> '1 이상'을 유지하는 것이 중요하다고 생각유튜브 프리미엄 기한에 취소하는 유저들을 집중 공략이유CVR을 높여 NU를 늘리고, 유지하는 것이 가장 이상적인 그림이라고 생각구독 취소자(제품 실망자)보다 신규 구독자(제품 흥미자)의 수를 더 많게 하는 노력이 차후 retention에 도움이 될 것이라고 생각 7. 퍼널 개선 프로젝트여러분들은 가입 퍼널을 개선하라는 미션을 받았습니다.현재 가입 퍼널 프로세스의 전환율은 약 20%며 가입 퍼널에서 온보딩을 더 진행하는 기능을 만들었습니다. 온보딩의 효과를 파악하려면 어떤 지표를 봐야할까요?개선 전후 동일 기간의 '가입완료/유입' 지표를 비교한다. (변수 통제 최대한 필수)또한 온보딩 자체에도 체류 구간, 이탈 구간이 있을 것이기 때문에온보딩 구간별 Funnel을 구성하여, 데이터를 측정해 전환율이나 체류율이 가장 도드라지는 부분의 프로세스를 고쳐보는 식으로 진행해볼 것 같다. 배운 부분에 대해 최대한 생각하면서 했는데 놓친 것들 역시 많은 것 같습니다... 자신 없지만 먼저 이렇게 올려봄으로써 저 이후로도 커뮤니티에 올려보는 분들이 많았음 좋겠네요!좋은 과제 내주셔서 감사합니다. 고민해보는 것 만으로도 즐거웠습니다. 강의 듣길 잘 한 것 같아요!
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
인증요청시 문의드립니다.
강의진행중 궁금한게 있어서 문의드렸습니다!강의중에 토큰이 탈취될수도 있다고하셔서 String jws = Jwts.builder() .setSubject(String.valueOf(userId)) .signWith(key) .setIssuedAt(new Date()) .compact();코드를 넣어주셨습니다. 매번 다른 accessToken값이 나올수 있도록이요! 그 결과 로그인 시마다 매번 다른 토큰값이 나오는데, 로그인을 하고나서 기존의 토큰값으로 /foo 메소드를 호출하여도 인증이 되는데 왜 그런걸까요??1. 로그인시 abc토큰이 나와서 abc토큰으로 /foo 컨트롤러를 호출함 인증됨2. 또 한번 로그인시 abcd토큰이 나옴. 그런데 이전 로그인 토큰이였떤 abc토큰으로 /foo 컨트롤러를 호출하여도 인증 성공됨.왜 그런지 궁금합니다!
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
MVC 패턴 적용 중 404 에러가 납니다. (/servlet-mvc/members/new-form)
강의 정보MVC 패턴 - 적용 (04 : 14)에러 내용http://localhost:8080/servlet-mvc/members/new-form 로 접근하니 다음과 같이 404 에러가 납니다.MvcMemberFormServlet 클래스는 오타가 있을 경우를 대비해 오류 발생 이후에는 강의 자료의 내용을 복사하여 가져왔습니다.MvcMemberFormServlet 클래스 내의 service 메서드가 실행되는지 확인하기 위해 System.out.println("MvcMemberFormServlet.service"); 명령어를 사용하였는데, 터미널에서는 출력되지 않습니다.접근 url도 index.html에서의 링크로 접근을 해서 오타는 없을 것 같습니다.http://localhost:8080/servlet-mvc/members/new-form 을 제외한 다른 url들은 전부 접근이 잘 되고 있습니다.아래는 프로젝트 환경과 소스 코드, 터미널 출력입니다!프로젝트 환경프로젝트 구조소스 코드webapp/WEB-INF/views/new-form.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!-- 상대경로 사용, [현재 URL이 속한 계층 경로 + /save] --> <form action="save" method="post"> username: <input type="text" name="username" /> age: <input type="text" name="age" /> <button type="submit">전송</button> </form> </body> </html>java/hello/servlet/web/servletmvc/MvcMemberFormServletpackage hello.servlet.web.servletmvc; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form") public class MvcMemberFormServlet extends HttpServlet { @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("MvcMemberFormServlet.service"); String viewPath = "/WEB-INF/views/new-form.jsp"; RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath); dispatcher.forward(request, response); } }터미널 출력"C:\Program Files (x86)\Java\jdk-17.0.2\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1\lib\idea_rt.jar=57706:C:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\User\source\BackEnd\study\스프링MVC1\servlet\servlet\build\classes\java\main;C:\Users\User\source\BackEnd\study\스프링MVC1\servlet\servlet\build\resources\main;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.projectlombok\lombok\1.18.26\8f8cf0372abf564913e9796623aac4c8ea44025a\lombok-1.18.26.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-web\2.7.9\e745a069e2b7ca51e378fcbc397d14dd82178199\spring-boot-starter-web-2.7.9.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.apache.tomcat.embed\tomcat-embed-jasper\9.0.71\7ea76096eda4d1847fd50d985b1d26fa36a9822a\tomcat-embed-jasper-9.0.71.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\javax.servlet\jstl\1.2\74aca283cd4f4b4f3e425f5820cda58f44409547\jstl-1.2.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-json\2.7.9\671b3611eeb2fb315281ae17242ef082666e4262\spring-boot-starter-json-2.7.9.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter\2.7.9\19f855d327f68690cf630698e4e41c3afe134a83\spring-boot-starter-2.7.9.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-tomcat\2.7.9\a1076e6ffa1d771d3ccd18e72280317a152323e8\spring-boot-starter-tomcat-2.7.9.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework\spring-webmvc\5.3.25\62a8258bcc4f7a58dd69af5140481b64653c90\spring-webmvc-5.3.25.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework\spring-web\5.3.25\c69815e7931cd3ce7f19cc8028fd1c36626120d6\spring-web-5.3.25.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.apache.tomcat.embed\tomcat-embed-core\9.0.71\adaed61b4eaa5b52448336c0881fcd828fd51a2f\tomcat-embed-core-9.0.71.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.apache.tomcat.embed\tomcat-embed-el\9.0.71\8fe43848c27ec921c8c5d6dcbd8b959076d7bf99\tomcat-embed-el-9.0.71.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.eclipse.jdt\ecj\3.26.0\4837be609a3368a0f7e7cf0dc1bdbc7fe94993de\ecj-3.26.0.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.datatype\jackson-datatype-jsr310\2.13.5\8ba3b868e81d7fc6ead686bd2353859b111d9eaf\jackson-datatype-jsr310-2.13.5.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.module\jackson-module-parameter-names\2.13.5\a401a99e7a45450fd3ef76e82ba39005fd1a8c22\jackson-module-parameter-names-2.13.5.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.datatype\jackson-datatype-jdk8\2.13.5\1278f38160812811c56eb77f67213662ed1c7a2e\jackson-datatype-jdk8-2.13.5.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-databind\2.13.5\aa95e46dbc32454f3983221d420e78ef19ddf844\jackson-databind-2.13.5.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-autoconfigure\2.7.9\849b238dd024101cad8d107b4a8b0906f75003d5\spring-boot-autoconfigure-2.7.9.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot\2.7.9\788d60e73e0f7bbbf11b30c3fb0a9cbaa073446b\spring-boot-2.7.9.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-logging\2.7.9\4b1afa6083581924606c7cc892933b63ec5810d3\spring-boot-starter-logging-2.7.9.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\jakarta.annotation\jakarta.annotation-api\1.3.5\59eb84ee0d616332ff44aba065f3888cf002cd2d\jakarta.annotation-api-1.3.5.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework\spring-core\5.3.25\85382e86321227506bf7f97ed80e2ab88bce25f0\spring-core-5.3.25.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.yaml\snakeyaml\1.30\8fde7fe2586328ac3c68db92045e1c8759125000\snakeyaml-1.30.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.apache.tomcat.embed\tomcat-embed-websocket\9.0.71\987b6460af04b08bc9914788d2762080afb09541\tomcat-embed-websocket-9.0.71.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework\spring-context\5.3.25\268a70ce4f44333ce0f13304c5f8c53b3df5f5f4\spring-context-5.3.25.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework\spring-expression\5.3.25\d681cdb86611f03d8ef29654edde219fe5afef1d\spring-expression-5.3.25.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework\spring-aop\5.3.25\722e30759b29331726f9deed76f80b22345ee627\spring-aop-5.3.25.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework\spring-beans\5.3.25\b3aeae036b4ea1abfa1f9604d452e19664efe5f6\spring-beans-5.3.25.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.apache.tomcat\tomcat-annotations-api\9.0.71\898ad20682cb807f734e600ba224d6a3eecaedbc\tomcat-annotations-api-9.0.71.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-annotations\2.13.5\136f77ab424f302c9e27230b4482e8000e142edf\jackson-annotations-2.13.5.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\com.fasterxml.jackson.core\jackson-core\2.13.5\d07c97d3de9ea658caf1ff1809fd9de930a286a\jackson-core-2.13.5.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-classic\1.2.11\4741689214e9d1e8408b206506cbe76d1c6a7d60\logback-classic-1.2.11.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-to-slf4j\2.17.2\17dd0fae2747d9a28c67bc9534108823d2376b46\log4j-to-slf4j-2.17.2.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.slf4j\jul-to-slf4j\1.7.36\ed46d81cef9c412a88caef405b58f93a678ff2ca\jul-to-slf4j-1.7.36.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.springframework\spring-jcl\5.3.25\2e65a986dc7f98b40faed8df1d50db77c0b96c61\spring-jcl-5.3.25.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-core\1.2.11\a01230df5ca5c34540cdaa3ad5efb012f1f1f792\logback-core-1.2.11.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\1.7.36\6c62681a2f655b49963a5983b8b0950a6120ae14\slf4j-api-1.7.36.jar;C:\Users\User\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.17.2\f42d6afa111b4dec5d2aea0fe2197240749a4ea6\log4j-api-2.17.2.jar hello.servlet.ServletApplication OpenJDK 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.9) 2023-03-10 21:21:23.566 INFO 20752 --- [ main] hello.servlet.ServletApplication : Starting ServletApplication using Java 17.0.2 on LAPTOP-O321EMIC with PID 20752 (C:\Users\User\source\BackEnd\study\스프링MVC1\servlet\servlet\build\classes\java\main started by User in C:\Users\User\source\BackEnd\study\스프링MVC1\servlet\servlet) 2023-03-10 21:21:23.569 INFO 20752 --- [ main] hello.servlet.ServletApplication : No active profile set, falling back to 1 default profile: "default" 2023-03-10 21:21:24.462 INFO 20752 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2023-03-10 21:21:24.472 INFO 20752 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2023-03-10 21:21:24.472 INFO 20752 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.71] 2023-03-10 21:21:24.743 INFO 20752 --- [ main] org.apache.jasper.servlet.TldScanner : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 2023-03-10 21:21:24.758 INFO 20752 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2023-03-10 21:21:24.758 INFO 20752 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1120 ms 2023-03-10 21:21:24.965 INFO 20752 --- [ main] o.s.b.a.w.s.WelcomePageHandlerMapping : Adding welcome page: ServletContext resource [/index.html] 2023-03-10 21:21:25.085 INFO 20752 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2023-03-10 21:21:25.094 INFO 20752 --- [ main] hello.servlet.ServletApplication : Started ServletApplication in 1.889 seconds (JVM running for 2.506) 2023-03-10 21:21:37.051 DEBUG 20752 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [0] 2023-03-10 21:21:37.051 DEBUG 20752 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer : Received [GET /servlet-mvc/members/new-form HTTP/1.1 Host: localhost:8080 Connection: keep-alive sec-ch-ua: "Google Chrome";v="111", "Not(A:Brand";v="8", "Chromium";v="111" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "Windows" Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Sec-Fetch-Site: same-origin Sec-Fetch-Mode: navigate Sec-Fetch-User: ?1 Sec-Fetch-Dest: document Referer: http://localhost:8080/index.html Accept-Encoding: gzip, deflate, br Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 Cookie: JSESSIONID=E3785888BB25462DB7B183BFA52FDD63 ] 2023-03-10 21:21:37.079 INFO 20752 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2023-03-10 21:21:37.079 INFO 20752 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2023-03-10 21:21:37.080 INFO 20752 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms 2023-03-10 21:21:37.174 DEBUG 20752 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [809] 2023-03-10 21:21:37.174 DEBUG 20752 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer : Received [] 2023-03-10 21:21:37.174 DEBUG 20752 --- [nio-8080-exec-1] o.apache.coyote.http11.Http11Processor : Socket: [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@48295e2e:org.apache.tomcat.util.net.NioChannel@3716c58c:java.nio.channels.SocketChannel[connected local=/[0:0:0:0:0:0:0:1]:8080 remote=/[0:0:0:0:0:0:0:1]:57719]], Status in: [OPEN_READ], State out: [OPEN] build.gradleplugins { id 'java' id 'war' id 'org.springframework.boot' version '2.7.9' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } group = 'hello' version = '0.0.1-SNAPSHOT' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' //JSP implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'javax.servlet:jstl' //JSP compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() }
-
미해결코딩테스트 [ ALL IN ONE ]
문의드립니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.설명 하실떄 사용하는 파이썬 프로그램 명은 어떤건 가요? 저는 파이참을 사용중인데 하나씩 재생하는데? 조금 불편함이있어 노씨님 프로그램으로 사용해보고 싶어 문의 드립니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
실무에서 form 태그를 많이 사용하나요?
사실 이 강의와 큰 연관이 없는 것 같은 질문이긴 한데 너무 궁금해서요 ㅠㅠ클라이언트에서 상품 등록처럼 무언가 입력해서 서버로 보낼 때 form 태그를 많이 사용하나요?아니면 form 태그를 사용하지 않고 자바 스크립트로 하나씩 value를 읽어와서 json으로 만들어서 보내는 경우가 많나요?전자의 경우 서버에서는 @ModelAttribute를 사용할 테고 후자의 경우 서버에서 @RequestBody를 사용할 텐데 어떤 경우가 많나요?결국엔 둘 다 동작은 똑같이 할 것 같은데 어떠한 큰 차이가 있나요? 아니면 비슷하나요?클라이언트 관련 질문이라 강의와 연관이 없어서 답변을 못 받을 수도 있을 것 같긴 한데 너무 궁금합니다 ㅠㅠㅠ
-
해결됨스프링 DB 2편 - 데이터 접근 활용 기술
6:58초에서 log로 왜 proxy가 찍히는건지 잘 모르겠습니다..
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]잘 이해가 안되어 질문 남깁니다. test에 있는 itemRepository는 bean으로 Config 파일을 통해서 주입시킨 JpaRepository 객체가 autowired 통해서 들어왔는데, 왜 프록시 객체가 로그로 찍히나요?repository의 프록시는 서비스 레이어 넘기기 전, 예외 변경기능만 하는 것 아닌가요? itemRepository에 주입된 객체가 왜 repository의 프록시 객체인지가 궁금합니다.. save()같은 repository안의 메서드에서 예외가 발생하여 service로 넘어갈때 프록시 객체가 적용되어야 하는것 아닌가요?헷갈려서 질문남깁니다..감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의 중에 등장한 구글 확장프로그램 이름 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]View 환경설정 강의에서 3분 45초에 공식 문서를 볼 때 오른쪽 위에 등장하는 구글 확장 프로그램 이름이 어떻게 되나요?
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
블로그 포스팅 시 출처
안녕하세요. 선생님강의를 완강하고 내용을 정리하며 복습하기 위해 블로그에 글을 작성했습니다.다른 질문에서 출처만 남기면 된다고 하셨지만,이렇게 작성하는 것이 처음이라 선생님께서 한 번 확인해주실 수 있으실까요?https://sdoram.tistory.com/44https://sdoram.tistory.com/45https://sdoram.tistory.com/47강의 자료의 비중이 너무 높다면 비공개로 올리도록 하겠습니다.좋은 강의 감사합니다.
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
실무에서는 일반적으로 컨트롤러에서 예외를 던지나요?
컨트롤러, 서비스, 레포지토리 계층이 있을 때 서비스에서 직접 예외를 throw 해도 @ControllerAdvice에서 그 예외를 받아서 처리를 해주더라고요.질문 1. @ControllerAdvice는 컨트롤러에서 발생하는 예외를 처리해준다고 하셨는데 서비스에서 발생한 예외가 컨트롤러까지 와서 @ControllerAdvice가 그것을 인식하는 건가요?질문 2. 보통 서비스 계층에서 비즈니스 로직을 처리하는 걸로 알고 있는데 제 생각에는 오류를 던지는 것도 서비스 계층에서 던지는 것이 좋지 않을까하는 생각이 듭니다.실무에서는 컨트롤러 계층에서 에러를 던지는 편이 일반적인가요?
-
해결됨디지털포렌식전문가 2급 필기 핵심 요약집[전자책]
디지털 포렌식 분석 대상에 따른 분류 항목 질문
먼저, 좋은 자료 감사합니다. 혼자 디지털 포렌식을 준비하면서 공부 자료 준비부터 많은 어려움이 있었는데 덕분에 양질의 자료로 공부를 시작할 수 있게 되었습니다.올려주신 자료 중 분석 대상에 따른 분류 항목에서 질문이 있습니다.여러가지 분석대상을 기준으로 유형이 나누어져 있는데요.이 중, 침해사고 대응 포렌식은 분석 대상이 아닌 분석 목적에 따라 분류된 것으로 이해가 됩니다.그리고 시스템을 구성하는 운영체제나 애플리케이션이 분석 대상이 되는 경우도 있을 것 같은데 분류된 유형 중 분석 대상이 운영체제나 애플리케이션인 유형이 없는 것 같습니다.침해사고 대응 포렌식이 시스템 포렌식, 즉 운영체제나 애플리케이션 로그 등을 분석하는 분야인 것으로 이해하면 될까요?+) 그리고, 디지털 포렌식 일반 원칙 중, 연계 보관성 부분에는 담당자가 당자라고 쓰여 있는 것 같습니다.
-
해결됨
Querydsl을 멀티쓰레드 환경에서 사용할 때 발생하는 문제에 대해
안녕하세요. Querydsl강의를 수강하고 혼자 개발을 진행하다가 다음과 같은 문제가 발생해서 질문을 남기게 되었습니다. 제 상황은 A엔티티와 B엔티티를 가지고 있고, 둘은 OneToOne관계로 B가 연관관계의 주인인 상황입니다. Repository에는 A와 B의 데이터를 호출하는 Querydsl코드가 각각 존재하며, 이를 Service Layer에서 그대로 Return값으로 받고 있습니다.이들을 멀티쓰레드 환경에서 호출했을 때 B데이터를 호출하는 코드에 Connection leak이 존재한다는 에러가 발생하는 상황입니다. (.yml파일에서 hikari의 leak-detection-threshold을 설정한 상황입니다.)Domain@NoArgsConstructor @AllArgsConstructor @Entity public class A { @Id private Long id; @OneToOne(mappedBy = "a") private B b; private int var1; }@NoArgsConstructor @AllArgsConstructor @Entity public class B { @Id private Long id; @OneToOne @JoinColumn(name = "b_id") private A a; private int var1; }Repositorypublic interface Repository extends JpaRepository<A,Long>, RepositoryCustom { }public interface RepositoryCustom { Dto queryOne(); Dto queryTwo(); Dto queryThree(); }public class RepositoryCustomImpl implements RepositoryCustom { private final JPAQueryFactory queryFactory; public RepositoryCustomImpl(EntityManager em) { this.queryFactory = new JPAQueryFactory(em); } @Override public Dto queryOne() { return queryFactory .select(Projections.constructor(Dto.class, a.id, a.var1 )) .from(a) .fetchFirst(); } @Override public Dto queryTwo(){ return queryFactory .select(Projections.constructor(Dto.class, b.id, b.var1 )) .from(b) .fetchFirst(); } @Override public Dto queryThree(){ System.out.println("a.getClass() = " + a.getClass()); System.out.println("b.getClass() = " + b.getClass()); return queryFactory .select(Projections.constructor(Dto.class, b.id, b.var1 )) .from(b) .fetchFirst(); } }queryThree는 queryTwo와 Querydsl코드는 동일합니다. 다만 쿼리를 실행하기 전에 Qtype의 a와 b를 순서대로 한번 호출했다는 부분이 queryTwo와 다릅니다.DTOpublic class Dto { private Long id; private int var1; } Service@org.springframework.stereotype.Service @RequiredArgsConstructor public class Service { private final Repository repo; @Transactional public Dto logicOne(){ return repo.queryOne(); } @Transactional public Dto logicTwo(){ return repo.queryTwo(); } @Transactional public Dto logicThree(){ return repo.queryThree(); } }테스트코드@SpringBootTest @Slf4j public class SimpleTest { @Autowired Service service; @Test void connection_leak_detected(){ Runnable userA = () -> { Dto dto = service.logicOne(); log.info("[Thread A: {}]",dto); }; Thread threadA = new Thread(userA); threadA.start(); Runnable userB = () -> { Dto dto = service.logicTwo(); log.info("[Thread B: {}]",dto); }; Thread threadB = new Thread(userB); threadB.start(); sleep(6000); } @Test void leak_not_detected(){ Runnable userA = () -> { Dto dto = service.logicOne(); log.info("[Thread A: {}]",dto); }; Thread threadA = new Thread(userA); threadA.start(); Runnable userB = () -> { Dto dto = service.logicThree(); log.info("[Thread B: {}]",dto); }; Thread threadB = new Thread(userB); threadB.start(); sleep(6000); } @Test @Transactional void connection_leak_detected_otherCase(){ Runnable userA = () -> { Dto dto = service.logicOne(); log.info("[Thread A: {}]",dto); }; Thread threadA = new Thread(userA); threadA.start(); Runnable userB = () -> { Dto dto = service.logicThree(); log.info("[Thread B: {}]",dto); }; Thread threadB = new Thread(userB); threadB.start(); sleep(6000); } private void sleep(int millis){ try{ Thread.sleep(millis); } catch (InterruptedException e){ e.printStackTrace(); } } }connection_leak_detected를 테스트하면 Connection leak이 발생했다는 에러가 발생합니다.leak_not_detected를 테스트하면 Connection leak 로그가 출력되지 않습니다.leak_not_detected와 동일한 테스트코드에 Transactional을 선언한 connection_leak_detected_otherCase은 Connection leak 로그가 출력됩니다.어떤 이유로 이러한 Connection leak이 발생하는지, 그리고 어떻게하면 이러한 문제를 해결할 수 있는지 궁금합니다..!
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
AOP 출력시간 개수
6분20초 경 강사님께서는 START가 3개 나오는데 전 1개만 나옵니다. 상관없는걸까요??
-
미해결데이터 분석 SQL Fundamentals
dbeaver 환경설정 문제
안녕하세요! 처음으로 dbeaver 을 사용하는데 sql추출하는 곳의 글꼴 크기가 너무 작아 구글을 통해 환경설정을 하려고 했습니다. 근데 보통 설정>모양>색상및 글꼴>기본>텍스트 글꼴 하면 된다고 나오는데... 저한테는 텍스트 글꼴 목록자체가 나오지 않습니다. 이부분에 대해서도 구글링을 해보았지만 해답이 나오지 않습니다. 혹시 선생님께서 알고 계시다면 알려주시면 감사하겠습니다...!
-
미해결[중급편] 코인 가격 모니터링 앱 제작 (Android Kotlin)
패턴질문입니다.
프로젝트 공부하다가 궁금한점이있어 질문드립니다.커뮤니티앱은 mvc패턴이고코인가격앱은 mvvm패턴인가요?
-
해결됨팝스타 공식 뮤비 제작 & 유튜브 2천만 뷰 크리에이터의 애니메이트 X 이모티콘 클래스
부모자식 기능에서 크기 변형할 때
안녕하세요, '부모자식' 기능에서 레이어 종속을 만들어준 다음에 강의에서처럼 몸통만 선택 후 납작하게 줄이려고 하는데, 왜 전체 캐릭터가 같이 줄어들까요? (줄이거나 키우거나 마찬가지네요)이 부분이 막혀서 다음 진도를 나갈 수가 없네요 도와주세요!ㅜ.ㅜ
-
미해결
Enjoy Horror Granny Game
Before you play the horror game called granny. It's necessary to know some basic things about this game. Let's explore:The setting of the game is a spooky mansion with a rumored grandma monster. If Grandma sees you, she will kill you. Your mission is to find the key to the exit door while avoiding the monster's attack.The entire house is painted a dark gray. Household appliances were also in poor condition and littered the floor. All of them give players a strange and frightening feeling.The sound of objects creaking and the screams of grandpa monsters will add to the game's eerie atmosphere.
-
해결됨[에듀윌 화이트해커 양성과정] 악성코드 제작
컴파일에러
안녕하십니까, 강사님강사님 강의 수강하면서 코드를 작성 후 컴파일을 했는데, 아래와 같이 에러가 납니다.아래 에러는 어떻게 수정하면 되는지요??C:\Users\k5841\OneDrive\문서\payload>gcc .\payload_executor.c -o payload_executor.exe -lntdll -mwindows.\payload_executor.c:5:22: fatal error: winternl.h: No such file or directory #include <winternl.h>
-
미해결Flutter 중급 1편 - 클린 아키텍처
type 에러
안녕하세요 선생님! 다름이 아니라 테스트 코드 작성중에result 를 Success로 캐스팅 하여 테스트 코드 실행 하였는데 터미널과 같은 에러가 발생하는데 무엇때문에에러가 뜨는지 모르겠어요 ㅠㅠ운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
해결됨카프카 완벽 가이드 - 커넥트(Connect) 편
AVRO 연결이 안됩니다 ㅠㅠ
안녕하세요. 선생님 수업을 잘 듣고 있습니다.일단 선생님이 알려주신 부분하고 다르게 하고 있는게 있어서 환경 부터 어떻게 했는지 말씀 드릴게요.일단 kafka는 Confluent kafka 가 아닌 apache kafka 로 설치 했습니다.EC2 에서 총 8개의 인스턴스를 구축 했으며Apache Zookeeper 3.8.1 3개Apache Kafka 2.13-3.3.2 3개=> Source connect : Debezium mysql connect 2.1.2=> Sink connect : Confluent JDBC Connector 10.6.3Confluent Schema registry 7.3.0 1개mysql DB 1 개 (Source 와 Sink 는 user 로 분리해서 데이터 넣는 방식으로 테스트 중입니다)위와 같이 구성을 해서 구축을 했습니다.테스트는 json 방식으로 Source 와 sink 쪽에 각각 connect 정보 등록 해서 데이터 전달 되는것까지 통과 했습니다.Confluent Schema registry 는 설치 하고 카프카서버에서 스키마 서버 8081포트 가 뜨는것도 확인 했습니다.Json 방식으로 Schema registry 로 데이터 전달 되는것도 문제 없었습니다. 문제점. 수업에 있는 Avro 로 connect 등록 할려고 하니 바로 에러가 납니다.{"error_code":500,"message":"Error trying to forward REST request: Connector configuration is invalid and contains the following 2 error(s):\nInvalid value io.apicurio.registry.utils.converter.AvroConverter for configuration key.converter: Class io.apicurio.registry.utils.converter.AvroConverter could not be found.\nInvalid value io.apicurio.registry.utils.converter.AvroConverter for configuration value.converter: Class io.apicurio.registry.utils.converter.AvroConverter could not be found.\nYou can also find the above list of errors at the endpoint /connector-plugins/{connectorType}/config/validate"} 위와 같은 에러에 대해 일단 조치한 점은kafka 의 connect-distributed.properties 에서 설정한 "plugin.path" 에Kafka Connect Avro Converter(https://www.confluent.io/hub/confluentinc/kafka-connect-avro-converter)를 압축 풀어서 두었습니다. connect 서버 재 가동 후, 아래 명령어로 Plugin 확인 하였는데 mysql connect 나 jdbc Source connect , jdbc sink connect 는 뜨는데 "avro" 관련된 plugin 이 보이지 않았습니다."curl --location --request GET 'localhost:8083/connector-plugins' | jq '.'" 그래서 위 에러가 Avro 를 못찾는다는 이유가, kafka에 avro 를 설정을 못한건지?Confluent Schema registry 에 avro 문제 인건지? 아니면 제가 Confluent kafka 가 아닌 apache kafka 로 설치 해서 인지 알수가 있을까요?
-
해결됨직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
1강 질문입니다..
시작하자마자 턱에 걸리네요ㅠㅠ파이썬에서 아래와 같이 입력했는데import win32com.client as win32 hwp = win32.gencache.EnsureDispatch(hwpframe.hwpobject)이런 결과가 나오네요... 어떻게 해야할지 모르겠습니다. 도와주세요.C:\Users\hwa0h\anaconda3\python.exe C:\PPP1\test.py Traceback (most recent call last): File "C:\PPP1\test.py", line 2, in <module> hwp = win32.gencache.EnsureDispatch(hwpframe.hwpobject) NameError: name 'hwpframe' is not defined Process finished with exit code 1