[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 1. 여러 스레드가 정말 완벽하게 동시에 실행되는 경우 임의의 두 스레드 A, B가 정말 완벽하게 동시에 실행되었다고 가정하겠습니다. 현재 atomicInteger의 value가 0에서 1로 증가해야하는 상황입니다. A와 B 모두 getValue의 값은 0입니다. A와 B 모두 result의 값은 true가 될 것이며 getValue는 0에서 1로 증가합니다. A와 B 모두 1을 return 합니다. (결괏값: 1) 이런 경우는 절대로 없는 건가요? 2. sleep 사용 시 타 스레드 간섭이 증가하는 이유 sleep 사용 시 타 스레드 간섭이 증가하는 이유를 제 나름대로 생각해 보았는데, sleep(100)이라 하더라도 모든 스레드가 100ms 후에 완벽하게 동시에 깨어나지는 않기 때문일까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 해당 강의를 듣고 질문이 있는데요, 우리가 일반적으로 자바/스프링부트 프로젝트를 맥북으로 인텔리제이로 실행한다면 어떻게 프로세스가 이루어지는지 알 수 있을까요? 제가 생각해본건 아래와 같습니다. 프로세스 1 자바 (강의 내용중에, 자바를 실행하면 자바도 하나의 프로세스라고 하셔서 추가했습니다) 프로세스 2 JVM (그리고 이 JVM이 가상 컴퓨터이니까 그 컴퓨터의 프로세스 내부에서 스프링부트가 실행된다고 생각하고 있습니다!) 프로세스 3 인텔리제이 이렇게 생각하고 있는 게 맞는 내용일까요??
배열의 가장 앞쪽에 요소를 추가할때, 기존의 요소를 전부 한 칸씩 오른쪽으로 옮기고 나서 확보된 빈 공간에 추가해야한다는건 이해했습니다! 그런데 곰곰히 생각해봤는데 그냥 배열자체의 시작 주소값을 한칸 앞으로 당기고 거기다가 새로운 요소를 추가하면 빅오 표기법상 O(1)? O(2)? 가 되는거 아닌가요? 예를들면 int[]의 기존 주소값이 x100이었다면 x96으로 옮기고 새로운 요소를 거기다 추가해주는거죠 주소값 자체를 명시적으로 할당하는 문법이 있는지 없는지는 모르겠지만 어쨋든 내부적으로는 그렇게 작동하도록 언어를 구현할수도 있는거아닌가요?? 그런데 당연히 이렇게는 안되니까 안하는것일텐데, 몇시간동안 생각해봐도 안되는 이유가 안떠올라서 질문드립니다 ㅠㅠ
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. 강의 정말 잘 보고 있습니다. Stream관련하여 질문이 있는데요. Stream 같은 경우에는 파이프라인을 작성하면서 연산마다 body부가 추가될 수도 있고 중간 연산이 계속 체이닝 되는 형태로 구성이 될 수도 있습니다. 이럴 때 어느 연산에서 문제가 생기는지 디버깅을 하는게 참 번거롭다는 생각이 들곤했습니다. 저 같은 경우에는 이럴 때 peek 와 sout을 활용해서 어떻게든 값을 확인하는 식으로 디버깅을 해왔는데 더 좋은 방법이 없을까요? 브레이크 포인트를 잡기도 명령형 프로그래밍 방식보다 어려운 점이 있는 거 같아서요 ㅠㅠ
안녕하세요! 강의 늘 잘 듣고 있습니다, 감사합니다. 다름이 아니고, Comment 테이블 관련한 질문인데요. 일전에 비슷한 경우를 보았는데, parentCommentId를 null로 둔걸 본 것 같습니다.(용량절약을 위한 목적이였다고 들었습니다) 혹시 최상위 자신의 commentId로 parentComentId를 지정한 부분에 대해 궁금해서 글 올리게 되었습니다. 감사합니다.
안녕하세요. JPA 학습중인 학생입니다. 양방향 참조 관계에서 여러 방법으로 연습하던 중, 예상치 못한 행동을 발견해 왜 이렇게 작동하는지 궁금해서 질문드립니다. 연습한 코드입니다. // Team - Member 는 1:N @Entity class Member { @Id @GeneratedValue private Long id; private String name; // 편의상 public @ManyToOne @JoinColumn(name = "TEAM_ID") public Team team; public Member() { } public Member(String name) { this.name = name; } } @Entity public class Team { @Id @GeneratedValue private Long id; private String name; // 편의상 public @OneToMany // 원래는 mappedBy = "team" 으로 owner 를 설정해야 함. @JoinColumn(name = "TEAM_ID") public final List<Member> members = new ArrayList<>(); public Team() { } public Team(String name) { this.name = name; } } 강의에서 배웠듯, 양방향 참조관계에선 mappedBy = ... 로 관계의 주인을 설정해야 합니다. 그런데 만약 이를 생략하면 어떻게 작동할까 호기심이 생겨 아래의 코드를 실행시켰습니다. EntityManager em = getEm(); // 편의상 코드 생략 em.getTransaction().begin(); Member member1 = new Member("member1"); Member member2 = new Member("member2"); Team team1 = new Team("team1"); Team team2 = new Team("team2"); // 편의상 코드 생략 // 단순 em.persist( given ) 을 수행합니다. persistAll(member1, member2, team1, team2); em.flush(); // DB 반영 System.out.println("============== AFTER FLUSH =============="); member1.team = team1; // [1] : mem1 의 팀을 t1 으로 설정 team2.members.add(member2); // [2] : mem2 의 팀을 t2 로 설정 em.getTransaction().commit(); // Member - Team 연관관계 변경 내용 commit em.close(); System.out.println("============== END =============="); 제 예상은 실행시 오류가 발생하거나 [1] 내용만 반영되는 것이었습니다. 하지만 실행하니 [1] , [2] 모두 반영되는 것을 확인하였습니다. DDL & 출력 내용 Hibernate: create table Member ( id bigint not null, name varchar(255), TEAM_ID bigint, primary key (id) ) Hibernate: create table Team ( id bigint not null, name varchar(255), primary key (id) ) Hibernate: alter table Member add constraint FKl7wsny760hjy6x19kqnduasbm foreign key (TEAM_ID) references Team ... ============== AFTER FLUSH ============== Hibernate: /* update scripts.entities.Member */ update Member set name=?, TEAM_ID=? where id=? Hibernate: /* create one-to-many row scripts.entities.Team.members */ update Member set TEAM_ID=? where id=? ============== END ============== 실행 후 DB 조회 내용입니다. 위 상황에서 왜 member1 , member2 의 팀 변경내용이 모두 반영되는지 알고 싶습니다. 이러한 경우 JPA 가 Member , Team 모두를 연관관계의 주인이라 인식하는 건가요? 아니면 JPA 가 Member -> Team , Team -> Member 두 참조를 서로 다른 연관관계(?) 라 해석해 동작하는 걸까요?
공부하던 중에 이 부분은 이렇게 수정해야 되는 것 아닌가..? 싶어서 글 남겨봅니다. [수정 제안 정보] 대상 강의록: 10. Optional.pdf 대상 위치: 강의록 p.24의 최상단 부분 , 영상의 10분 50초~ 수정 제안 수정 전: 사용 용도 orElse(T other) - 값이 이미 존재할 가능성이 높거나, ... 수정 후: 사용 용도 orElse(T other) - 값이 존재하지 않을 가능성이 높거나, ... 수정 제안에 대한 근거 orElse(T other) 는 other의 생성 비용이 높은 경우 에 "값이 이미 존재함에도 불구하고 생성 연산을 수행해야됨" 으로 인해서 비효율이 발생합니다. 이는 바꿔 말하면 "값이 존재하지 않는 경우에는 생성 연산이 필수적임" 이기 때문에 "값이 존재하지 않는 경우에는 비효율이 발생하지 않음" 이라고 해석할 수 있을 것 같습니다. 이때 강의에서 말하고자 하는 바는 "orElse()는 비효율이 발생할 수도 있다. 하지만 발생하지 않는 경우에는 사용해도 좋다." 라고 이해했는데, 이때 "비효율이 발생하지 않는 경우" 를 "값이 존재하지 않는 경우(생성 연산이 꼭 필요한 경우)" 라는 표현으로 대체 할 수 있기 때문에 "값이 존재하지 않을 가능성이 높은 경우(= 비효율이 발생하지 않는 경우)에는 orElse()를 사용해도 괜찮다." 라고 수정해야 하는 것이 아닌가 싶어서 제안합니다.
안녕하세요! 이번에 jooq를 도입하게 되어 강의를 보며 천천히 따라해보고 있습니다. 현재 Flyway + DDLDatabase(testcontainers 사용안함) 방식으로 dsl을 생성하는 것을 테스트하고 있는데요.. flyway migration 파일(.sql)에 프로시저와 함수 생성문을 넣고 코드 생성을 실행 하니 상용 버전을 이용하라고 메시지가 나오며 실행이 안되길래 공식 문서를 확인해보니 오픈소스 에디션에서는 지원을 하지 않는다고 되어있더군요 ㅠㅠ 섹션2 - 생성된 DSL 구조 살펴보기 강의에서는 DB 스캔 방식이지만 Routines 클래스가 잘 생성되는 것을 볼 수 있는데 혹 강사님께서는 시 상용 버전을 사용하신 걸까요?? 아니면 DB 스캔 방식은 상용 버전 상관없이 Routines 클래스가 생성이 되는 걸까요?
Null을 세지않으면 col1이 null도 세지 않아서 count가 3이 되는거 아닌가요? 질문은 동영상 강의에 들어가서 오른쪽에 커뮤니티 버튼을 통해 해주세요. 그래야 어떤 강좌에서 질문하셨는지 알 수 있습니다. 영상에서 몇 분 몇 초 대를 알려주셔야 제가 한 번에 질문 내용 확인이 가능합니다. 이미 다른 누군가가 질문을 한 이력 이 있을 수 있습니다. 질문 게시판을 한 번 확인 부탁드립니다. 학교의 과제나 타 강사의 코드 등 외부 수업 자료에 대해서는 답변하지 않습니다. 제가 다루는 커리큘럼 외의 이론이나, 너무 디테일한 컴퓨터 이론에 대해서는 답변 드리지 않습니다. 시험에 안 나오는 경우가 많고, 나와 봤자 1문제 나오는데 외워야 할 부분이 많은 것 등 (예시: 서브넷 마스크 계산) 질문을 올릴 때 이 글은 모두 지우고 내용을 입력해주세요.
[오타 정보] 대상 강의록: 10. Optional.pdf 대상 위치: 강의록 p.11의 2. ifPresentOrElse() 코드 부분 , 영상의 5분 ~ 오타 내용 수정 전 public class OptionalProcessingMain { ... System.out.println("=== 2. ifPresentOfElse() ==="); // Of라고 오타 ... 수정 후 public class OptionalProcessingMain { ... System.out.println("=== 2. ifPresentOrElse() ==="); // 'Of' -> 'Or' 수정 ...
위 도표를 보여주시면서 설명을 해주실때, 10시 정각에 스레드 1이 쿠폰 발급 로직을 시작 10시 2분에 완료가 된다면, 스레드 2는 스레드 1의 작업이 모두 종료될때까지 기다렸다림. 스레드 2는 10시 2분에 작업을 시작 이렇게 설명해주셨는데, 이게 잘 이해가 안됩니다... 제 생각에는 아래와 같이 10시에 동시에 처리되는 흐름이 되어야 할 것 같은데요... 즉, 스레드2는 쿠폰 생성 로직이 끝날 때까지 기다리지 않고, 스레드 1이 쿠폰 발급 로직을 수행 중이라도 스레드 2는 곧바로 Redis 값을 받고 독립적으로 로직을 수행 할 수 있을 것 같은데 아닌가요?? 레디스 자체는 싱슬스레드이니 레디스를 찌를때는 무조건 하나씩만 들어가겠지만 스레드 1은 레디스에 찌르고 값을 받아온 후 본인의 비즈니스 로직 수행할때 스레드2가 레디스 서버에 찌를 수는 없는건가요? 제가 이렇게 이해한 부분이 잘못된 것인지, 아니면 제가 강의 설명을 오해한 것인지 혼란스러워 질문을 드리게 되었습니다.
코드 문제에 대한 질문은 아니고 큰 따옴표와 작은 따옴표에 대한 질문입니다. 예를 들어 my_dict = { 'name': 'WeekendCode' 'age': 30; } print(my_dict) 출력값: {"name": "WeekendCode", "age": "30"} 이렇게 해도 괜찮은가요? 큰 따옴표와 작은 따옴표를 구별해서 외워야하는지 아니면 똑같이 동작하는지 궁금합니다. 만약 구별해야된다면 어떤 기준일때 작은 따옴표를 사용하고 어떤 기준일때 큰 따옴표를 사용하는지 궁금합니다. 코드에서 변수명을 작성할때는 큰 따옴표인데 이것의 출력값은 또 작은 따옴표라서 좀 헷갈리네요.