[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 영한님 안녕하세요 Spring Data JPA를 사용해서 벌크 연산 관련해서 공부하던 중에 이상한 점을 발견했습니다. (Spring Data JPA 지만 영속성 컨텍스트 flush는 이 강의와 관련이 깊다 생각해 이 강의에 질문 드립니다) ..... 우선 실제 제가 겪었던 상황의 코드가 아닌 다른 같은 상황의 예제 코드이기 때문에 완전하지 않은 점 양해 부탁드립니다.. 3개의 엔티티 (User, UserRole, Comment) 가 존재하고 연관관계 매핑 및 외래키 제약조건은 존재하지 않습니다. // 코드 ~~ List<User> userList = new ArrayList<>(); // 코드 ~~~~ userRepository.saveAll(userList); // 저장 userRoleRepository.save(user_role_map); // 저장 Comment c = new Comment("1", "코멘트"); commentRepository.save(c); // 저장 // 코멘트는 제가 직접 객체를 생성해서 테스트 해보려고 추가하였습니다. 로직과는 관련없습니다. // 위의 userList와 다른 리스트 updateName(userListToUpdate); public interface UserRepository extends JPARepository<User,Long> { @Modifying(clearAutomatically = true) @Query(UPDATE User u SET u.name ="AA" WHERE u IN :users) int updateName(@Param("users") List<User> users); } User에 대해 벌크연산을 진행했습니다. 여기서, userList가 비어있고, userRole와 Comment c에 대해 insert 쿼리가 나가지않고 벌크 연산 업데이트만 진행됩니다..! 이 부분은 당연히 영속성 컨텍스트가 clear 됐기 때문에 그런거라고 이해했습니다. 하지만, userList가 비어있지 않은 경우에는 saveAll로 인해 insert 쿼리가 나가면서 userRole, c 까지 모두 insert 쿼리가 실행되는데 이 부분이 잘 이해가 가질 않습니다... 요약하면, user에 대해 insert 쿼리가 실질적으로 나갈 때에만 다른 엔티티들도 @Modifying(clearAutomatically = true) 되면서 같이 insert 쿼리가 나가고, 비어있지않은 경우에는 insert 쿼리가 나가질 않습니다. 이 벌크 연산이 User에 대한 것이기 떄문에 user에 대한 동기화쿼리는 나가고, 그게 나가면서 다른 엔티티까지 같이 나가는 원리일까요? userRole과 comment는 모두 연관관계매핑도 되어있지않은데 왜 insert 쿼리가 같이 나가는지 궁금합니다
const getStringedDate = (targetDate) => { let year = targetDate.getFullYear(); let month = targetDate.getMonth() + 1; let date = targetDate.getDate(); if (month < 10) { month = `0${month}`; } if (date < 10) { date = `0${date}`; } return `${year}-${month}-${date}`; }; 초기값 설정 할 때 input 태그가 date 객체를 해석하지 못해서 위의 getStringedDate() 함수로 문자열로 변환하여 value 속성으로 넣어줘야 한다고 하셨는데요, 사용자 입력값을 넣을 때는 input을 수정하면 문자열로 들어가기 때문에 다시 date 객체로 바꿔주는 함수를 새로 사용해야 하던데 <input name="createdDate" onChange={onChangeInput} value={getStringedDate(input.createdDate)} type="date" /> 이미 여기서 getStringedDate() 로 객체에서 문자열 변환하는 함수를 사용해서 값을 나타내야하기 때문에 onChangeInput() 함수를 사용해야 하는건가요? 이 흐름이 맞는 거 같긴한데 왠지 좀 번거로운거 같아서 제가 이해한게 맞는지 궁금해서요 참고로 섹션13 12.14)강의의 10:22 부분을 듣고 생긴 질문입니다!
위 이미지는 교재 376페이지의 상단 부분입니다. testUpload()를 실행시켰더니 "Tests Passed:"라는 메시지와 함께 실행성공되었습니다. 그런데, 위 이미지에 나와있는, "S3의 버킷"을 AWS 어디에서 찾을 수 있는 지 모르겠습니다. 아래 이미지는 나의 AWS S3 버킷 부분입니다.
6:46초에서 설명하시는대로 패치 조인을 사용하지 않고, 기본 조회만 했을 때 프록시로 인해 지연 로딩이 발생할 것으로 기대했으나, 마치 패치 조인처럼 한번만 조회되고 모든 데이터가 출력됩니다. 원인을 잘 모르겠는데 알려주세요. Team은 LAZY 조인으로 설정되어 있음 Team teamA = new Team(); teamA.setName("teamA"); em.persist(teamA); Team teamB = new Team(); teamB.setName("teamB"); em.persist(teamB); Member member1 = new Member(); member1.setUsername("USER1"); member1.changeTeam(teamA); em.persist(member1); Member member2 = new Member(); member2.setUsername("USER2"); member2.changeTeam(teamA); em.persist(member2); Member member3 = new Member(); member3.setUsername("USER3"); member3.changeTeam(teamB); em.persist(member3); List<Member> noFetchJoin = em.createQuery("SELECT m FROM Member m", Member.class).getResultList(); for (Member member : noFetchJoin) { System.out.println("member: " + member.getUsername() + " | Team: " + member.getTeam().getName()); } 결과:
Next.js 완벽 마스터 (v15): 노션 기반 개발자 블로그 만들기 (with 커서AI)
안녕하세요. 지금까지 알려주신 내용에서 Notion 통해 글을 추가/삭제했을 때, 그에 대한 반영이 이루어지기 위해 unstable_cache 적용 시 revalidate 옵션(단위: s(초))을 줘야 하는 것을 확인했습니다. (getPublishedPosts 구현부분에서 언급되지 않은부분이라 강의내용과 공식문서 토대로 동작 확인했습니다.) Notion이 아닌 실제 페이지에서 글쓰기를 했을 때는 revalidateTag 함수를 호출하여 캐시를 무효화시켰었습니다. 문제는 목록 가져올때도 매번 revalidateTag 함수를 사용하게 된다면 캐시 사용하는게 무의미해질거라 생각합니다. 즉시 반영을 위해서는 Webhook 연동이 필요해보이나, 생각보다 구현 난이도가 복잡해서 revalidate를 적절하게 주는게 좋을거라 생각했습니다. 그렇다면 효율적인 revalidate 값은 어느정도로 지정하는게 좋을까요?? TanStack Query ClientProvider에서 지정한 것처럼 1분 정도가 적절하려나요?? 그리고 실제 구현 이루어지는 프로그램(ex. 쇼핑몰)에 따라 기준이 달라질 것 같은데요. 이에 대한 강사님 의견 듣고싶습니다.
1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 제가 멀티스레드와 동시성 관련해서 제대로 깊게 알아야할거같아서 다시복습으로 듣고있는데 예전에 질문했던 내용과 동일한거같아서 다시 질문드려요 ㅠ 그전에 처음 들어서 헷갈린부분이있었는데 다시들으면서도 설명한 부분이 맞나 싶어서요. 그전에 질문할때도 강의내용이 맞는지에 대한 질문이라 조심스러운부분이고 제가 잘못안다고 생각했는데 짚고넘어가면 좋을거같아서 다시 질문드립니다! 이전 질문 링크: https://inf.run/t3Bbm 71. 스레드의 대기 강의 핵심 질문 : 부분(13:30)강의에서 ReentrantLock 락 획득 실패시 대기큐에 WAITING상태라고 설명했는데 BLOCKED 상태가 가맞는지 검토필요. 이부분에 대한 검토가 필요할거같고 제가 잘못알고있다면 참고해야할 링크를 주시면 감사하겠습니다. 아니라면 저처럼 이해하는데 오해의 소지가있는부분이 발생할것같습니다. 질문내용 : 부분(13:30)에서 대기1 락을 획득하기위한 대기큐에 대해서 설명해주셨고 lock()호출시에 이미 다른 스레드가 락을 획득시에는 WAITING상태로 대기하고 synchronized인 경우에만BLOCKED인거고 ReentrantLock은 WAITING 상태로 락획득을 대기큐에서 대기한다 라고 설명해주셧는데 이부분이 락이아닌 큐가 꽉차거나 완전히 비어있을때(특정 조건)는 RUNNABLE에서 await()사용해서 WAITING상태로 만들고 이걸 스레드대기공간(집합)에 넣고 추후 명시적으로 깨울수있게하는데, 락획득 실패시에는 BLOCKED상태로 락대기집합에 있는거고, 얻고나서 RUNNABLE상태에서 특정조건에 부합되지않을때(큐가 꽉차거나, 없을때) await를 써서 다시 WAITING상태로 스레드 대기집합에 넣는게 맞는거같아서 검토부탁드립니다.! 그래서 이전강의 notify설명(synchronized 부분이긴하지만)에서도 WAIT -> BLOCKED 설명해주실때 WAIT이던애를 깨우면 바로 RUNNABLE이 되는게아니라 BLOCKED되는 설명부분이랑 ReentrantLock 역시 같은 원리가 맞는거같은데 이부분 다시 검토해주실수있나해서요ㅜ ReentrantLock 이라고해서 lock얻는걸 실패해도 WAITING이라는건 아닌거같아 검토해주시면 감사하겠습니다..! 그리고 (17:40) synchronized의 경우 blocked일때는 interrupt로 깨우지못한다고했고(이부분설명은 맞는데) reentrantlock은 lockInterruptibly() 를 사용하면 가능하다고 했는데 이게 WAITING상태여서 가능하다기보단 lockInterruptibly이 BLOCKED상태인 스레드를 InterruptedException가 발생해서 blocked상태에서 빠져나오는게하는 기능인거 같은데 이부분도.. reentrantlock역시 lock()만 사용으로는 못깨우고 이게 WAITING인거랑 좀 별게인거같아서 검토해주실수있을까해서요! 아래 참고 링크를 걸긴했는데 강의들 들으면서 사이클을 생각하다가 락을 획득할려다가 실패시 WAITING으로 대기한다라는게 원리상 아닐거같아서 찾아본게 oracle에서는 명시적으로 나타내진않았고 chat gpt에게 물어보면 제가 계속 waiting이 맞지않냐 blocked은 아니지않냐 공식문서 있냐 물어보면 명시적이진 않지만 유추할수있다 라고도 하고 그래서 결국 찾은 링크가 아래인데 공식은 아니고 블로그 내용이긴해서,, 한번더 영한님이 체크해주실수있을까해서요 아래 chat gpt 답변과 블로그 링크에서 해당 내용부분 스샷도 일부 남길게요! https://blog.ycrash.io/java-suspended-thread-states-blocked-waiting-timed_waiting/?utm_source=chatgpt.com ------ 질문을 남기니 그때처럼 인프런ai가 답변했는데 저 내용이 맞는거같아서요!
react 개발하다보면 대부분의 파일에서 export default 하나만을 하게 되는데요. 아래 2가지 패턴 중 2번을 주로 사용하시는 것 같아서 이유가 있으신지 궁금합니다 export default function ABC() const ABC = () => {} export default ABC; 저는 1번을 강하게 선호하고 왜 굳이 하나의 함수에 대한 정의를 둘로 나눠 거리를 벌리는지 이해가 안 가는데요, 코딩 고수(?)들이 주로 2번 패턴을 사용하셔서 이유가 궁금합니다
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] orderService.findOrders(orderSearch) 가 작동하지 않습니다. 오류를 고쳐보다 join에 무언가 문제가 있다는 걸 알아냈습니다. em.createQuery("select o from Order o", Order.class).getResultList()는 정상적으로 작동하나 em.createQuery("select o from Order o join o.member m", Order.class).getResultList() 는 반환 값이 없습니다. 조인을 하게 되면 문제가 발생하는데 어떻게 해결해야 할까요.
eas build --platform android --profile preview --local --local 플래그로 로컬에서 빌드해서 테스트 해보고 있습니다. EXPO_PUBLIC_FRONT_URL EXPO_PUBLIC 접두사를 붙여서 환경변수 넣어두었고 Alert.alert("uri", process.env.EXPO_PUBLIC_FRONT_URL); 위처럼 Alert 로 체크해보니 비어있었습니다 로컬로 빌드할시에 더 셋팅해줘야 하는 부분이 있을까요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 궁금증이 생겨서 질문을 드립니다. home.html을 만들고 나서 localHost:8080을 호출 할때, 크롬에서 index.html 페이지가 계속 떠서 코드에 문제가 없는지 확인해 보았습니다. 그래서 pdf파일에 있는 코드들도 복사 붙여놓기 해보고, 빠진것들이 없나 확인도 해보았지만 문제를 해결할수 없어서, 질문들을 확인해보니 캐시에 대한 답변이 있어서 다른 인터넷으로(edge) localHost:8080 을 치니 home이 잘 표시되더라고요… 그리고 나서 크롬 설정에 들어가서 캐시를 지우니까 홈 화면이 나오는 것을 확인할 수 있었는데요.(그전까지는 계속 index.html 뜨더라고요) 개발을 하다 보면 이런 것이 생각 안날수도 있을것같은데(캐시 문제 보다 내 코드가 문제 있겠지라는 생각이요) 이것에 대안 대처법 은 없나요?(계속 저가 일일히 캐시를 삭제 해야하 는건지? - 귀찮은 생각이 들더라고요) 답변 부탁 드립니다. 수정1 읽어보니 글이 이상해서 수정