안녕하세요 현재 프로젝트 세팅 및 테스트를 진행 중입니다. spring boot가 3이상으로 제한된 상황속에서 진행중이며, 강의 내용을 따라하고 있습니다! build.gradle은 https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.vfy9wirpglmx 를 복/붙 하였습니다. plugins { id 'java' id 'org.springframework.boot' version '3.2.0' id 'io.spring.dependency-management' version '1.1.4' } group = 'study' version = '0.0.1-SNAPSHOT' sourceCompatibility = '17' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' //test 롬복 사용 testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //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" } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') } 질문은 크게 3가지입니다. build/other/compileQuerydsl은 표기가 안되는데 다른 답변을 보니 springboot3으로 올라가며 compileQuerydsl은 표기가 안된다고 하신 것 같은데 맞을까요? 정확한 Q파일의 생성 위치가 궁굼합니다.! 강의상에서는 src/main에 둬도 괜찮지만, 버전관리 시스템(git)에는 추가 되지 않는게 좋다고 하셨던 것 같은데 맞나요? build에만 Q파일이 생성되는게 좋나요? 올려주신 google doc의 build.gradle로 진행하면, Q파일이 build/annotationProcessor아래 생성됩다... 뭐가 문제일까요? docs에 올려주신 build.gradle에서 build clean을 진행할 때 'src/main/generated'의 폴더를 삭제하는 이유가 무엇일까요? (현재 저는 Q파일을 build/ 아래 관리하고있는데, src/main/generate 아래 Q파일을 생성하시는 분들에만 해당 되는 내용인가요?) 답변해주시면 감사하겠습니다!
@JoinColumn(name = "MEMBER_ID) List<AddressEntity> addressHistory = .. 다대일이 아닌 일대다로 매핑한 이유가 있을까요? 앞에서 다쪽에 @JoinColumn하는 것을 추천하셨는데 일쪽에 연관관계 주인을 잡은 이유가 궁금합니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 커리큘럼 완강 후 샘플 프로젝트 만들면서 공부 중에 질문이 생겼습니다. 빈 후처리기 적용하는 과정 중에 추가로 jdbc dependency를 넣었습니다. build.gradle 파일에 implementation 'org.springframework.boot:spring-boot-starter-jdbc' 위와 같이 추가하고 실행하면 create proxy: target class=class hello.proxy.app .v3.OrderRepositoryV3$$SpringCGLIB$$0 proxy class=class jdk.proxy2.$Proxy63 The bean 'orderRepositoryV3' could not be injected because it is a JDK dynamic proxy OrderRepositoryV3의 target 클래스가 SpringCGLIB로 생성되서 오류가 나고 JDBC dependency를 주석 처리하고 gradle 빌드 후 다시 실행해보면 잘 실행됩니다. jdbc dependency를 추가해서 오류가 발생하는 이유와 해결 방법이 궁금합니다.
리액트 강의에서 코드 작성하실 때 input이나 button 같은 태그를 작성하실 때 한 태그만 작성하실 때에도 굳이 div태그를 만들어서 그 안에 작성하시던데 그 이유가 있을까요?? JSX문법에서 전체 태그를 하나의 부모 태그로 감싸야 하는 것은 알고 있지만 왜 태그 하나 하나를 다 div태그로 감싸는지 궁금합니다
안녕하세요 자바스크립트와 타입스크립트 공부 시작하려고 합니다. 그런데 저는 기본 js인 자바스크립트를 먼저 공부하고, 그 후에 타입스크립트나 기타 언어들을 배우려고 하는데요. 현업 재직 중인 지인 분이 ts를 먼저 배우고 js를 공부하면 js는 빠르게 이해 가지만, js를 먼저 배우는 경우 ts는 이해가 바로 되지는 않는다고 하시더라구요. 효율상 ts를 먼저 배우는 게 좋다고요. 현업재직중이시거나 실제로 두 스크립트 다 공부하셨던 분들 중 공부 순서에 따라 습득의 차이가 실제로 있는 지 조언 부탁 드립니다.
제가 강의 듣기 전 function solution(num) { let answer = []; for (let x of num) { let isPrime = true; x = Number(x.toString().split("").reverse().join("")); if (x <= 1) continue; for (let i = 2; i <= x / 2; i++) { if (x % i === 0) { isPrime = false; break; } } isPrime && answer.push(x); } return answer; } let arr = [32, 55, 62, 20, 250, 370, 200, 30, 100]; console.log(solution(arr)); 이런식을로 풀었는데 영상에 보니까 isPrime(n) 을 따로 빼서 하신것같은데 이렇게 함수를 따로 빼야하는 이유가 있는건가요??
HTTP는 기본적으로 비연결성 이지만 일정시간 연결을 가진다. 기존에는 http는 3wayhandshake하고 보낼거 보내고 소켓 자원을 낭비 하지 않기 위해 바로 연결을 끊었다. 하지만 이후에는 html파일 외에 css ,js등 각종 리소스들을 보내야되기때문에 일정시간동안 약 30초동안은 tcp연결을 끊지않고 대기한다.
@Controller가 붙으면 로직을 수행하는 컨트롤러가 되고 이 컨트롤러에서 수행되는 로직은 요청과 동일한 @RequestMapping이 붙은 메소드가 실행된다 라고 생각하면 되는건가요? @Controller가 붙은 클래스가 컨트롤러가되서 HandlerMapping에 등록된 후 내부적으로 @RequestMapping으로 구분을 하는건지 아니면 각각의 메소드가 컨트롤러가 되서 HandlerMapping에 등록되는건지 궁금합니다.
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의를 따라서 코드를 작성했습니다. http://localhost:8080/ 으로 접속하면 home.html 이 아니라 static 폴더의 index.html 이 열립니다. 어떻게 해결하면 될까요?
<Member 클래스> @ElementCollection @CollectionTable(name = "FAVORITE_FOOD", joinColumns = @JoinColumn(name = "MEMBER_ID") ) @Column(name = "FOOD_NAME") // 값이 하나라 가능 private Set<String> favoriteFoods = new HashSet<>(); <JpaMain 함수> try { Member member = new Member(); member.setUsername("member1"); member.setHomeAddress(new Address("homeCity", "street", "10000")); member.getFavoriteFoods().add("치킨"); member.getFavoriteFoods().add("족발"); member.getFavoriteFoods().add("피자"); member.getAddressHistory().add(new Address("old1", "street", "10000")); member.getAddressHistory().add(new Address("old2", "street", "10000")); em.persist(member); em.flush(); em.clear(); System.out.println("=========== START ==========="); //todo: 값 타입 수정 Member findMember = em.find(Member.class, member.getId()); Address a = findMember.getHomeAddress(); findMember.setHomeAddress(new Address("newCity", a.getStreet(), a.getZipcode())); // HashSet이라서 set 메서드 활용 불가 findMember.getFavoriteFoods().remove("치킨"); findMember.getFavoriteFoods().add("한식"); tx.commit(); 위의 메인함수를 여러 번 실행했는데 HashSet임에도 불구하고 순서가 지켜진 체로 DB에 저장된 결과가 다음과 같습니다. 그러나, em.flush()와 em.clear()를 주석처리하고 다시 실행해보면 DB로 조회할 때 순서가 지켜지지 않고 무작위로 저장이 됩니다. 제 예상은 em.flush()가 add()로 저장된 컬렉션 값을 먼저 DB에 반영하니까 순서가 보장되서 항상 같은 결과가 나오지 않나 생각됩니다. 이것이 맞나요?
제가 영상 보기 전 혼자 풀어보았는데 function solution(n, arr) { let answer = 0, max_sum = 0; for (let x of arr) { let sum = 0, temp = x; while (temp) { sum += temp % 10; temp = Math.floor(temp / 10); } if (max_sum < sum || (max_sum === sum && answer < x)) { answer = x; max_sum = sum; } } return answer; } let arr = [128, 460, 603, 40, 521, 137, 123]; console.log(solution(7, arr)); 저는 if 문을 (max_sum < sum || (max_sum === sum && answer < x)) 이렇게 하나로 묶어서 썼는데 괜찮을까요 ? 그리고 선생님께서 max를 초기화할때 Number.MIN_SAFE_INTEGER 로 하셨는데 어차피 각자리수의 합이 0보다는 클것이라는 생각이 들어서 저의 경우엔 0으로 초기화 했는데 괜찮을까요?
import java.util.Scanner; public class ScannerEx1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (true) { System.out.print("당신의 이름을 입력하세요: "); String str= sc.nextLine(); System.out.print("당신의 나이를 입력하세요: "); int Z1= sc.nextInt(); System.out.println("당신의 이름은 "+str+"이고, 나이는"+Z1+"입니다"); } } } 이런 식으로 코드를 짜고 실행하면 처음 할 때는 잘 작동하는데 두 번째부터 재입력 할 때 이름은 입력 안 되고 나이만 입력이 되니까 당신의 이름을 입력하세요: 존 당신의 나이를 입력하세요: 12 당신의 이름은 존이고, 나이는12입니다 당신의 이름을 입력하세요: 당신의 나이를 입력하세요: 234 당신의 이름은 이고, 나이는234입니다 당신의 이름을 입력하세요: 당신의 나이를 입력하세요: 23 당신의 이름은 이고, 나이는23입니다 당신의 이름을 입력하세요: 당신의 나이를 입력하세요: 존존 Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.throwFor(Scanner.java:947) at java.base/java.util.Scanner.next(Scanner.java:1602) at java.base/java.util.Scanner.nextInt(Scanner.java:2267) at java.base/java.util.Scanner.nextInt(Scanner.java:2221) at day16.ScannerEx1.main(ScannerEx1.java:15) Process finished with exit code 1 이런 식으로 뜨네요 이름입력이 건너 뛰게 되는 이상한 현상이 있는데 어떻게 된 걸까요?
import 가 안됩니다.. import 문을 지우고 다시 해도 된다는 글이 있어서 따라해봤는데 그대로입니다. 캐시비우기 및 재시작 해도 그대로고 gradle rebuild 해도 그대로 원인조차 파악하기 어렵습니다. 도움주십쇼. 깃 링크: git@github.co m:choiinsoochoi/jpa.git
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] localhost:8080/jsp/members/new-form.jsp 경로에서 webapp 밑에 있다는건 어디서 알 수 있는 정보인지 궁금합니다.또한, 그 설정을 개인적으로 설정할 수 있다면 그 방법이 궁금합니다
안녕하세요 제가 강의 보기전에 혼자 풀어봤는데 function solution(s) { let answer = s[0]; let cnt = 1; for (let i = 1; i < s.length; i++) { if (s[i] === s[i - 1]) { cnt++; continue; } if (cnt > 1) { answer += cnt + s[i]; cnt = 1; } else { answer += s[i]; } } return answer; } let str = "KKHSSSSSSSE"; console.log(solution(str)); 저 같은 경우 미리 answer 에 첫번째 글자를 넣어서 시작했고 for 문을 1부터 시작해서 그 전의 값과 비교하는 식으로했는데 이렇게 풀어도되는걸까요?
안녕하세요! 강의 잘 보고 있습니다 ㅎㅎ 다름이 아니라, import * as getters from './getters' 를 했는데 'import ... ='는 TypeScript 파일에서만 사용할 수 있습니다. ts(8002)라며 에러가 나네요 ㅠㅠ 저는 뷰 3를 이용하고 있습니다!
안녕하세요 큰돌선생님.. 해당 문제를 풀었는데 예제 입력 1번과 2번까지는 잘 나오는데 나머지가 틀렸다고해서 질문드립니다. 선생님 코드와 아주 큰 틀에서는 비슷한것 같긴한데, 제 코드가 우선 깔끔하지는 못한것 같습니다. 따로 변환된 좌표를 받아서 원복시키는것이 아닌 flag 변수를 사용하여 원복시키는 코드로 작성하였습니다.. 오래 생각해보았는데 진전이 없어 질문드립니다. 혹시 어떤 부분이 잘못된 로직인가요?? http://boj.kr/468e705a31f141d7aaf8dea5cc6f4dfd