회원 A테이블과 팀C 테이블의 다대다 양방향 관계를 풀기 위해 중간 테이블을 도입하여 A, B(중간테이블), C 와 같이 일대다/다대일 관계로 풀어낼 때 A와 C 양 쪽 모두 addTemMember와 같은 메소드를 만들어주고, 회원이 팀에 들어갈 때 A.addTeamMember와 C.addTeamMember()둘 다 호출해줘야 하는 게 맞나요? 다대다 양방향 관계를 풀 때 중간 테이블을 설정하는데 이것은 따로 외부에 노출할 필요 없이, 내부적으로 회원 A가 어떤 팀에 속해있는지, 팀C에 어떤 회원이 속해있는지 확인할 때만 사용하는 것이 맞나요?
강의 내용을 보면 상품 목록 화면에서 item.id 값을 뿌려주고 있습니다. 이건 DB 에 저장된 item 테이블의 PK 값 일텐데, 문득 이런 생각이 들었습니다. DB 데이터 관리를 위한 PK 를 클라이언트 단에 노출시켜도 되나요? (가급적 엔티티 객체를 클라이언트 단에 직접 노출시키지 말라고 하셔서, 이것도 비슷한 맥락으로 숨겨야되지 않을까 해서요)
plugins { id 'java' id 'org.springframework.boot' version '3.2.2' id 'io.spring.dependency-management' version '1.1.4' } group = 'hello' version = '0.0.1-SNAPSHOT' java { sourceCompatibility = '17' } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' // implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' runtimeOnly 'com.h2database:h2' testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { useJUnitPlatform() } 자바 17 로 잘되어있고 한데 자꾸 무슨 21이 보이고 웹에서는 정상 작동 하는데 테스트에서만 문제가 발생합니다. 해결 부탁드립니다. ㅠㅠ WARNING: A Java agent has been loaded dynamically (C:\Users\ㅋㅋ\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.14.11\f9cb566608fbac6bc7bf54901a7aa11543a989ee\byte-buddy-agent-1.14.11.jar) WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information WARNING: Dynamic loading of agents will be disallowed by default in a future release 2024-01-31T22:27:28.360+09:00 WARN 3716 --- [ main] o.s.test.context.TestContextManager : Caught exception while invoking 'beforeTestMethod' callback on TestExecutionListener [org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener] for test method [public void hello.hellospring.sevice.MemberServiceIntegrationTest.회원가입() throws java.lang.Exception] and test instance [hello.hellospring.sevice.MemberServiceIntegrationTest@7901a5ab] java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null) at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.java:84) ~[mockito-core-5.7.0.jar:na] at jdk.proxy2/jdk.proxy2.$Proxy112.getHandler(Unknown Source) ~[na:na] at org.mockito.internal.util.MockUtil.getMockHandlerOrNull(MockUtil.java:158) ~[mockito-core-5.7.0.jar:na] at org.mockito.internal.util.MockUtil.isMock(MockUtil.java:147) ~[mockito-core-5.7.0.jar:na] at org.mockito.internal.util.DefaultMockingDetails.isMock(DefaultMockingDetails.java:32) ~[mockito-core-5.7.0.jar:na] at org.springframework.boot.test.mock.mockito.MockReset.get(MockReset.java:106) ~[spring-boot-test-3.2.2.jar:3.2.2] at org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener.resetMocks(ResetMocksTestExecutionListener.java:85) ~[spring-boot-test-3.2.2.jar:3.2.2] at org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener.resetMocks(ResetMocksTestExecutionListener.java:73) ~[spring-boot-test-3.2.2.jar:3.2.2] at org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener.before:na] at org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.create(DefaultMockitoPlugins.java:103) ~[mockito-core-5.7.0.jar:na] ... 67 common frames omitted Caused by: org.mockito.exceptions.base.MockitoInitializationException: Could not initialize inline Byte Buddy mock maker. It appears as if your JDK does not supply a working agent attachment mechanism. Java : 21 JVM vendor name : Oracle Corporation JVM vendor version : 21.0.1+12-29 JVM name : OpenJDK 64-Bit Server VM JVM version : 21.0.1+12-29 JVM info : mixed mode, sharing OS name : Windows 10 OS version : 10.0 at org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.<init>(InlineDelegateByteBuddyMockMaker.java:260) ~[mockito-core-5.7.0.jar:na] at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.<init>(InlineByteBuddyMockMaker.java:23) ~[mockito-core-5.7.0.jar:na] at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) ~[na:na] ... 70 common frames omitted Caused by: java.lang.IllegalArgumentException: null at java.instrument/sun.instrument.InstrumentationImpl.appendToClassLoaderSearch0(Native Method) ~[na:na] at java.instrument/sun.instrument.InstrumentationImpl.appendToBootstrapClassLoaderSearch(InstrumentationImpl.java:280) ~[na:na] at org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMaker.<clinit>(InlineDelegateByteBuddyMockMaker.java:177) ~[mockito-core-5.7.0.jar:na] ... 72 common frames omitted 2024-01-31T22:27:28.368+09:00 WARN 3716 --- [ main] o.s.test.context.TestContextManager : Caught exception while invoking 'afterTestMethod' callback on TestExecutionListen
keycloak 버전이 제일 낮은 게 20 버전이라서 저는 가장 최근 버전인 23 버전으로 사용했습니다. 23 버전 기준으로, 제가 파악한, 강의와 다른 부분입니다. 20 버전부터는 최초 로그인 할 때 동의 항목이 안 나올텐데요. 관리자 콘솔에서 Clients -> Cliend details에서 Login settings에서 Consent required를 켜면 됩니다. 엑세스 토큰 발급 이후에 userinfo 엔드포인트로 user 데이터를 요청하면 body에 아무 것도 안 나올 겁니다. 응답 헤더 살펴보면 insufficient_scope이며 Missing openid scope이라고 나오는데요. 이렇게만 써있으면 userinfo 요청할 때 param에 scope=openid 넣으면 될 것 같지만 안 됩니다. 토큰에 해당 정보가 없는 거라서, 토큰 발급 전에(code 얻어야할 때) scop에 openid를 추가하면 됩니다. http://localhost:8080/realms/oauth2/protocol/openid-connect/auth?response_type=code&client_id=oauth2-client-app&scope=profile email openid&redirect_uri=http://localhost:8081 공식문서 에 나와 있습니다. In case an access token is missing openid scope.
안녕하세요 또 이렇게 질문을 해서 죄송합니다. 마지막 강의까지 다 듣고 배포까지 했는데 갑자기 홈 화면에 오른 화살표를 클릭을 하면 지금 1월 인데 누르면 3월로 이동 됩니다. 그런데 1월에서 2월 넘어갈때만 그래요 뒤로 가는건 잘 작동합니다. 홈 강의 다시 보고 틀린거 있나 확인했는데 못 찾아서 이렇게 연락드려요 https://github.com/jeain/Diary
List<ContentsDtoRes> contents = queryFactory .selectFrom(ParentEntity) .leftJoin(ParentEntity.childList, childEntity) .leftJoin(childEntity.childChildEntity, childchildEntity) .where( systemDelYnEq(condition.getDelYn()), autoDelYnEq(condition.getDelYn()) ) .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .transform( groupBy(systemEntity.sysId).list( new QContentsDtoRes( parentEntity.a, parentEntity.b, parentEntity.c, parentEntity.d, parentEntity.e, list( new QChildDto( childEntity.a, childEntity.b ) ), list( new QchildChildDto( childChild.a, childChild.b, childChild.c, childChild.d ) ) ) ) ); 안녕하세요 강사님. ㅎ Querydsl 의 일대다 관계에 대해서 질문이있어 올리게되었습니다. 예를들어 위와 같이 부모엔티티와 자식엔티티의 일대 다 관계가 될 경우 ParentEntity 는 존재하고 childEntity 가 없을 경우 querydsl 에서는 NPE 가 아닌 빈객체를 반환하게 되는데 아래와 같이 @QueryProject 생성자 하위에서 이렇게 빈객체를 체크하고 비워주는 작업을 할 수 밖에 없는건가요.? this.childList.addAll(childList.stream() .filter(child -> child.getId() != null).collect(Collectors.toList())); this.childChildList.addAll(childChildList.stream() .filter(childchild -> childchild.getId() != null).collect(Collectors.toList())); } 혹시 다른 방법이 있다면 어떤 방법이 있을지 궁금합니다. 항상 좋은강의 감사합니다.! 좋은하루되세요
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. cascadeType.all! 일단 저장할때 자식 객체를 다 담은 후 이후 부모 를 repository.save (부모) 하면 자식도 함께 저장되는 것을 강의 내용을 통해서 확인했습니다. 그러면 혹시 이 과정에 대해서는 어떻게 생각하시나요 Program program = programRepository.findById(reviewSaveDto.getProgramId()) .orElseThrow(() -> new NotFoundException(ErrorCode.PROGRAM_NOT_FOUND)); Review review = Review.builder() .content(reviewSaveDto.getContents()) .user(user) .program(program) .rating(reviewSaveDto.getRating()) .genre(usersFirstGenre.getName()) .build(); program.addReview(review); 보시면 program 을 리포지토리에서 찾아와서 Review 를 직접 생성한 후 addReview(review) 를 통해서 저장합니다. @OneToMany(mappedBy = "program", cascade = CascadeType.ALL, orphanRemoval = true) private List<Review> reviewList = new ArrayList<>(); public void addReview(Review review) { this.reviewList.add(review); 당연히 cascade가 발라져있고요!. 이러면 코드는 정상동작합니다. 저는 뭔가 ReviewRepository에서 program 세팅하고 이러는 것 보다 위 방법이 더 뭐랄까 직관적이다?(프로그램.addReview가 직관적이라는 느낌) 이라서 이 것을 애용했는데 성능 상의 문제점이라던가 이런게 있을지 궁금합니다. addReview 를 한다고 바로 저장되지 않고 트랜잭션이 끝날때 변경 감지를 통해서 실행되는것 같은데(뇌피셜입니다) . 이렇게 해도 괜찮을지 궁금해요!!! 영한님!!!
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
아마존 리눅스 2023으로 인스턴스를 사용했을 때 지면님과 강사님께서 알려준 el9 버전 레포지토리를 사용하는 명령어 sudo dnf install <https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm> sudo dnf install mysql-community-server 이렇게 하여도 저는 계속 sudo dnf install mysql-community-server 해당 명령어를 통해 설치하려고 하면 The GPG keys listed for the "MySQL 8.0 Community Server" repository are already installed but they are not correct for this package. 이런 오류가 발생하였습니다. 계속 키가 옳지 않다는 오류가 생겼고 챗지피티랑 구글링을 통해 이것저것 해보다가 sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 sudo yum update 위의 두 명령어를 실행하고 sudo dnf install mysql-community-server 해당 명령어로 재설치 해주니 제대로 설치가 되었습니다! 제 추측으로는 KEY를 다시 받아오고 yum update 하는 과정이 필요했던 것 같습니다! 저와 같은 오류를 가지는 분들에게 도움이 되었으면 좋겠네요...!!!
fetchResults(), fetchCount()가 deprecated됐는데 강의에서 fetchResults()가 사용되는 QueryResults<Member> queryResults = queryFactory .selectFrom(member) .orderBy(member.username.desc()) .offset(1) .limit(2) .fetchResults(); 이런 코드들은 어떻게 바꿔야 하나요? 강의자료에 나와있지 않은 것 같습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의에서는 주로 H2 데이터베이스를 활용해 강의를 진행해주시는데, 실무에서는 데이터베이스를 다룰 때 보통 어떤 툴을 사용하는 지 궁금합니다.
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네 [질문 내용] 영한님 강의에서는 위와 같이 두 행의 데이터가 잘 조회되는데, 2024 버전으로 설치한게 잘못인건지 두번 쿼리를 날렸는데 이전 행에 덮어 씌워져 버리는 현상이 있습니다... 이유가 뭔지 모르겠네요 혹시 아시는분 답변 부탁드려요
비전공자를 위한 풀스택 맛집지도 만들기 프로젝트!: Front, Back-end 그리고 배포까지
제가 이해한 바가 맞는지 질문드립니다. 질문1. 마커를 찍을 시: 1. 주소를 좌표로 변환 2. 해당 좌표를 마커로 지도에 표시 의 처리 순서가 보장되어야 하므로, async await를 이용한 비동기처리를 해준 것이 맞나요? 질문 2. 비동기처리를 해주기 전에도 마커는 잘 찍혔는데, 그 말은 즉 주소를 좌표로 변환하고-> 좌표를 마커로 표시하는 순서로 코드가 실행되었다는 것 아닌가요? 그렇다면 api가 비동기적으로 이루어진다는 말이 잘 와닿지 않아서 질문드립니다. 감사합니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 혹시나 강사님 처럼 터미널에서 git log 바로 출력되는 방법 찾으시는 분 있을까봐 글 남깁니다. mac에서는 git로그 기본 출력이 vi로 설정되어 있어 터미널에서 바로 확인하기 매우 불편하다.터미널에 로그를 바로 출력하기 위해서는 기본 출력을 vi에서 cat으로 변경해주면 된다.아래 명령어 그대로 터미널에 복사해주세요.git config --global core.pager cat 출처 : https://mangu.tistory.com/91