inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

12:15와는 다른 화면이 나옵니다.

해결됨

스프링과 JPA 기반 웹 애플리케이션 개발

읽기 쉽게 fragments.html에 있는 코드를 settings.tags.html에 옮겨 적었습니다. 코드 내용 <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Study Club</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"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@yaireo/tagify@3.5.1/dist/tagify.css"> <script src="https://code.jquery.com/jquery-3.4.1.min.js"></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%; } .tagify-outside{ border: 0; padding: 0; margin: 0; } </style> </head> <body class="bg-light"> <nav class="navbar navbar-expand-sm navbar-dark bg-dark"> <a class="navbar-brand" href="/" th:href="@{/}"> <img src="/images/logo_symbol.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="!isAuthenticated()"> <a class="nav-link" th:href="@{/login}">로그인</a> </li> <li class="nav-item" sec:authorize="!isAuthenticated()"> <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"></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)}" data-jdenticon-value="user127" 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> <div class="container"> <div class="row mt-5 justify-content-center"> <div class="col-2"> <div 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 == 'notifications'}? active" href="#" th:href="@{/settings/notifications}">알림</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> </div> <div class="col-8"> <div class="row"> <h2 class="col-12">관심있는 스터디 주제</h2> </div> <div class="row"> <div class="col-12"> <div class="alert alert-info" role="alert"> 참여하고 싶은 스터디 주제를 입력해 주세요. 스터디가 생기면 알림을 받을 수 있습니다. 태그 입력 후 콤마(,) 또는 엔터를 입력하세요. </div> <input id="tags" type="text" name="tags" class="tagify-outside" aria-describedby="tagHelp"/> </div> </div> </div> </div> </div> <script type="application/javascript" th:inline="javascript"> $(function () { var csrfToken = /*[[${_csrf.token}]]*/ null; var csrfHeader = /*[[${_csrf.headerName}]]*/ null; $(document).ajaxSend(function (e, xhr, options){ xhr.setRequestHeader(csrfHeader, csrfToken); }); }); </script> <script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify@3.5.1/dist/tagify.min.js"></script> <script type="application/javascript" th:inline="javascript"> $(function() { function tagRequest(url, tagTitle) { $.ajax({ dataType: "json", autocomplete: { enabled: true, rightKey: true, }, contentType: "application/json; charset=utf-8", method: "POST", url: "[(${baseUrl})]" + url, data: JSON.stringify({'tagTitle': tagTitle}) }).done(function (data, status) { console.log("${data} and status is ${status}"); }); } function onAdd(e) { tagRequest("/add", e.detail.data.value); } function onRemove(e) { tagRequest("/remove", e.detail.data.value); } var tagInput = document.querySelector("#tags"); var tagify = new Tagify(tagInput, { pattern: /^.{0,20}$/, whitelist: JSON.parse(document.querySelector("#whitelist").textContent), dropdown : { enabled: 1, // suggest tags after a single character input } // map tags }); tagify.on("add", onAdd); tagify.on("remove", onRemove); // add a class to Tagify's input element tagify.DOM.input.classList.add('form-control'); // re-place Tagify's input element outside of the element (tagify.DOM.scope), just before it tagify.DOM.scope.parentNode.insertBefore(tagify.DOM.input, tagify.DOM.scope); }); </script> </body> </html> 결과 화면

  • java
  • spring
  • spring-boot
  • jpa
  • thymeleaf
꿀잼사슴 댓글 1 좋아요 0 조회수 355

sql 로그가 나오지 않습니다..

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 본 강의에서 선생님 화면처럼 sql 이 로그에 나오지 않습니다. yml 파일은 똑같이 작성했는데도 나오지 않는 이유를 모르겠습니다...

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
rr8602 댓글 2 좋아요 0 조회수 616

spring mapping 여러개 문의 드립니다

미해결

토비의 스프링 부트 - 이해와 원리

안녕하세요 토비님 제가 자주 질문 드려서 싫어 하실거 같네요.. https://www.url01.urlcom/충청도 or 제주도 or 인제군 or ...(지자체 정보 170개 ) 이런식으로 ~ Controller.java 170개의 경우를 겟매핑이나 포스트매핑(보안문제로) 해야 합니다 @GetMapping({ '/충청도', '/제주도', or '/인제군' or ......이런식으로 170 개의 지자체 }) 아래 부분을 위해서 수기 타이핑 문자열이 아닌 db에서 불러와서 배열로 넣을려고 하니 되지 않아서 제가 잘못 생각하고 있는지 여쭤봅니다 변수 = 서비스.지자체리스트; //170개 db에서 꺼내옴 @GetMapping({ value = 변수 }) ==> 이거 원래 안되는 것일 까요? 계속 스택오버플로우나 구글링 찾아봐도 제가 답을 못 찾았습니다 혹시 원래 되는 기능 이라면 , 제가 어디 문서를 찾아 봤었어야 할까요? ( 예를 들면 토비님 같은 경우 스프링 공식 문서 샘플 설명 사이트 나, 자주 방문하는 이 사이트 찾아 보면 금방 답이 나왔을 것이다 이런 부분 알려 주시면 감사합니다.. )

  • spring
  • spring-boot
  • spring-jdbc
주아아빠 댓글 1 좋아요 0 조회수 762

페이징 관련 파라미터 질문

미해결

실전! 스프링 데이터 JPA

강의를 보다가 궁금한 점이 생겨 이렇게 질문을 남깁니다 ! 프론트에서 page, size, sort 정보를 파라미터로 넘길텐데 /** * 페이징과 정렬 */ @GetMapping("/members") public Page<Member> list(Pageable pageable) { Page<Member> page = memberRepository.findAll(pageable); return page; } 여기서 그러면 알아서 pageable 객체로 바인딩 되는 것인가요 ? 따로 설정할 필요가 없이 page, size 값을 알아서 바인딩 시켜주는 것인지 궁금합니다.

  • java
  • spring
  • spring-boot
  • jpa
백엔드공부화이팅 댓글 1 좋아요 0 조회수 383

핀포인트 질문

미해결

스프링 부트 - 핵심 원리와 활용

pinpoint docker 받아서 docker compose로 실행해봤는데요. 기본으로 제공되는 quickapp에서 api 요청을 계속해서 날려도 핀포인트 웹 컨트롤러에서 초반에 2~3건정도만 기록될 뿐, 추가적인 api 성공기록이 남질 않더라구요. 원래 그런건가요? 다른 api 요청도 보내봤는데 아예 기록에 안남습니다

  • spring
  • spring-boot
  • prometheus
  • grafana
sujeng98 댓글 2 좋아요 0 조회수 438

@SpringBootTest 사용 이유가 궁금합니다.

미해결

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

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] @SpringBootTest 사용 이유가 궁금합니다. 강의에서 MemberServiceTest에서는 사용하지 않고 MemberServiceIntegrationTest에서는 사용을 합니다. 자료에는 "스프링 컨테이너와 테스트를 함께 실행한다." 라고 간략하게 설명이 되어 있습니다. 제가 이해가 부족하여 영상 및 해당 설명으로 이해가 되지 않습니다. 제가 이해한 바로는 @SpringBootTest는 DB를 사용하여 넣는 건지 궁금합니다. 감사합니다.

  • java
  • spring
  • mvc
  • spring-boot
꾸깐 댓글 2 좋아요 0 조회수 458

페치조인 관련 질문

미해결

실전! 스프링 데이터 JPA

페치조인은 그렇다면 어떤 경우에 사용해야 한다고 봐야 하나요 ? 양방향 매핑이 되어 있는 엔티티들의 경우에는 거의 쓴다고 보면 될까요 ?

  • java
  • spring
  • spring-boot
  • jpa
백엔드공부화이팅 댓글 1 좋아요 0 조회수 353

@oneToMany의 @oneToMany

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니요) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 EntityA 1:N EntityB EntityB 1:N EntityC 이런식으로 있을 때 , EntityA 가 EntityB를 @oneToMany로 가지고있고, EntityB 가 EntityC를 @oneToMany로 가지고 있습니다. 배치사이즈 옵션을 넣고 select a from EntityA a 했을때 , EntityA의 갯수만큼 EntityB에 in절로 EntityA의 키값을 넣어서 @oneToMany를 한번에 끌고왔다고 했을 때 , EntityB안에있는 EntityC를 또 EntityB의 갯수만큼 EntityC에 in절로 EntityB의 키값을 넣어서 한번에 끌고 올 수 있는 방법이 있는지 궁금했습니다. 다중 페치조인 안되는걸 알지만 예를 들어서 이런걸 원한다고 생각하시면 될 것 같습니다 select a from EntityA a join fetch EnitityB(List) b join fetch b.EntityC(List) 이런식으로 컬럼 갯수가 일대다 일대다로 기하급수적으로 증가하는 경우인데 배치사이즈를 사용하여 select a from EntityA a 를 했을 땐 a.EntityB 에 접근할때 당연히 in 절로 가져와주지만 EntityB의 일대다인 EntityC 를 조회 할 땐 N+1이 다시 터집니다 엮여있는 모든 연관관계들을 IN절로 태우고 싶은데 방법이 없을까요?

  • java
  • spring
  • spring-boot
  • jpa
vnfthr 댓글 1 좋아요 1 조회수 391

Class나 Entity 만들 때 접근제어자 관련해서 질문이 있습니다!

미해결

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

자바에서는 Entity나 클래스를 만들 때 접근 제어자로 private을 붙이는게 일반적이었는데요. 코틀린에서는 그렇게 하면 객체를 생성하고도 밖에서 바로 접근이 안 되는 거 같네요ㅠ private을 붙여주고 custom getter 같은걸로 객체 생성 후 호출하게 해주는 것이 좋은가요? 아니면 접근 제어자를 안 붙이고 그냥 쓰는게 좋은가요..?

  • java
  • spring
  • kotlin
  • spring-boot
  • 리팩토링
비가싫어요 댓글 1 좋아요 1 조회수 397

v6에서 groupingBy가 아닌 distinct

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요! [강의] 주문 조회 V6: JPA에서 DTO로 직접 조회, 플랫 데이터 최적화 관련해서 궁금한 점이 있습니다. findAllByDto_flat()에서 distinct를 통해 중복을 제거하는게 아니라 강의와 같이 findAllByDto_flat() 호출 후 groupingBy를 통해 중복을 제거했을 때 서로 어떤 차이가 있나요?

  • java
  • spring
  • spring-boot
  • jpa
.. 댓글 1 좋아요 0 조회수 499

수업 자료 코드 오타

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

강의에서는 List<Order> orders = orderRepository.findAllByString(new OrderSearch()); 로 수업해주시는데 강의자료에는 List<Order> orders = orderRepository.findAll(); 로 나와있습니다.

  • java
  • spring
  • spring-boot
  • jpa
enimbe99 댓글 2 좋아요 0 조회수 287

tcp 접속에서 오류. File corrupted while reading record

해결됨

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

안녕하세요. 먼저 h2를킨다음, application.yml 파일에서 주소 url: jdbc:h2:~/jpashop 를 통해 실행하면, User 폴더에 jpashop.mv 파일이 생성은 됩니다. 그런데 tcp 를 통해 접속하기위해 주소 url: jdbc:h2:tcp:// localhost/~/jpashop 를 입력한다음 intelliJ를 다시 실행하니 File corrupted while reading record: null. Possible solution: use the recovery tool [90030-214] 실행창에 이런 경고가 뜨면서 연결되지않고 꺼집니다. h2에 문제가있나싶어서 h2를 전부 제거하고 1.4.200 버전으로 새로 깔았는데도 문제가 해결되지 않습니다. 이전동안 문제없이 잘되었는데 알수없는이유로 안되네요 어디가 문제일까요...

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
morrison 댓글 1 좋아요 0 조회수 349

@Autowired와 @Transactional으로 EntityManager주입 받기

미해결

실전! 스프링 데이터 JPA

@Autowired로 EntityManager를 주입받을때 여러 쓰레드가 동시에 접근하면 동시성 문제가 발생합니다. 하지만 @Transactional 을 추가해준다면 //1 @Repository @RequiredArgsConstructor @Transactional public class AutowiredRepository { private final EntityManager em; } //2 @Repository public class PersistenceContextRepository { @PersistenceContext private EntityManager em; } @PersistenceContext 처럼 Transaction에 의해 쓰레드간 동시성 문제를 해결해준다 고 생각하는데 맞게 생각한건지 궁금합니다. 두가지 방법 다 EntityManager를 호출 할때마다 Proxy를 통해 EntityManager를 생성하여 Thread-Safe를 보장해준다라고 볼수 있는 건가요?? 답변주시면 정말 감사하겠습니다.

  • java
  • spring
  • spring-boot
  • jpa
코딩먹는하마 댓글 1 좋아요 1 조회수 623

연관관계 편의 메서드 주인

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 네 [질문 내용] 여기에 질문 내용을 남겨주세요. 연관관계 메서드에서 addOrderItem메서드의 orderItem.add(orderItem)부분을 보면 연관관계 주인이 아닌곳에 값을 설정해 주는데 이렇게 하면 값이 들어가지 않는다고 알고 있는데 왜 주인이 아닌곳에 값을 넣어주는 건가요?? 바로 밑에 orderItem.setOrder(this) 이런식으로 오더를 넣어주는 상황이면 주인이 아닌쪽에서도 값을 넣을 수 있는건가요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
캄캄한인생 댓글 2 좋아요 0 조회수 509

14강 @PutMapping 작성에 오류가 발생합니다.

미해결

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

UserController.java UserUpdateRequest.java 지난 강의에서 사용한 @PostMapping @GetMapping, 이번강의에서 PutMapping과 같이 사용한 @DeleteMapping은 정상적으로 작동이 되지만 @PutMapping만 문제가 발생하여 질문드립니다. Import가 안됐나 싶어 Import를 시도해보았지만 Import와 관련된 문제는 아니었던것 같습니다. @PutMapping과 updateUser의 @RequestBody 공통적으로 Annotations are not allowed here가 발생합니다.

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
이승환 댓글 1 좋아요 0 조회수 638

프로메테우스 그라파나 스프링부트 여러개 연동

미해결

스프링 부트 - 핵심 원리와 활용

스프링부트 api 서버가 여러개 있을때 그라파나에서 각각 서버 모니터링 하고 싶은데 이럴땐 어떻게 하나요?

  • spring
  • spring-boot
  • prometheus
  • grafana
sujeng98 댓글 1 좋아요 0 조회수 1009

맥북에서 빌드 오류

미해결

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

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 2019년형 맥북 사용중인데요, .gradlew build 부분에서 자꾸 오류가 나네요. 왠만한거 검색이랑 다른 토론글로 자바 11로 다 수정했는데 계속 오류가 나요. 마지막사진에 자바 버전이 1.8 로 되어있어서 그것도 바꿀려고 했는데 계속 안바뀌네요...혹시 뭐가문제인지 알수있을까요?

  • java
  • spring
  • mvc
  • spring-boot
georgek1205 댓글 1 좋아요 0 조회수 562

수정완료를 눌렀을때 첫번째 데이터는 전송이 안되고 다시 수정완료 버튼을 눌러야 데이터가 전송 됩니다.

미해결

[개념은 호옹~, 실습 빡] 스프링 부트, 입문!

수정완료를 눌렀을때 처음 데이터는 전송이 안되고 다시 수정완료 버튼을 눌러야 데이터가 전송 됩니다. 위 사진과 같이 첫번째 시도에 입력한 수정 데이터는 서버로 전송이 되지 않고 있습니다. 다시한번 수정완료 버튼을 눌러야 그제야 데이터가 서버로 전송되는데 어느 부분이 문제 인지를 모르겠습니다. DB를 확인해보봐도 두번째 클릭했을때만 데이터가 전송됩니다. <_list.mustache> <div id = "comments-list"> {{#commentDtos}} <div class = "card m-2" id = "comments-{{id}}"> <div class = "card-header"> {{nickname}} <!--모달 트리거 버튼--> <button type="button" class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" data-bs-target="#comment-edit-modal" data-bs-id="{{id}}" data-bs-nickname="{{nickname}}" data-bs-body="{{body}}" data-bs-article-id="{{articleId}}" > 수정 </button> </div> <div class = "card-body"> {{body}} </div> </div> {{/commentDtos}} </div> <!-- Modal --> <div class="modal fade" id="comment-edit-modal" tabindex="-1"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h1 class="modal-title fs-5" id="exampleModalLabel">댓글 수정</h1> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <!--댓글 수정폼 --> <form name = "edit-form"> <!-- 닉네임 입력--> <div class = "mb-3"> <label class = "form-label">닉네임</label> <input type ="text" class = "form-control form-control-sm" id ="edit-comment-nickname"> </div> <!--댓글 본문 입력--> <div class = "mb-3"> <label class = "form-label">댓글 내용</label> <textarea type ="text" class = "form-control form-control-sm" row = "3" id="edit-comment-body"></textarea> </div> <!--히든 인풋--> <input type = "hidden" id = "edit-comment-id" > <input type = "hidden" id = "edit-comment-article-id" > <!--전송 버튼--> <button type = "button" class = "btn btn-outline-primary btn-sm" id="comment-update-btn">수정 완료</button> </form> </div> </div> </div> </div> <!--모달 이벤트 처리--> <script> { // 모달 요소 선택 const commentEditModal = document.querySelector("#comment-edit-modal"); // 모달 이벤트 감지 commentEditModal.addEventListener("show.bs.modal",function(event){ //트리거 버튼 선택 const triggerBtn = event.relatedTarget; //데이터 가져오기 const id =triggerBtn.getAttribute("data-bs-id"); const nickname =triggerBtn.getAttribute("data-bs-nickname"); const body =triggerBtn.getAttribute("data-bs-body"); const articleId =triggerBtn.getAttribute("data-bs-article-id"); //데이터 반영 document.querySelector("#edit-comment-nickname").value = nickname; document.querySelector("#edit-comment-body").value = body; document.querySelector("#edit-comment-id").value = id; document.querySelector("#edit-comment-article-id").value = articleId; }); } { //수정완료버튼 const commentUpdateBtn = document.querySelector("#comment-update-btn"); //클릭 이벤트 감지 및 처리 commentUpdateBtn.addEventListener("click",function(){ // 수정 댓글 객체 생성 const comment = { id :document.querySelector("#edit-comment-id").value, nickname:document.querySelector("#edit-comment-nickname").value, body:document.querySelector("#edit-comment-body").value, article_id:document.querySelector("#edit-comment-article-id").value }; console.log(comment); // 수정 REST API 호출 { // 수정 완료 버튼 const commentUpdateBtn = document.querySelector("#comment-update-btn"); //클릭 이벤트 감지 및 처리 commentUpdateBtn.addEventListener("click",function(event){ //수정 댓글 객체 생성 const comment = { id: document.querySelector("#edit-comment-id").value, nickname: document.querySelector("#edit-comment-nickname").value, body:document.querySelector("#edit-comment-body").value, article_id:document.querySelector("#edit-comment-article-id").value }; console.log(comment); //수정 REST API 호출 - fetch() const url = "/api/comments/" + comment.id; fetch(url,{ method: "PATCH", //patch 요청 body: JSON.stringify(comment), // 수정된 댓글 객체를 JSON으로 전달 headers: {"Content-Type" : "application/json"} }).then(response => { // 응답 코드에 따른 메시지 const msg = (response.ok) ? "댓글이 수정 되었습니다." : "댓글 수정 실패"; alert(msg); // 현재 페이지 새로고침 window.location.reload(); }); }); } }); } </script>

  • spring-boot
lee86384 댓글 1 좋아요 0 조회수 506

String accessToken = authorizationHeader.split(" ")[1];은 accessToken이 맞나요?

미해결

생산성을 향상시키는 스프링부트 기반의 API 템플릿 프로젝트 구현

강사님 안녕하세요 수업 잘 듣고 있습니다. 덕분에 도전하기 힘들었던 인증인가를 조금이나마 이해하게 되고 있는 것 같습니다. 수업을 듣던 중 한가지 궁금한 점이 생겨서 질문 남기게 되었습니다. LoginController에서 String accessToken = authorizationHeader.split(" ")[1]; 이라는 변수를 선언하는데 저는 authorizationHeader.split(" ")[1]이 accessToken인지 accessToken을 포함한 jwt인지가 헷갈립니다. 혹시 이 부분과 관련하여 제가 어떻게 이해하면 좋을지 조언 해주실 수 있으실까요? 감사합니다.

  • spring-boot
  • jpa
  • web-api
3ㅇ 댓글 1 좋아요 0 조회수 323

6:40 샘플데이터 EntityManager 인식문제.

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

트랜잭션안에 쓸수있는 EntityManager 없다고 에러가 뜹니다. 설정 문제인걸까요? org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'initDb': Invocation of init method failed; nested exception is javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:160) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:440) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:921) ~[spring-context-5.3.29.jar:5.3.29] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.29.jar:5.3.29] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.14.jar:2.7.14] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-2.7.14.jar:2.7.14] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.14.jar:2.7.14] at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.7.14.jar:2.7.14] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.7.14.jar:2.7.14] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.7.14.jar:2.7.14] at jpabook.jpashop.JpashopApplication.main(JpashopApplication.java:10) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:50) ~[spring-boot-devtools-2.7.14.jar:2.7.14] Caused by: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:299) ~[spring-orm-5.3.29.jar:5.3.29] at jdk.proxy3/jdk.proxy3.$Proxy119.persist(Unknown Source) ~[na:na] at jpabook.jpashop.InitDb$InitService.dbInit1(InitDb.java:34) ~[main/:na] at jpabook.jpashop.InitDb.init(InitDb.java:20) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:389) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:333) ~[spring-beans-5.3.29.jar:5.3.29] at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:157) ~[spring-beans-5.3.29.jar:5.3.29] ... 23 common frames omitted 제코드입니다. package jpabook.jpashop; import jpabook.jpashop.domain.*; import jpabook.jpashop.domain.item.Book; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import javax.persistence.EntityManager; @Component @RequiredArgsConstructor public class InitDb { private final InitService initService; @PostConstruct public void init() { initService.dbInit1(); } @Component @Transactional @RequiredArgsConstructor static class InitService { private final EntityManager em; private void dbInit1() { Member member = new Member(); member.setName("UserA"); member.setAddress(new Address("서울", "1", "1111")); em.persist(member); Book book1 = new Book(); book1.setName("JPA1 BOOK"); book1.setPrice(10000); book1.setStockQuantity(100); em.persist(book1); Book book2 = new Book(); book2.setName("JPA2 BOOK"); book2.setPrice(20000); book2.setStockQuantity(100); em.persist(book2); OrderItem orderItem1 = OrderItem.createOrderItem(book1, 10000, 1); OrderItem orderItem2 = OrderItem.createOrderItem(book2, 20000, 1); Delivery delivery = new Delivery(); delivery.setAddress(member.getAddress()); Order order = Order.createOrder(member, delivery, orderItem1, orderItem2); em.persist(order); } } }

  • java
  • spring
  • spring-boot
  • jpa
doww 댓글 3 좋아요 0 조회수 471

인기 태그

인프런 TOP Writers

주간 인기글