안녕하세요 강사님! 우선 양질의 강의 잘 듣고 있다는 말씀 드리고 싶습니다. Spring Security 에서 AuthenticationProvider 를 찾아서 인증을 위임하는 역할을 수행하는 ProviderManger 도 옵저버 패턴을 사용하고있다고 볼 수 있을까요? ProviderManager (AuthenticationManager) 에서 AuthenticationProvider 들을 가져온후 이들을 순회하며 인증위임을 시키는 코드입니다 단순히 supports() 를 통해 인증을 위임시킬 AuthenticationProvider 들을 골라내는 것뿐, 이것도 옵저버 패턴이 적용된 예인지 알고 싶습니다.
안녕하세요 현재 프로젝트 세팅 및 테스트를 진행 중입니다. 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. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 제 프로젝트 압축파일입니다. https://drive.google.com/file/d/1CsFmsNczcupxGIQTMM_-uA7EQFzu3KRq/view?usp=sharing JpaMain에서 Movie movie = new Movie(); movie.setDirector("aaa"); movie.setActor("asdf"); movie.setName("바람과 함께 사라지다"); movie.setPrice(10000); em.persist(movie); em.flush(); em.clear(); 에 의해 movie가 insert되어야하는데 실제로 데이터베이스의 MOVIE테이블을 조회해보면 아무것도 없습니다. 그리고 아래와 같은 에러로그가 뜨는데 어떻게 해야할지 모르겠어서 질문드립니다! https://drive.google.com/file/d/1YCpr2ZBFSC84lw3wvn5wks22DVx1GHAM/view?usp=sharing
안녕하세요. 라인 여러 줄 복사할 때 범위 지정 후 ctrl d 하는 거는 이해했는데 라인 맨 앞으로 이동 후 범위 지정할 때는 어떻게 쓰나요? 이전 영상에서 설명해 주셨는데 따로 필기 안 하고 지나가서 찾아보려니까 못 찾겠네요ㅜㅜ 윈도우 기준 home 키 써서 라인 맨 앞으로 간 다음에 ctrl w 하신 건가요? 영상 보니 라인 전체 복사가 한 번에 이루어지는 것 같아 궁금해서 질문 남겨 봅니다. 미리 답변 감사합니다!
Jupyter command jupyter-contrib not found. 지금 이 오류가 떠서 설치가 안되고 있는데요. 어떻게 해결해야 할까요?? 제가 봤을땐, pip install jupyter_contrib_nbextensions 이 부분은 실행이 되는데 jupyter contrib nbextension 이 부분에서 오류가 생기는 것 같습니다. ㅠㅠ
클래스 정의하고 호출하면 42번 줄에 player1에 해당하는 height와 weight의 값이 둘 다 나와야 하는데 저는 한가지 값만 출력이 됩니다. weight를 지우고 height 값만 쓰면 height값이 출력되고 둘다 쓰면 height값은 안나오고 weight값만 출력이 되는데 왜 이런 걸까요?
선생님 안녕하세요. 강의를 듣다가 조금 이상한 부분이 있어서 문의드립니다. [ 스레드 풀 이해와 구현 ] 강의에서 작성하는 코드를 저도 그대로 따라치면서 실습을 하고 있는데요. 그런데 예시 코드의 동작에 약간의 문제를 발견했습니다. 강의에서 보여주는 코드는 아래와 WorkerThread 코드는 아래와 같습니다. 그런데 제가 한 ThreadPoolMain 클래스에서 Task 를 3000 개 정도 주고, ThreadPoolSize =20 을 주고 돌려보니까, 2가지 이상현상을 확인했습니다. 1. Null Poiniter Exception 발생 중복 처리 각각의 문제가 발생하는 이유를 정리해보니 다음과 같더라구요. NPE 발생 원인 // 시나리오 1 if (!taskQueue.isEmpty()) { // 쓰레드 A,B 2개가 동시에 여기에 접근 // 쓰레드 A 가 먼저 Poll 을 해서 가져가버림. // 쓰레드 B 는 비어있는 Queue 에 대하여 poll, null 을 반환 받음 task = taskQueue.poll(); } else { continue; } // 쓰레드 A 는 정상 시작 // 쓰레드 B 는 NullPointerException! task.run(); 중복처리 원인 // 시나리오 2 if (!taskQueue.isEmpty()) { // 쓰레드 A,B 2개가 동시에 여기에 접근 // 쓰레드 A 가 먼저 Poll 을 해서 가져 가버림. // 쓰레드 B 도 Poll 해서 task 를 가져감. task = taskQueue.poll(); } else { continue; } // 쓰레드 A 는 작업 시작 // 쓰레드 B 도 중복으로 해당 task 실행 task.run(); 혹시 코드를 아래처럼 짜야 되는 게 아닌지 조심스럽게 문의해봅니다.
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. V3.1 실행 후 콘솔창에 뜨는 쿼리문이 다음과 같이 뜹니다. springboot version 3.2.1 이고 Hibernate5JakartaModule로 설정했습니다. application.properties 도 아래와 같이 설정했습니다. 그외 부분도 강사님 코드를 그대로 복붙해도 다음과 같이 물음표가 너무 많이 뜨는데 버전 문제인건가요?
안녕하세요. 비동기 작업 조합 강의 38분 30초대를 듣다가 질문이 생겼습니다. 인텔리제이 콘솔에 '최종 결과: 10'으로 출력되고 있는데요. 궁금한 점은 아래와 같습니다. 비동기 처리 과정이 제일 적은 cf1의 리턴 값은 10이다 AnyOfExample.java 19 Line에서는 result * 10으로 계산이 되고 있다. 따라서 100이 나올 것으로 예상을 했는데 10으로 출력되는 것으로 보아 2번 계산 과정을 스레드가 실행하지 않은 건가 싶어서요. 혹시 제가 놓치고 있는 부분이 있나 해서 질문드립니다.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 강의에서(12:00부분) 참조값만 복사하고 인스턴스를 복사하는 것이 아니라는데, 결국 같은 인스턴스를 접근하게 되잖아요 그러면 위 뜻이 인스턴스가 동일해지는 것은 맞지만, 참조값을 복사하는 것이지 인스턴스를 복사하는 것이 아니라서 잘못 인지하지 말라는 뜻인가요? 아니면 인스턴스가 달라서 참조값만 복사한 것이기에 인스턴스를 복사하는 것이 아니라는 뜻인가요? Data dataA = new Data(); // 1.Data인스턴스 생성후 dataA에 참조값 넣음 dataA.value = 10; Data dataB = dataA; // 2.dataA 참조값을 복사하고 대입함 System.out.println("dataA.value = " + dataA.value); // 10 System.out.println("dataB.value = " + dataB.value); // 10 // 3.dataB는 dataA의 인스턴스에 동일하게 접근하게됨
<상황>지식 공유자님께서 작성해주신 C# 코드 예제를 코틀린으로 비슷하게 작성해서 시도해보았지만 같은 상황이 재현되지 않습니다. <질문 의도>제가 지식 공유자님의 코드를 잘못 이해하고 작성한 것인지, 아니면 JVM의 의도치 않은 최적화 때문에 의도와 다르게 동작하는 것인지 궁금합니다. <작성한 코드> fun main (args: Array<String>) { Example().startUp() } class Example() { private var shouldStop = false fun startUp() { println("process start") val thread = Thread(Runnable { doWork() }) thread.start() Thread.sleep(1000) shouldStop = true thread.join() println("process end") } // shouldStop에 @Volatile을 붙이지 않으면 무한 루프를 돌 것이라고 생각했으나 // graceful shutdown이 잘 되어버림 private fun doWork() { while (!shouldStop) { println("doWork..") Thread.sleep(1000) } } } 좋은 강의 만들어주셔서 감사합니다!
[질문 내용] 안녕하세요!! 우선 좋은 강의 만들어주셔서 너무 감사합니다! 이번 강의도 정말 잘 들었습니다!! 저는 자바 입문, 실전 자바 기본편을 듣고 이번 스프링 입문 강의를 완강했습니다. 이전에는 자바에 대해 책으로 공부하고 강의를 통해 이해하는데 큰 어려움이 없었지만 스프링은 처음이라 많이 헤매는 느낌을 받습니다. 궁금한 점은 헤매는 느낌을 받는 이유는 자바에 대한 이해가 부족해서 인지 스프링에 대한 이해가 부족해서 인지 알고싶습니다. 또한 제 계획은 24년도 상반기에 나올 자바 중급,고급 강의를 듣고 스프링 완전정복 강의를 듣고 토이프로젝트를 통해 실력을 향상시키는 것이 목표입니다. 이 방향성이 괜찮은지 아니면 어떤 방향으로 나아가야하는지 조언 부탁드립니다.!! 처음 자바를 공부하고 너무나도 헷갈리고 어려운 순간들이 많았는데 김영한 선생님의 강의를 듣고 나름대로 발전한 것 같아서 항상 감사하고 있습니다. 양질의 강의를 제공해주셔서 감사합니다 !! 24년도 잘 부탁드립니다!!
import java.util.Scanner; public class 멘토링 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); int m = scan.nextInt(); int[][] intArrArr = new int[n][m]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ int temp = scan.nextInt(); intArrArr[temp-1][i] = j; } } System.out.println(solution(n,m,intArrArr)); } private static int solution(int n, int m, int[][] intArrArr) { int answer = 0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ boolean flag = true; for(int k=0;k<m;k++){ if(intArrArr[i][k] >= intArrArr[j][k]){ flag = false; break; } } if(flag){ answer++; } } } return answer; } } input을 받을 때 학생이 행에 오도록 변경을 해서 등 수를 열로 변경해서 받으면 3중 for문으로도 가능합니다. 참고가 될까 싶어 올려봅니다 화이팅!!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] Switch 문을 while 문 중간에 넣었을 때 break 는 중단되지 않았습니다. return 문은 프로그램을 종료시켰습니다. 왜 break 문은 쓸 수 없는지 궁금합니다! package method.ex; import java.util.Scanner; public class MethodEx4 { static Scanner sc = new Scanner(System.in); static int balance = 0; public static void main(String[] args) { while (true) { switch (chooseMenu()) { case 1 -> balance = deposit(); case 2 -> balance = withdraw(); case 3 -> checkBalance(); case 4 -> { printFooter(); return; // break 대신에 return 문 쓰기 } default -> printError(); } } } static int chooseMenu() { System.out.println("------------------------"); System.out.println("1.입금|2.출금|3.잔액 확인|4.종료"); System.out.println("------------------------"); System.out.print("선택: "); return sc.nextInt(); } static int deposit() { System.out.print("입금액을 입력하세요: "); int depositAmount = sc.nextInt(); balance += depositAmount; System.out.println(depositAmount + "을 입금하였습니다. 현재 잔액: " + balance + "원"); return balance; } static int withdraw() { System.out.print("출금액을 입력하세요: "); int withdrawAmount = sc.nextInt(); if (balance >= withdrawAmount) { balance -= withdrawAmount; System.out.println(withdrawAmount + "원을 출금하였습니다. 현재 잔액: " + balance + "원"); } else { System.out.println(withdrawAmount + "원을 출금하려 했으나 잔액이 부족합니다."); } return balance; } static void checkBalance() { System.out.println("현재 잔액: " + balance + "원"); } static void printFooter() { System.out.println("시스템을 종료합니다."); } static void printError() { System.out.println("잘못 번호를 입력하였습니다."); } }