실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
안녕하세요 강사님. 코틀린을 배우는데 좋은강의 만들어주셔서 감사합니다. 테스트를 위한 fixture 코드 부분에 대해 의견 여쭤보고 싶습니다. 강의에선 직접 엔티티 내부에 테스트를 위한 fixture 함수를 만들어 주셨는데, 팀 내부 의사결정에 따라 두어도 괜찮을 수도 있을 것 같지만 만약 테스트용 코드는 분리해야 한다고 하면 아래처럼 테스트 코드 패키지쪽에 fixture 생성을 위한 유틸파일을 만들고, 테스트 코드에서만 Book.fixture(...) 같은 형태로 사용할 수 있도록 엔티티에 비어있는 companion object를 만든 뒤 확장함수를 작성하는 형태로 해도 괜찮을지 의견 여쭤보고 싶습니다.! 테스트코드용 유틸 생성 User, Book 등의 엔티티에 비어있는 동행객체 선언 엔티티별 Companion 확장함수 작성 테스트 코드에서 엔티티.fixture() 형태로 사용
안녕하세요! [Java의 특징과 JVM]강의에서 4:10초 정도에 시작하는 C,C++로 만든 어플리케이션의 특징 부분을 설명해 주시는 부분에서 질문이 있어서 글 남깁니다. (C/C++에 대해서는 깊게 공부한 적이 없습니다...) 1번 질문 C,C++로 만든 프로그램을 실행하면 '프로세스'가 생성되고 '프로세스'안에 특정 CPU가 실행 가능한 '기계어'가 포함되어있다고 하셨는데 앞선 강의에서 보여주셨던 '특정 CPU가 바로 실행할 수 있는 16진수로 된 기계어'를 말씀하시는게 맞나요? 2번 질문 자바로 만든 어플리케이션A,B,C가 각각 있고 3개 다 실행했을 때 프로세스A, 프로세스B, 프로세스C가 각각 만들어져서 실행되는걸로 알고 있습니다. User mode process JVM 내용에서 "유저모드 어플리케이션 관점에서 프로세스다"라는 말씀이 JVM도 어쨌든 하나의 프로그램을 실행시킨 프로세스여서 그런건가요? 아니면 OS의 통제를 받아서 그런건가요? 3번 질문 스레드에 관해서 다루지 않는다고 하셨지만.. PC Register의 정확한 역할이 궁금해서 질문 남깁니다! 제가 알기론 실제 CPU에는 여러가지 레지스터들이 있고 그중에 PC Register는 실행 지점(다음 명령어가 담겨있는 메모리 주소)만 들고 있는 역할로 알고 있는데 런타임 데이터 영역에 있는 PC Register도 각 스레드별 실행 지점만 가지고 있는게 맞나요? 아니면 실행지점 + 명령어도 가지고 있는건가요?
내부 표를 인식하여 이미지 파일로 추출하고 자 하는데, 궁금한 부분이 있어 글 남깁니다. 표 내부 셀에 그림이 있는 경우, 표를 추출할 때, 내부의 그림과 글까지 하나의 표로 추출하는 방법이 있을까요? 표 내부의 통합된 셀도 표 추출 시, 함께 추출할 수 있는 방법이 있을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] MyAtomicInteger 와 다른 구현체 들의 성능을 테스트 하는 코드에서 강의에 결과와 다른 결과가 나옵니다... package thread.cas.increment; import java.util.concurrent.atomic.AtomicInteger; public class MyAtomicInteger implements IncrementInteger{ AtomicInteger atomicInteger = new AtomicInteger(0); // 이미 동시성 문제가 다 해결되어 있는 클래스이다. @Override public synchronized void increment() { atomicInteger.incrementAndGet(); } @Override public int get() { return atomicInteger.get(); } } package thread.cas.increment; import static util.MyLog.log; public class IncrementPerformanceMain { public static final long COUNT = 100_000_000; public static void main(String[] args) { test(new BasicInteger()); //가장 빠르다 CPU 캐시를 가장 적극 사용한다. 멀티스레드 환경에서는 사용할 수 없다. 단일 스레드일 경우 가장 효율적 test(new VolatileInteger()); // 메인메모리를 직접 사용한다. 안전한 임계영역은 없기 때문에 멀티스레드 환경에는 사용할수 없다. test(new SyncInteger()); test(new MyAtomicInteger()); } private static void test(IncrementInteger incrementInteger) { long startMs = System.currentTimeMillis(); for (long i = 0; i < COUNT; i++) { incrementInteger.increment(); } long endMs = System.currentTimeMillis(); log(incrementInteger.getClass().getSimpleName() + ": ms=" + (endMs - startMs)); } } 아토믹이 그냥 synchronized보다 더 느린 결과가나오는데 제가 놓친 부분이 있을까요?
안녕하세요. 강사님 2025년 새해복 많이 받으세요! 반드시 알아야 할 중요한 시점 까지 강의를 시청한 상태입니다. 기초적인 질문인것 같지만... 3가지 질문 있습니다! 1번 질문 : javac.exe나 java.exe라는 것이 javac.exe : 실행시키면 .java 파일들을 .class로 번역하는 모듈 -> 컴파일러 java.exe : .class파일을 로딩 + 실행시키는 모듈 -> JVM 위의 내용처럼 이미 누군가가(JDK 개발사?) 만들어 놓은 모듈이여서 딸깍! 실행만 시켜주면 정해진 로직을 하는 프로그램(모듈)인가요? 2번 질문 : javac.exe <- 이게 컴파일러인가요? 맞다면 이것도 java나 c,c++같은 native code로 작성되어있는건가요? 3번 질문 : 종합적으로 Main.java(Hello, World!라는 문자열을 출력)를 작성한 상태라고 가정하면 Main.java를 JDK포함되어 있는 컴파일러(이미 만들어져있는 javac.exe)를 실행시켜서 컴파일하고 컴파일한 바이트코드를 JRE(JVM)에서(만들어져 있는 java.exe) 실행시키는 거라고 이해했는데 맞나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 오디오만 나오고 화면이 안나옵니다. 캐쉬도 날려보고 브라우저도 바꿔봤는데 동일하게 안나옵니다.
안녕하세요. 강의 정말 잘 듣고있습니다! 다름이 아니라 MMDetection을 다시 공부하던 중 모델 아키텍쳐 부분에서 densehead와 roihead의 차이가 궁금해져서 이렇게 글을 남깁니다. 설명에는 densehead와 roihead 모두 object의 위치와 classification을 수행한다고 나와있어서요.. 감사합니다!
파트 : 투 포인터 알고리즘 [문제풀이]: BOJ 17609 투 포인터 알고리즘 [문제풀이] : BOJ 17609 안녕하세요, 백준 17609 회문 문제를 혼자서 풀어봤을 때, 처음에 투 포인터 알고리즘으로 풀려고 left, right를 선정하고 양방향으로 오게 만들었습니다. 그런데 이때 문자가 다를 경우 left, right에 해당하는 문자를 각각 삭제해보고 안되면, 다시 돌아가는 방식 백트래킹 을 생각했고 재귀 로 풀고자 했습니다. 아래의 코드로 풀면 답은 잘 나오는 거 같지만, 제출하면 메모리 초과가 발생합니다. 제가 재귀의 개념을 잘 이해하지 못한 거 같은데, 이렇게 풀면 브루트포스 풀이가 되어서 정답이 아닌걸까요? 그렇다면 해당 문제에서 '투포인터를 사용했을 때'와 저처럼 '재귀로 풀었을 때'의 큰 차이점이 무엇인지 궁금합니다..! 질문 받아주셔서 감사합니다:) import sys sys.setrecursionlimit(10**6) # 재귀 깊이 제한 늘리기 def recursion(value, left, right, count): global T # base if count > 1: return 2 if left >= right: return count # recursive if value[left] == value[right]: return recursion(value, left+1, right-1, count) else: # 1. right를 옮겨보기 skip_right = recursion(value, left, right-1, count+1) if skip_right == 1: return 1 # 2. left를 옮겨보기 skip_left = recursion(value, left+1, right, count+1) if skip_left == 1: return 1 return 2 T = int(input()) # 문자열 개수 arr = [input() for _ in range(T)] for value in arr: left = 0 right = len(value)-1 print(recursion(value, left, right, 0))
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. toString()강의부터 소리만 나오고 검은색 화면만 보이는데 인프런측의 문제일까요..?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 안녕하세요 jpa 기본편 수강 중인 학생입니다. 애플리케이션 개발 강의에서 member.setId(1L); member.setName("HelloA"); 하고 2L,HelloB로 바꿔서 실행 후 테이블조회를 하면 1L과HelloA는 뜨지 않고 2L,HelloB만 조회가 됩니다. 코드는 똑같이 작성한 것 같은데 어디가 문제일까요? public class JpaMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try { //code Member member = new Member(); member.setId(1L); member.setName("HelloA"); em.persist(member); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } } 실행을 시키면 Hibernate: drop table if exists Member cascade 1월 01, 2025 5:44:30 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@4ed4a7e4] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode. Hibernate: create table Member ( id bigint not null, name varchar(255), primary key (id) ) 1월 01, 2025 5:44:30 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@134ff8f8] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode. Hibernate: /* insert for hellojpa.Member */insert into Member (name, id) values (?, ?) drop하고 create가 됩니다...
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 연습문제 회원 관리 기능을 만드는중 findByName에서 헷갈려서 질문을 남김니다. 다음은 제가 작성한 소스코드입니다 /** * get 메서드는 key값을 통해서 value를 반환한다 * key-> id, value ->memeber * value의 구조는 STRING: ID, STRING NAME이므로 * value를 하나로 펼쳐서 순회한 다음, 이름에 맞는 member를 반환 * */ public Member findByName(String name) { Boolean findMember = memberMap.containsValue(name); if(findMember!=null){ for(Map.Entry<String, Member> entry: memberMap.entrySet() ){ String key =entry.getValue().getId(); String parameterName = entry.getValue().getName(); if(parameterName==name) { return memberMap.get(key); } } } return null; } 다행히 결과는 문제 없이 돌아가가나 String key = entry.getValue().getId()에 디버그를 찍으면 Boolean findMember = memberMap.containsValue(name);//findMember:false, name: 회원3 다음과 같이 표기 되는데 분명 회원3의 값을 저장 했는데 왜 findMember가 false로 나오는 걸까요? 이유가 궁금합니다. 그리고 제가 작성한 findByMember 로직이 맞을까요 ? 많은 피드백 부탁드립니다!
수업 내용을 스크립트로 볼 수 있어서 매우 큰 도움을 받고 있습니다. 듣는 도중 자잘한 오타는 건의를 하는 편인데, 이번 건은 3줄이 모두 이상한 말로 등록되어 있어서 인프런측에 제보합니다. 7:33, 7:36, 7:42 의 자막이 강사님 말과는 전혀 다른 엉뚱한 자막이 삽입되어 있습니다. 확인 후 수정 요청합니다.
1. 현재 학습 진도 현재 3주차 숙제 부분에서 3번째 문제인 멜론 베스트 앨범 알고리즘을 공부하고 있습니다. 2. 어려움을 겪는 부분 이해가 되지 않는 부분이 있어서, 문의 드립니다. 3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록한다. 해당 문제에 보면 , 위와 같은 조건이 존재하는데 , 제가 강의를 두 번이나 돌려보면서 듣고 있는데 ,강의 하신 내용에, 재생횟수가 같은 노래에 대해서는 처리하신 코드가 안 보이는데, 보내주신 코드를 프로그래머스에 돌려봐도 정상적인 답안이라고 나오더라고요. 그래서, 해당 부분에 대한 설명이 있으면 더 좋을 듯 하고 궁금해서 질문드립니다. 제가 생각한 부분은 이미 for 문을 돌 때, 인덱스 순서대로 되어 있으므로, 재생횟수로 정렬을 해도 인덱스가 낮은 것이 무조건 앞으로 오게 된다. 이렇게 생각했는 데 맞는 것인지 궁금합니다.
설명해주신 해당 코드에서는 ThreadPoolExecutor를 닫는 코드가 없던데 해당방식이면 메모리 누수가 발생할 가능성은없을까요??? with ThreadPoolExecutor(max_workers=max_workers) as executor: 이런식으로 with문을 활용해서 하는것이 좋지않나요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 프로젝트 세팅시 intellij project structure에서 jdk 17로 맞추는데, 왜 굳이 Build and run using과 Run tests using을 Gradle로 설정하나요??? 결국 Gradle로 설정하면 앞에서 project structure jdk 굳이 맞추는 의미가 없지 않나요??? 현업에서도 주로 이렇게 사용하나요??
강의를 듣다가 문득 궁금해서 여쭤봅니다. pyqt와 pyside6의 용어가 헷갈립니다 `` 인터넷을 검색해도 명료하게 이해하기 어렵습니다. 같은 gui 프로그램인데, pyqt = ipyside6라고 이름만 다른 걸까요? pyqt 프로그램 안에 pysdie6라는 하위 프로그램이 있는 걸까요...? 이 두 관계가 정리가 안 되어 혼란스럽습니다 ``
4,5번이 오류가 뜨는데 원인을 모르겠습니다.. 왼쪽, 오른쪽 값 비교해서 증가수열 구하는거는 비슷한거 같은데 말이죠... n = int(input()) a = list(map(int, input().split())) tmp = min(a[0], a[-1]) s = smp = '' # 문자열 임시변수, 문자열 중 가장 큰 값 변수 cnt = cntmp = 0 # 길이 임시변수, 길이 중 가장 큰 값 변수 while len(a) > 0: if tmp <= a[0] and tmp <= a[-1]: i = a.index(min(a[0], a[-1])) tmp = a[i] a.pop(i) cnt +=1 if i == 0: s += 'L' else: s += 'R' #print(a, cnt, s, tmp) elif tmp <= a[0] or tmp <=a[-1]: i = a.index(max(a[0],a[-1])) tmp = a[i] a.pop(i) cnt+=1 if i== 0: s +='L' else: s+='R' #print(a, cnt, s, tmp) else: if cntmp < cnt: cntmp = cnt smp = s cnt = 0 s = '' i = a.index(min(a[0],a[-1])) tmp = a[i] cnt+=1 if i == 0 or len(a) == 0: s += 'L' else: s+= 'R' a.pop(i) #print(a, cnt, s, tmp) print(cntmp) print(smp)