안녕하세요 영한님. 다대다 연관관계를 공부하고 제 프로젝트에 적용하려다가 오류가 발생해서 질문드립니다. Product와 Tag를 다대다로 관계시키기 위해 ProductTag테이블을 만들었습니다. ResponseProduct에 Product를 넣어서 응답으로 보내려 하는데 이렇게 하니 Product->ProductTag->Tag ->ProductTag 이 과정이 무한반복이 일어나고 있습니다. 이것을 어떻게 해결하면 좋을까요? 항상 영상 잘 보고 있습니다. 화이팅 하세요!! public class ResponseProduct { private Product product; private Long categoryId; } @Entity public class Product { @OneToMany(mappedBy = "product", orphanRemoval = true) private List<ProductTag> productTags = new ArrayList<>(); } @Entity public class ProductTag { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "product_id") private Product product; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "tag_id") private Tag tag; } @Entity public class Tag { @OneToMany(mappedBy = "tag", orphanRemoval = true) private List<ProductTag> productTags = new ArrayList<>(); }
실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
우선 완강을 앞두고 있는데 추가 강의가 정말 흥미롭고 재밌었습니다. 감사합니다! 질문으로 넘어가자면.. [질문1 - 강의 중 allopen 플러그인 사용 여부] 강의를 듣는 와중에 7:30초쯤 말씀에는 사용했다고 하셨지만 제가 강의를 따라가면 작성해온 프로젝트 코드 내에서는 allopen관련 plugin이 build.gradle에 없었습니다. 혹시나 해서 강의 초반 자료로 주셨던 library-app-complete.zip 파일 내 build.gradle을 열어보았지만 안적혀 있었고 혹시 자동으로 연관된 dependency가 설치되었나 싶었지만 allopen을 검색해보았을때 찾기 못했습니다. 해당 플러그인이 사용안했던 것이 맞는지 궁금합니다! [질문2 - allopen 플러그인이 없어도 되었던 이유] 이게 없어도 프로젝트가 잘 작동한 이유가 Entity 클래스는 org.jetbrains.kotlin.plugin.spring 플러그인이 open 시켜주고 MappedSuperclass나 Embeddable 클래스는 강의 중 사용한 적이 없었기 때문에 몰랐다고 보는게 맞는건지도 궁금합니다! [강의 중 나온 allopen 플러그인 적용 코드 예시] id 'org.jetbrains.kotlin.plugin.allopen' version '1.6.21' allOpen { annotation("javax.persistence.Entity") annotation("javax.persistence.MappedSuperclass") annotation("javax.persistence.Embeddable") }
#include <stdio.h> void strcopy(char d[], const char s[]) { int i = 0; while (s[i] != '\0') { d[i] = s[i]; i++; } d[i] = '\0'; } int main() { char str1[] = "first"; char str2[50] = "teststring"; int result = 0; strcopy(str2, str1); for (int i = 0; str2[i] != '\0'; i++) { result += i; } printf("%d\n", result); for (int i = 0; i < 10; i++) { printf("%c", str2[i]); } } 출력값: 10 first ring printf("%c", str2[i]); // first ring 이렇게 출력되었는데 while (s[i] != '\0') { d[i] = s[i]; i++; } d[i] = '\0'; 여기서 while타고 s[i]에 first 마지막인 t 가 들어가면 다음 배열이 들어가지않으니 d[i] = '\0'; 들어가고 firist\0 담기는게 아닌가해서 질문드립니다. 그래서 출력값이 first ring 이렇게 나오는게 맞을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 위와 같은 에러가 뜹니다. 프로그램에서 java 11이나 jdk 11 버전은 모두 삭제되어 있습니다. (choco uninstall openjdk11 명령어 실행 시 openjdk11이 uninstall 되어있다는 fail이 뜸) 환경변수도 모두 17버전으로 맞춰놓은 상태입니다. ./gradlew build까지는 됐는데 java -jar 했을 때 오류가 납니다.
의도와 구현이 잘 이해가 가지 않아 예전에 작성 했던 코드를 가져와 아래와 같이 이해를 해볼려고 했는데 맞게 이해를 한건지 궁금합니다. save라는 네이밍으로 저장한다는 의미를 뜻함 -> 의도 코드 내부에는 DTO를 받아와 엔티티 객체로 변환하고 DB에 저장 로직 -> 구현 save 메서드 @Override public ServerMessageDto save(ServerMessageCreateRequest createRequest) { ServerMessage serverMessage = ServerMessage.builder() .serverId(createRequest.getServerId()) .channelId(createRequest.getChannelId()) .userId(createRequest.getUserId()) .parentId(createRequest.getParentId()) .profileImage(createRequest.getProfileImage()) .content(createRequest.getContent()) .writer(createRequest.getWriter()) .chatType(ChatType.SERVER) .actionType(ActionType.SEND) .files(createRequest.getFiles()) .build(); serverMessage.generateSequence(sequenceGenerator.generateSequence(ServerMessage.SEQUENCE_NAME)); return ServerMessageDto.from(messageRepository.save(serverMessage)); } postSend 라는 네이밍으로 ~ 후의 전송이라는 의미 -> 의도 코드 내부에는 특정 조건에 따라 함수 호출 로직 -> 구현 postSend 메서드 @Override public void postSend(Message<?> message, MessageChannel channel, boolean sent) { StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(message); if (StompCommand.CONNECT.equals(headerAccessor.getCommand())) { Long userId = sendConnectionStateInfo(headerAccessor); sendConnectionStateEvent(userId); } if (StompCommand.DISCONNECT.equals(headerAccessor.getCommand())) { Long userId = saveDisconnectionState(headerAccessor); if (userId != null) { sendDisConnectionStateEvent(userId); } } }
[질문 내용] JdbcMemberRepository클래스를 만들고 코드를 복붙했으며, 대부분 오류나는 부분은 모두 import해서 없어졌지만, 해결되지 않은 부분이 2군데 있었습니다. java: hello.hello_spring.repository.JdbcMemberRepository is not abstract and does not override abstract method findAlL() in hello.hello_spring.repository.MemberRepository java: method does not override or implement a method from a supertype 12줄에 public class JdbcMemberRepository implements MemberRepository { 이 부분에서 빨간줄이 계속 표시되고, 71줄에 findAll()메소드에서 바로 상단에 @Override에 빨간줄이 뜹니다. 어떤 방식을 적용하든 계속 오류가 해결되지 않은데 어떻게 해야 좋을지 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 현재 수강을 계속하면서 공부하고 있는데요 예를 들어 날짜와 시간 챕터를 다 보고 이제 복습을 하려고 하는데 PDF보면서 코드를 따라치면서 복습을 하고있는중입니다. 이렇게 복습하는게 효율적인가 궁금하고요. 한번보고 복습주기를 어느정도로 해야하는지도 알고 싶습니다.
3:37 근처에서 Select Kernel을 클릭했는데 myenv-finance-analysis가 드롭다운에 보이질 않습니다. 드롭다운에 Python Environments 만 떠서 그걸 선택했더니 가상머신을 끄고 다시 들어와도 Detecting Kernels만 계속 실행되는 모습입니다. 혹시 왜 이런건지 알 수 있을까요?
안녕하세요! 강의에서 배운 것을 바탕으로 데이터 분석 프로젝트를 진행하고, 분석 내용 및 코드를 노션 포트폴리오에 올리려 합니다. (개인 구직용으로만 사용합니다!) 배운 것을 바탕으로 하다 보니, 강의에서 배운 코드와 같은 부분이 있을 수밖에 없는데 포트폴리오에 사용해도 괜찮을까요?
프로그래밍 시작하기 : 도전! 45가지 파이썬 기초 문법 실습 (Inflearn Original)
안녕하세요 선생님 질문있습니다. 예제 내용 중, 아래 코드에서 프린트 파일리드를 한 다음에 file.close()로 open한 파일을 닫아줘야 하지 않나요? 물론 예제 코드가 잘 동작하는 것은 확인 했습니다. 다만 저는 append 모드로 파일을 open하기 전에 먼저 열었던 파일을 close 해줘야 하는게 아닌가 해서 질문드립니다~ ... if menu == 1: file = open(file path, 'r') print( file.read ()) # 이 부분에서 file.close() 해줘야 하는것 아닌가요?? file = open(file path, 'a+') print() ...
개발용 PC가 리눅스라면 괜찮은데, 윈도우에서 개발한다면 배포시에 보통 리눅스에 배포하게 될텐데.. 그 경우 개발환경과 배포환경이 다름으로 생기는 패키지 관리 문제가 생기는데 강사님은 어떻게 해결하시나요..? cookiecutter-django로 프로젝트 세팅을 간소화 하려고 하는데, 도커에서 서비스가 돌아가다보니 디버깅 하기가 까다롭네요.. pycharm에서는 보통 어떻게 하나요? vscode에서는 debugpy를 제가 수동으로 설정해서 디버깅 처리를 했는데, 이 방법은 너무 번거롭더라구요.. 요지는 윈도우 개발환경에서 도커 컨테이너에서 돌아가고 있는 코드를 어떻게 디버깅 하느냐에 대한 질문입니다.. 좋은 강의 제공해주셔서 감사드리며, 강의 주제와는 좀 벗어나지만 답변 주시면 개발하는데 많은 도움 될 것 같습니다.
sql distinct는 완전히 같은 것의 중복을 제거해준다고 배웠습니다. id를 사용한다는 가정에서 완전히 같을 경우가 존재할 수 있나요? jpql distinct 키워드는 sql distinct에 더불어 엔티티 중복을 피하게 해주는데 sql distinct는 필요없는 과정이 아닌가 싶었습니다.
자주 하는 질문 + 강의 자료를 종합해봤을 때 Querydsl 설정이 크게 다음 3가지로 나뉘는 것 같더라고요. 2.x 버전 / dependencies 바깥에 설정 plugins { id 'org.springframework.boot' version '2.2.2.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE' //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" id 'java' } //querydsl 추가 시작 def querydslDir = "$buildDir/generated/querydsl" querydsl { jpa = true querydslSourcesDir = querydslDir } sourceSets { main.java.srcDir querydslDir } configurations { querydsl.extendsFrom compileClasspath } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } 2.x 버전 / dependencies 안에 설정 dependencies { //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } clean { delete file('src/main/generated') } 3.x 버전 / dependencies 안에 설정 dependencies { //Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" } clean { delete file('src/main/generated') } 2.x 의 경우 선택지가 2가지가 되는 데 왜 강의에선 1번 케이스를 선택했던 건지 궁금합니다! 2번 선택지가 더 깔끔한 거 아닌가요 ?
1:57에서 '나눈 이후의 몫을 원할 때' 사용하는 연산자가 /라고 하셨습니다. c언어 기준으로 설명해 주신 걸로 이해했는데 (파이썬은 /을 쓸 시 나누어 떨어질 때까지 계산한 값, 혹은 무한소수를 끊어 출력하고 정수 몫을 원할 시 //을 써야 하니까요) 혹시 자바도 c언어와 연산자가 동일한가요? 코딩을 배우기는 하나 컴공만큼 깊게 들어가는 과는 아니라 자바를 배운 적이 없어 질문드립니다.