[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 홀수 짝수 구하는 문제에서 선생님께서 말씀하신 삼항연산자로 구하는 거 기억 더듬으며 해봤는데 값은 나오거든요.. 혹시 잘못되거나 이상한 점이 없는지 질문드립니다!!
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
이번에 만든 조회하는 api는 리스트로 반환해야 하기 때문ㅇ JSON이어야 하고 그렇기에 함수 반환 값이 List<UserResponse>인건가요? 그리고 등록 api에서 만든 users리스트 수만큼 for문 돌려서 진정한 결과 리스트(id도 포함되어있는) reponses를 만들어낸건가요..?
현재 실전 데이터 JPA수강 중인데요.. 독학 중이라 토이프로젝트로 연습하는데 오늘까지 배운 JpaRepository 상속과 관련하여 회원가입 기능 구현하려 하려는데 어디 물어볼곳이 없고 뒤죽박죽이라 정리가 필요해서 장문의 질문을 남깁니다.. 일단 제가 머릿속에 정리가 안되는 것은 영한선생님께서 최대한 컨트롤러에 엔터티를 노출하지 말고 비지니스 로직을 서비스에서 최대한 구현하라고 해서 따라하는 중인데 Member를 기준으로 파라미터를 받을 MemberForm을 생성했습니다. 여기서 질문이.. MemberForm을 생성했으면 MemberDto는 따로 생성 안해도 될까요? 컨트롤러를 그림과 같이 작성하였고 서비스는 아래와같이 하였는데... 뭔가 서비스에서 엔터티를 직접 만지니까 찝찝한데 실무에서도 이렇게 하는지 궁금합니다..
는 어떻게 하는 것이 좋은 건가요? PK이자 글 번호인 boardSeq를 가지고 와서 수정과 삭제를 진행하고 있었는데, PK는 최대한 외부로 노출하지 않는 것이 좋다고 하여서 문득 생각이 들었습니다. PK Seq를 따로 두고 UniqueKey로 똑같이 AutoIncrement해서 생성하게 된다면 결국 무슨 차이인가 싶어서 아닌 거 같기도 하고... 어떤 식으로 처리 해야 되는지 궁금하여 질문 남기게 되었습니다.
회원 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.
해당 강의에서 보여주시는 메모리 화면에서 메모리 주소 오른쪽에 있는 문자들은 앞에 0x가 따로 없는데도 16진수라고 하셨는데, 저 문자들은 그냥 16진수 읽기로 약속된 문자들 이라고 이해하면 될까요 ?? 그리고 그렇다면 왜 앞에 0x가 붙어있지 않은지도 알려주실 수 있나요 ??
제가 scanf("%s",stringarr)를 이용해서 콘솔 입력(키보드)에 데이터를 이용하면 1. 화면에 커서가 깜빡깜빡 거리면서 콘솔화면(모니터)창에 쓰는 값이 보이는데 이게 입력 버퍼인가요? (그리고 이러한 버퍼는 일반적으로 4kB까지 입력을 칠 수 있는 건가요?) 아니면 입력 버퍼는 저희 눈에 안보이고 "CON"이라는 파일안에 들어가 있는 건가요? 이 부분이 혼동이 옵니다. 리눅스에 man puts 를 쳐서 설명을 보니 개행 문자가 딸려온다고 써져 있습니다. puts("")로 치면 출력버퍼안에 \n이 있다는 말인가요? 그렇다면 출력 버퍼는 \n으로 인해 비워지게 된건지 궁금합니다 질문과는 다른 이야기인데 4kB는 페이지 크기도 4kB인데 이게 무엇을 기준으로 나눈 건가요?? ps/ 수업을 너무 많이 듣고 정리하면서 이러한 개념들이 혼동이 생기네요... 마음은 급하고 배울건 많고, 배운건 또 안보면 까먹고 왕도가 없네요 하하.. 항상 열심히 수업듣고있습니다. 감사합니다.
버퍼 공부하다가 궁금합니다. 제가 이해한 바로는 \n은 I/O 버퍼를 비우기 위해 사용하는 이스케이프 시퀀스 라고 이해했습니다. string에서 char Id[7] = {1} 라고 초기화를 주고 scanf("%s",Id); 이라고하고 코드를 작성합니다. 작성한 코드를 프로그램에 컴파일 한 이후 런 타임때, "null" 을 입력하고 엔터를 치면 Id의 0번 주소의 값은 n 1번 주소의 값은 u 2번 주소의 값은 l 3번 주소의 값은 l 이 됩니다. 그렇게 하고 개행 문자인 엔터를 칩니다. 이때 여기서 궁금증이 생깁니다. 버퍼안에 \0와 \n 어느 게 먼저 들어가는 건가요? \0 을 이용해서 문자열을 모두 읽었다고 표시를 한다고 이해했습니다. 이렇게 하고 엔터를 치면 개행 문자 \n이 들어가는데 실제 메모리 상에서는 null\01\n 으로 찍히는지 궁금합니다.
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(); 이런 코드들은 어떻게 바꿔야 하나요? 강의자료에 나와있지 않은 것 같습니다.