묻고 답해요
138만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)
테스트(Matchers.is) 질문드립니다.
.andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(Matchers.is(2)))위 코드와 아래코드 모두 정상적으로 통과하는걸 확인하였는데요.andExpect(MockMvcResultMatchers.jsonPath("$.length()").value(2))수업에서는 Matchers.is()를 사용하셨는데 위 코드 문맥에서 is()를 굳이 왜 사용하셨는지 궁금해서 질문드립니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
out 폴더 삭제 후 error page
홈화면과 레이아웃 강의에서 css적용이 안되길래 방법을 찾아보다가 out폴더 삭제 후 reload disk를 하면된다는 글을 보고 out폴더를 삭제했는데 아예 error page가 뜹니다ㅜㅜ 원래는 css적용만 안되는 오류였는데 아예 실행이 안되네요..out폴더를 되돌릴 수가 없어서 방법이 있을까요??
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. 안녕하세요!! 수업을 들으면서 생긴 궁금증인데 Member랑 Orders가 1:N 관계로 양방향으로 매핑이 되어 있자나요. 그럼 Members 객체를 호출해서 SQL문을 날리면 Orders List관련 SQL문은 따로 안날리고 나중에 Orders에 접근할때 SQL을 날리는 방식이 지연 로딩 방식인건가요?? 연관된 객체 탐색이 쉽다는 이유로 연관 매핑을 막 사용하면 안되고 진짜 필요할 때만 사용하라는 말이 있더라고요. 조회 기능 같은 경우에는 (CQRS) 별도 모델을 만들어서 구현하라는 말을 들었는데, 이번 강의처럼 모든 테이블 사이에 연관관계를 매핑 해줘도 되는건가요??
-
미해결실전! 스프링 데이터 JPA
쿼리 힌트 Page 추가 예제 관련 질문입니다/
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? [질문 내용]안녕하세요. 강의와 자료를 병행해서 보다가 질문이 있어 문의드립니다. 우선적으로https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84&unitId=28020&tab=community&category=questionDetail&q=723744해당 내용을 읽어보았는데도 이해가 되질 않아 문의드리게 된 점 양해부탁드립니다 ㅜ해당 내용처럼 저도 application.yml 내 use_sql_comments: true 를 추가쿼리문을 확인하였을 때forCounting=false /* select count(m) from Member m where m.username = :username */ select count(member0_.id) as col_0_0_ from member member0_ where member0_.username='member1'; forCounting=true /* memberRepository.findByUsername */ select count(member0_.id) as col_0_0_ from member member0_ where member0_.username='member1';위와 같은 결과를 반환받았는데 어떤 차이가 있는지 잘모르겠습니다 ㅜ 어떤 의도를 말씀하시는지 잘모르겠습니다 ㅜ
-
미해결생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현
access token 생성 중 에러가 있어서 문의드립니다.
안녕하세요. 강의 잘 듣고 있습니다.access token 생성중에 에러가 생겨서 진행이 안되고 있어 문의드립니다.해당 부분에서 secret 임이의 문자열을 ES512 알로리즘 방식을 적용할 때 아래와 같은 에러가 발생합니다.Key bytes may only be specified for HMAC signatures. If using RSA or Elliptic Curve, use the signWith(SignatureAlgorithm, Key) method instead.ES256을 적용도 해보고 여러 시도를 해봤는데 동일한 에러가 발생하네요. 제가 실수한 부분이 있을까요?참고로 yml 설정은 강사님과 동일하게 맞췄습니다.조언 부탁드려요!==============================원인을 찾았습니다. HS512로 적용해야하는데 ES512로 적용했네요.ㅎㅎES512는 임의의 문자열을 알고리즘으로 변환을 못해 에러가 발생했는데 자세히는 모르겠네요.아시는 분 있으면 답글 부탁드립니다.ㅎㅎ
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
orderItem이 casecade가 안걸려있다고 생각하고 질문 드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]casecade로 persist를 한번에 진행하는데이제 각자 등록해야 된다면(cascade이 애매하게 느껴진다면)public void save(Order order){ em.persist(order.getOrderItem()) em.persist(order.getDelivery()) em.persist(order.getMember()) em.persist(order);이런식으로 persist를 진행하면 되는걸까요?
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
상속관계가 두 개 이상일 때 매핑 질문
안녕하세요.하나의 엔티티가 두 개 이상의 상위 엔티티에 속하는 경우 어떻게 구현해야 하는지 질문드립니다.예를 들어서 사과라는 엔티티가 과일에도 속하고 음식에도 속한다고 했을 때,DB에서는 사과엔티티를 과일테이블과 음식테이블이라는 두 개의 싱글테이블의 행으로 표현할 수 있지만 객체모델링에서는 사과가 반드시 하나의 엔티티 클래스를 상속해야하기 때문에 어떻게 모델링해야 하는지 모르겠습니다.감사합니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
특정 도구에서 서버를 실행하면 에러가 발생합니다.
안녕하세요. 강의를 들으면서 코드를 실행하다가 막힌 부분이 있어 질문드립니다.특정 도구에서 사용하면 서버가 실행이 되지 않습니다.인텔리제이 터미널에서 실행한 경우 에러가 발생합니다.PS C:\workplace\user-service> mvn spring-boot:run -Dspring-boot.run.jvmArguments='-Dserver.port=9003' -e[INFO] Error stacktraces are turned on.[INFO] Scanning for projects...[INFO] [INFO] ----------------------< com.example:user-service >----------------------[INFO] Building user-service 0.0.1-SNAPSHOT[INFO] from pom.xml[INFO] --------------------------------[ jar ]---------------------------------[INFO] ------------------------------------------------------------------------[INFO] BUILD FAILURE[INFO] ------------------------------------------------------------------------[INFO] Total time: 0.326 s[INFO] Finished at: 2023-06-27T21:49:08+09:00[INFO] ------------------------------------------------------------------------[ERROR] Unknown lifecycle phase ".run.jvmArguments=-Dserver.port=9003". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: pre-clean, clean, post-clean, validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-site, site, post-site, site-deploy. -> [Help 1]org.apache.maven.lifecycle.LifecyclePhaseNotFoundException: Unknown lifecycle phase ".run.jvmArguments=-Dserver.port=9003". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: pre-clean, clean, post-clean, validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-site, site, post-site, site-deploy. at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateLifecycleMappings (DefaultLifecycleExecutionPlanCalculator.java:225) at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateMojoExecutions (DefaultLifecycleExecutionPlanCalculator.java:197) at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateExecutionPlan (DefaultLifecycleExecutionPlanCalculator.java:119) at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateExecutionPlan (DefaultLifecycleExecutionPlanCalculator.java:135) at org.apache.maven.lifecycle.internal.builder.BuilderCommon.resolveBuildPlan (BuilderCommon.java:93) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:100) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:283) at org.apache.maven.cli.MavenCli.main (MavenCli.java:206) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke (Method.java:566) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:283) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:226) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:407) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:348)[ERROR][ERROR] Re-run Maven using the -X switch to enable full debug logging.[ERROR][ERROR] For more information about the errors and possible solutions, please read the following articles:[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException PowerShell에서 실행한 경우 에러가 발생합니다.PS C:\workplace\user-service> java -jar -Dserver.port=9004 .\target\user-service-0.0.1-SNAPSHOT.jarError: Unable to access jarfile .port=9004※ PowerShell에서 실행한 명령어를 명령 프롬프트에서 실행하면 정상작동됩니다.감사합니다.
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
DTYPE을 코드로 표현하는 경우
안녕하세요.DiscriminatorColumn, DiscriminatorValue 를 이용하여 DTYPE을 자동으로 insert하는 기능이 참 편리해보이는데요.만약에 예시에 나온 Item의 관리가 객체 이름이 아닌 일련의 문자열 ItemCode로 이루어진다면, 그리고 ItemCode를 DB 등에 따로 저장하여 사용하고 있다면 DiscriminatorValue에 그 값을 넣어줄 수 있는 방법이 있을까요?만약 DB에서 조회하는 것이 불가능하다면 DB가 아니라 코드로 정의를 해놓는다면(Enum등으로) 참조값을 넣어줄 수는 있을까요?감사합니다.
-
해결됨스프링과 JPA 기반 웹 애플리케이션 개발
사진 수정이 계속 안 됩니다.
cdn 방식으로 cropper를 사용하는 중이고요. 자바스크립트를 여러번 검토 하였음에도 프로필 사진 변경 문제는 끝까지 해결되지 않았습니다.https://www.youtube.com/watch?v=k330LVo2yw8setting.profile.html<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://thymeleaf.org/extras/spring-security"> <head th:fragment="head"> <meta charset="UTF-8"> <title>StudyOlle</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"> <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/jdenticon@3.2.0/dist/jdenticon.min.js" async integrity="sha384-yBhgDqxM50qJV5JPdayci8wCfooqvhFYbIKhv0hTtLvfeeyJMJCscRfFNKIxt43M" crossorigin="anonymous"> </script> <style> .container{ max-width:100%; } </style> </head> <nav th:fragment="main-nav" class="navbar navbar-expand-sm navbar-dark bg-dark"> <a class="navbar-brand" href="/" th:href="@{/}"> <img src="/images/logo_sm.png" width="30" height="30"> </a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav mr-auto"> <li class="nav-item"> <form th:action="@{/search/study}" class="form-inline" method="get"> <input class="form-control mr-sm-2" name="keyword" type="search" placeholder="스터디 찾기" aria-label="Search"> </form> </li> </ul> <ul class="navbar-nav justify-content-end"> <li class="nav-item" sec:authorize="isAnonymous()"> <a class="nav-link" th:href="@{/login}">로그인</a> </li> <li class="nav-item" sec:authorize="isAnonymous()"> <a class="nav-link" th:href="@{/sign-up}">가입</a> </li> <li class="nav-item" sec:authorize="isAuthenticated()"> <a class="nav-link" th:href="@{/notifications}"> <i class="fa fa-bell-o" aria-hidden="true"></i> </a> </li> <li class="nav-item" sec:authorize="isAuthenticated()"> <a class="nav-link btn btn-outline-primary" th:href="@{/notifications}"> <i class="fa fa-plus" aria-hidden="true"></i> 모임 개설 </a> </li> <li class="nav-item dropdown" sec:authorize="isAuthenticated()"> <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <svg th:if="${#strings.isEmpty(account?.profileImage)}" th:data-jdenticon-value="${#authentication.name}" width="24" height="24" class="rounded border bg-light"></svg> <img th:if="${!#strings.isEmpty(account?.profileImage)}" th:src="${account.profileImage}" width="24" height="24" class="rounded border"/> </a> <div class="dropdown-menu dropdown-menu-sm-right" aria-labelledby="userDropdown"> <h6 class="dropdown-header"> <span sec:authentication="name">Username</span> </h6> <a class="dropdown-item" th:href="@{'/profile/' + ${#authentication.name}}">프로필</a> <a class="dropdown-item" >스터디</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="#" th:href="@{'/settings/profile'}">설정</a> <form class="form-inline my-2 my-lg-0" action="#" th:action="@{/logout}" method="post"> <button class="dropdown-item" type="submit">로그아웃</button> </form> </div> </li> </ul> </div> </nav> <footer th:fragment="footer"> <div class="row justify-content-center"> <img class="mb-2" src="/images/logo_lang_kr.jpg" alt="" width="100"> <small class="d-block mb-3 text-muted">© 2023</small> </div> </footer> <div th:fragment="settings-menu (currentMenu)" class="list-group"> <a class="list-group-item list-group-item-action" th:classappend="${currentMenu == 'profile'}? active" href="#" th:href="@{/settings/profile}">프로필</a> <a class="list-group-item list-group-item-action" th:classappend="${currentMenu == 'password'}? active" href="#" th:href="@{/settings/password}">비밀번호</a> <a class="list-group-item list-group-item-action" th:classappend="${currentMenu == 'notification'}? active" href="#" th:href="@{/settings/notification}">알림</a> <a class="list-group-item list-group-item-action" th:classappend="${currentMenu == 'tags'}? active" href="#" th:href="@{/settings/tags}">관심 주제</a> <a class="list-group-item list-group-item-action" th:classappend="${currentMenu == 'zones'}? active" href="#" th:href="@{/settings/zones}">활동 지역</a> <a class="list-group-item list-group-item-action list-group-item-danger" th:classappend="${currentMenu == 'account'}? active" href="#" th:href="@{/settings/account}">계정</a> </div> <script type="application/javascript" th:fragment="form-validation"> (function () { 'use strict'; window.addEventListener('load', function () { // Fetch all the forms we want to apply custom Bootstrap validation styles to var forms = document.getElementsByClassName('needs-validation'); // Loop over them and prevent submission Array.prototype.filter.call(forms, function (form) { form.addEventListener('submit', function (event) { if (form.checkValidity() === false) { event.preventDefault(); event.stopPropagation(); } form.classList.add('was-validated') }, false) }) }, false) }()) </script> </html>fragments.html<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://thymeleaf.org/extras/spring-security"> <head th:fragment="head"> <meta charset="UTF-8"> <title>StudyOlle</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"> <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/jdenticon@3.2.0/dist/jdenticon.min.js" async integrity="sha384-yBhgDqxM50qJV5JPdayci8wCfooqvhFYbIKhv0hTtLvfeeyJMJCscRfFNKIxt43M" crossorigin="anonymous"> </script> <style> .container{ max-width:100%; } </style> </head> <nav th:fragment="main-nav" class="navbar navbar-expand-sm navbar-dark bg-dark"> <a class="navbar-brand" href="/" th:href="@{/}"> <img src="/images/logo_sm.png" width="30" height="30"> </a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav mr-auto"> <li class="nav-item"> <form th:action="@{/search/study}" class="form-inline" method="get"> <input class="form-control mr-sm-2" name="keyword" type="search" placeholder="스터디 찾기" aria-label="Search"> </form> </li> </ul> <ul class="navbar-nav justify-content-end"> <li class="nav-item" sec:authorize="isAnonymous()"> <a class="nav-link" th:href="@{/login}">로그인</a> </li> <li class="nav-item" sec:authorize="isAnonymous()"> <a class="nav-link" th:href="@{/sign-up}">가입</a> </li> <li class="nav-item" sec:authorize="isAuthenticated()"> <a class="nav-link" th:href="@{/notifications}"> <i class="fa fa-bell-o" aria-hidden="true"></i> </a> </li> <li class="nav-item" sec:authorize="isAuthenticated()"> <a class="nav-link btn btn-outline-primary" th:href="@{/notifications}"> <i class="fa fa-plus" aria-hidden="true"></i> 모임 개설 </a> </li> <li class="nav-item dropdown" sec:authorize="isAuthenticated()"> <a class="nav-link dropdown-toggle" href="#" id="userDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <svg th:if="${#strings.isEmpty(account?.profileImage)}" th:data-jdenticon-value="${#authentication.name}" width="24" height="24" class="rounded border bg-light"></svg> <img th:if="${!#strings.isEmpty(account?.profileImage)}" th:src="${account.profileImage}" width="24" height="24" class="rounded border"/> </a> <div class="dropdown-menu dropdown-menu-sm-right" aria-labelledby="userDropdown"> <h6 class="dropdown-header"> <span sec:authentication="name">Username</span> </h6> <a class="dropdown-item" th:href="@{'/profile/' + ${#authentication.name}}">프로필</a> <a class="dropdown-item" >스터디</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="#" th:href="@{'/settings/profile'}">설정</a> <form class="form-inline my-2 my-lg-0" action="#" th:action="@{/logout}" method="post"> <button class="dropdown-item" type="submit">로그아웃</button> </form> </div> </li> </ul> </div> </nav> <footer th:fragment="footer"> <div class="row justify-content-center"> <img class="mb-2" src="/images/logo_lang_kr.jpg" alt="" width="100"> <small class="d-block mb-3 text-muted">© 2023</small> </div> </footer> <div th:fragment="settings-menu (currentMenu)" class="list-group"> <a class="list-group-item list-group-item-action" th:classappend="${currentMenu == 'profile'}? active" href="#" th:href="@{/settings/profile}">프로필</a> <a class="list-group-item list-group-item-action" th:classappend="${currentMenu == 'password'}? active" href="#" th:href="@{/settings/password}">비밀번호</a> <a class="list-group-item list-group-item-action" th:classappend="${currentMenu == 'notification'}? active" href="#" th:href="@{/settings/notification}">알림</a> <a class="list-group-item list-group-item-action" th:classappend="${currentMenu == 'tags'}? active" href="#" th:href="@{/settings/tags}">관심 주제</a> <a class="list-group-item list-group-item-action" th:classappend="${currentMenu == 'zones'}? active" href="#" th:href="@{/settings/zones}">활동 지역</a> <a class="list-group-item list-group-item-action list-group-item-danger" th:classappend="${currentMenu == 'account'}? active" href="#" th:href="@{/settings/account}">계정</a> </div> <script type="application/javascript" th:fragment="form-validation"> (function () { 'use strict'; window.addEventListener('load', function () { // Fetch all the forms we want to apply custom Bootstrap validation styles to var forms = document.getElementsByClassName('needs-validation'); // Loop over them and prevent submission Array.prototype.filter.call(forms, function (form) { form.addEventListener('submit', function (event) { if (form.checkValidity() === false) { event.preventDefault(); event.stopPropagation(); } form.classList.add('was-validated') }, false) }) }, false) }()) </script> </html>SettingsController.java@Controller @RequiredArgsConstructor public class SettingsController { final static String SETTING_PROFILE_VIEW_NAME="settings/profile"; final static String SETTING_PROFILE_URL="/settings/profile"; private final AccountService accountService; @GetMapping(SETTING_PROFILE_URL) public String profileUpdateForm(@CurrentUser Account account, Model model){ model.addAttribute(account); model.addAttribute(new Profile(account)); return SETTING_PROFILE_VIEW_NAME; } @PostMapping(SETTING_PROFILE_URL) public String updateProfile(@CurrentUser Account account, @Valid Profile profile, Errors errors, Model model, RedirectAttributes attributes){ if(errors.hasErrors()){ model.addAttribute(account); return SETTING_PROFILE_VIEW_NAME; } accountService.updateProfile(account, profile); attributes.addFlashAttribute("message","프로필을 수정했습니다."); return "redirect:"+SETTING_PROFILE_URL; } }AccountService.javapublic void updateProfile(Account account, Profile profile){ account.setUrl(profile.getUrl()); account.setBio(profile.getBio()); account.setOccupation(profile.getOccupation()); account.setLocation(profile.getLocation()); account.setProfileImage(profile.getProfileImage()); accountRepository.save(account); }Profile.java@Data @NoArgsConstructor public class Profile { @Length(max = 35) private String bio; @Length(max = 50) private String url; @Length(max = 50) private String occupation; @Length(max = 50) private String location; private String profileImage; public Profile(Account account){ this.bio=account.getBio(); this.url=account.getUrl(); this.occupation=account.getOccupation(); this.location=account.getLocation(); this.profileImage=account.getProfileImage(); } }
-
미해결실전! 스프링 데이터 JPA
부모 엔티티의 Respository 로 저장시 자식 엔티티의 영속성 전이 문제
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]김영한님 안녕하세요. JPA 사용중에 부모 엔티티의 Respository 로 저장시 자식 엔티티의 영속성 전이 문제가 있어 질문 남깁니다. 상황은 다음과 같습니다.게시판과 게시판의 댓글을 하나의 애그리거트로 보고 게시판(루트 애그리더트)을 통해 댓글을 작성하려고 합니다. 댓글의 게시판 칼럼을 세팅하고 게시판의 repository로 save 하게 되면 댓글이 영속성 상태가 되지 않습니다. 근데 게시판 내부에 있는 댓글 리스트에 추가된 신규 댓글을 영속성 상태입니다. (영속성 상태 여부는 id 값 존재 여부로 판단했습니다.) 위 캡쳐에서 board 의 commentList의 인덱스가 4인 BoardComment 를 보시면 id가 7로 세팅 되어 있지만, boardComment 의 id는 null 로 되어 있습니다. 그래서 물어보고 싶은건 다음과 같습니다.위 상황에서 boardComment 의 id 가 7(null 이 아닌)이 될 수 있는 방법댓글 조회/수정/삭제에서 DDD 를 적용했을때의 로직 DDD 에 맞게 루트 애그리거트를 통한 CRUD 를 만들려고 하다보니 이런 질문을 하게 되었습니다. 이 문제의 전체코드는 https://github.com/SongHae8640/community 이고, 위 테스트 코드는 https://github.com/SongHae8640/community/blob/master/src/test/java/com/example/community/domain/board/comment/BoardCommentTest.java 입니다. 확인 부탁드립니다.감사합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
변경감지 시 참조키 업데이트 질문드려요
변경감지를 통해서 데이터들을 업데이트하려고 하는데요.그 중에 외래키도 업데이트를 시키려고 하는데 변경감지로 잡히지가 않아서요.외래키는 변경감지에 안걸리나요?아래 예제입니다. class Team () {String teamName; @ManyToOne()@JoinColumn(name = "MEBER_SEQ")Member member;} Member newMember = new Member();team.setMember(newMember);
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Test 작성 중 select 쿼리가 발생하지 않는다고 했는데, 저는 발생하고 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네[질문 내용]MemberRepositoryTest.java위 코드에서 테스트 진행했을 때, select 쿼리가 로그에 찍히고 있습니다. select 쿼리가 로그에 찍히는 이유를 알 수 있을까요? ( 강의 중 19:20 - 19:30 에 select 쿼리가 안 찍히는 게 정상이라고 하셔서 질문 드립니다. )아래는 application.yml 파일입니다. 아래는 select 쿼리가 찍힌 로그 입니다.감사합니다.
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Order의 전체조회를 할때 조회타입 생략이 가능한가요?
실수로 생략하고 실행했는데 조회는 정상적으로 작동합니다.타입을 지정해야하는 상황과 지정하지 않아도 되는 상황을 예시로 명확히 설명해주실 수 있을까용?
-
미해결Practical Testing: 실용적인 테스트 가이드
DTO 분리에 관련된 질문이 있습니다.
안녕하세요. 강의 잘 듣고 있습니다.만약에 Service를 Write / Read 로 나눠서 관리를 한다고 하면Service 패키지쪽의 DTO도 나눠서 생성을 하시나요?아니면 그 부분은 같이 사용하시는 편인가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대일 단방향으로 save시
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 질문 드리고 싶은건 팀과 멤버 엔티티를 DB에 저장하기 위한 상황입니다.한번의 save 코드로 두번의 INSERT 쿼리를 내보내겠습니다. 팀 save, 멤버 save (멤버 ManyToOne)팀.add멤버(멤버) 후 팀 save (팀 OneToMany, 멤버 ManyToOne)멤버.set팀(팀) 후 멤버 save (멤버 ManyToOne)이런 3가지 방법이 가능할 것 같습니다.3번의 경우에는 멤버에만 @ManyToOne으로 관계지정하고 cascade = CascadeType.ALL 옵션을 추가해서 팀에도 쿼리가 발생하게 되는데요이런 예시(Case. 3)가 웹에는 흔하지 않다는게 의문입니다.만약 cascade 옵션을 이렇게 사용해선 안되는 것인지. (자식엔티티로 부모 엔티티를 관여하는) 혹은 권장되는 방식인지.또 여러개의 테이블이 산재된 현업에서 어떤 방식이 권장되는지.이때 판단 기준은 어때야 하는지 궁금합니다.혹시 이런 내용을 책에서 다루고 있거나, 다른 강의에서 다루고 있다면 추천해주시면 구입해서 공부하고 싶습니다.항상 학생들을 위해 힘써주시고 좋은 강의 만들어주셔서 감사합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
could not instantiate id generator 에러가 발생합니다.
JpashopApplication 실행 시 다음과 같은 에러가 발생합니다.. Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Could not instantiate id generator [entity-name=jpabook.jpashop.domain.OrderItem] 본 파일에서는 삭제했는데 이전에 MemberRepositoryTest 실행 시에도 같은 에러가 발생해서 @GeneratedValue에 옵션설정을 추가했더니 @GeneratedValue(strategy = GenerationType.IDENTITY) 작동이 되더라구요. 이번에도 다 넣어줘야 하는건지 아니면 다른 이유 때문인지 궁금하여 글 남깁니다. 압축파일 링크 입니다. https://drive.google.com/file/d/1Uj__VLj3glPm6Uor6-Gyr6dX2i8kOQcc/view?usp=share_link 감사합니다 ^^
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Junit4 -> Junit5로 테스트 적용 시
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.@Test(expected = IllegalStateException.class) public void 중복_회원_예외() throws Exception{ //given Member member1 = new Member(); member1.setName("kim"); Member member2 = new Member(); member2.setName("kim"); //when memberService.join(member1); memberService.join(member2); //then } }Junit5로 적용 시키고 싶어서 아래와 같이 테스트 코드를 작성했는데, 잘 작성한게 맞나요? 혹시 더 좋은 BestPractice가 있다면, 알려주시면 감사하겠습니다. @Test public void 중복_회원_예외() throws Exception{ //given Member member1 = new Member(); member1.setName("kim"); Member member2 = new Member(); member2.setName("kim"); //when memberService.join(member1); //then assertThrows(IllegalStateException.class, () -> {memberService.join(member2);}); } }
-
해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
서비스 단계에서 DTO를 사용하지 않고 엔티티를 바로 써도 되나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 강의를 수강 후 엔티티대신 DTO를 서비스에서 사용해야하는지 의문이 생겼습니다.controller 에서는 엔티티형태로 반환해서도 파라미터로 받아서도 안되는것을 이해했습니다.service 에서는 화면으로 보여지기 전에 controller 에서 DTO 형태로 가공할 수 있기 때문에 service 에서는 엔티티형태로 반환하고 파라미터로 받아도 되나요?1번이 아니라면 service 에서 DTO를 사용해야하는 경우나 안사용해도 되는 경우나 약간의 가이드를 주시면 감사하겠습니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
메인 메서드 실행시 NoSuchMethodError 해결방법 공유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)질문은 아니지만 해결방법이 안 올라온 것 같아 올립니다.2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]강의 초반에 Member 클래스를 만들고 DB연결, 테이블 생성까지 했는데 메인메서드를 실행하면 NoSuchMethodError 오류가 나는 경우가 있습니다.커뮤니티 게시판을 찾아봤는데 질문은 있고 답변은 없는 것 같아 해결방법 공유합니다.저같은 경우는 h2버전과 스프링 부트 버전이 맞지 않아 그런 줄 알고 h2와 스프링 부트 버전을 달리해가며 설정해봤는데 알고보니 hibernate 버전 충돌 문제인 것 같습니다.pom.xml파일에서<!-- JPA 하이버네이트 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.6.15.Final</version> </dependency>로 하이버네이트 의존성 설정을 해주면 인텔리제이가 자동으로 하이버네이트 라이브러리를 다운받는데 이때 hibernate-commons-annotations의 버전과 hibernate-core의 버전이 호환되지 않는 경우가 있는 것 같습니다. 저는 처음에 hibernate-commons-annotations 버전이 5.0.4, hibernate-core가 5.6.15 final로 되어있었는데 의존성 설정 갱신 이후 hibernate-commons-annotations 버전이 5.1.2 final로 바뀌며 정상 실행 됐습니다.인텔리제이가 충돌하는 라이브러리를 다운받기도 하는 것 같습니다.