묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
배열과 문자열10:04초 질문드립니다.
printf("%s/n",str);이면 포인터 변수값 자체가 나와야하는게 아닌가 싶어서 문의드립니다. *문자가 없으니까 str안에 저장된 값이 아니고 포인터 자체 값이 나오는게 아닌가요?
-
해결됨실전! Querydsl
MemberJpaRepository basicTest에서 JPAQueryFactory 빈 등록 안됨 오류
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]순수 JPA 리포지토리문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용]실전! querydsl 강의에서 4강의 순수 JPA 리포지토리와 quertdsl을 듣고 있습니다. 메뉴얼 따라서 MemberJpaRepository를 작성하고 basicTest를 실행했는데 No qualifying bean of type 'com.querydsl.jpa.impl.JPAQueryFactory' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 오류가 나면서 실행이 안됩니다. JPAQueryFactory가 빈으로 등록이 안됐다고 하는거 같은데 MemberJpaRepository 생성자 안에서 할당해 주니까 memberRepository를 Autowired 할때 자동으로 들어간다고 생각했는데 아닌가요..? 검색해보니 JPAConfig 클래스를 생성해서 직접 bean을 등록하고 테스트에 @Import(JPAConfig.class)어노테이션을 작성해서 해결하면 된다고는 하는데 메뉴얼에 관련 내용이 없길래 다음 단계로 진행하기 전에 질문 드립니다. 정확한 상황을 알려드리기 위해 오류 발생 사진을 함께 첨부합니다.
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
봤어요 초기화
실기 재도전하려고 하는데 진도율 초기화 어떻게 하나요?
-
미해결더 자바, 코드를 조작하는 다양한 방법
클래스 로더가 메소드 영역에 저장하는 것은 바이트코드인가요?
안녕하세요! 수업 잘 듣고 있습니다!클래스 로더 수업 중에 로딩 과정에서클래스 로더가 .class 파일을 읽고 그 내용에 따라 적절한 바이너리 데이터를 만들고 "메소드" 영역에 저장.이라는 말이 있는데 바이트 코드가 메소드에 저장되는거 아닌가요? 인터프리터를 거쳐야 바이너리 데이터가 되는거 아닌가요?
-
미해결김영한의 실전 자바 - 기본편
OCP원리 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]12. 다형성과 설계 강의 자료에서 OCP원리를 보면 코드 수정은 닫혀 있다는 의미에서 "새로운 차를 추가하게 되면 기능이 추가되기 때문에 기존 코드의 수정은 불가피하다. 당연히 어딘가의 코드는 수정해야 한다."라고 되어 있습니다. 기존 코드의 수정이 불가피하다고 하는데 왜 코드 수정은 닫혀 있다고 표현하는 건가요?
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
#define SQUARE(x)((x) * (x))에 대한 예시는 없을까요?
#define SQUARE(x)((x) * (x))에 대한 예시는 없을까요? SQUARE(x)에 ((x) * (x))를 정의하는건지SQUARE에 (x)((x) * (x))를 정의하는건지 모르겠어요
-
미해결김영한의 실전 자바 - 기본편
접근제어자, 클래스 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.class의 접근제어자를 private으로 설정시 외부 호출을 막는 것은 이해를 합니다.class의 volume 변수에 대해 실제 수정 해야 상황일 경우 (volume 200이 가능하게 되었을 때) privat로 설정된 volume 변수 수정 권한을 setting하는 것은 어떤 조직 구성과 방법으로 하는지 실제 경험을 사례로 설명을 요망합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
RunWith
프로젝트 생성부분의 마지막 강의 수강중이고, 위와 같이 코드를 작성했을 때 다음과 같은 오류가 납니다https://drive.google.com/file/d/1g1uPQj8hZvNmWr3u9NBwMTuI_NOZWSKC/view?usp=sharing프로젝트 파일도 같이 첨부합니다
-
해결됨얄코의 떠먹여주는 객체지향 디자인 패턴
안녕하세요.
"구독자들에게 메시지를 보내는 발행 메소드는 발행자 인터페이스를 적용한 클래스로부터 호출 받습니다." 라고 설명해주셨는데요코드상에서는 Broker 클래스가 따로 Publisher 인터페이스를 적용하지 않은 상태인 것 같아서요.궁금하여 질문 남깁니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
.ifPresent 사용법
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]멤버 삭제 기능을 만들려고 하는데 이렇게 하는게 맞을까요?한개의 멤버만 받아서 삭제하고 싶은데 어떻게 처리해야 할까요? public boolean deleteProduct(String productName){ List<Product> result = em.createQuery("select p from Product p where p.productName = :productName", Product.class) .setParameter("productName", productName) .getResultList(); return true; } getResultList 로 하니까 여러개 나올거 같은데 한개만 삭제하려면 어떻게 해야 하나요? 그리고 em.remove하면 되나요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
ReentrantLock과 비관적락
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.실무에서 DB 관련 데이터에 대해 동시성 이유가 있으면 비관적락을 쓰는것으로 알고 있습니다. JPA의 비관적락은 DB 계층에서 동기화 기술이고 ReentrantLock은 어플리케이션 계층의 동기화 라는데...실무에서 ReentrantLock은 언제 사용이 되나요?? ReentrantLock을 사용하면 DB 접근 동기화가 되지 않나요?? 둘의 명확한 차이점이 궁금합니다.
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
이름에 유니크 제약 조건을 거는 것
[질문 내용]강의에서 회원의 이름으로 중복된 계정을 검증하고, DB에서 회원의 이름을 Unique 제약 조건으로 잡는 게 좋다고 하셨는데이건 이 예제에서의 가정인 거고, 현업에선 이름만으로 중복 계정을 검증하거나, 이름에 유니크 제약 조건을 거는 경우는 거의 없다고 봐도 되나요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
파이썬처럼 int a 선언 없이 a=10으로 해놓고 그때그때 int(a)처럼 쓰면 안되나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.
-
해결됨얄코의 떠먹여주는 객체지향 디자인 패턴
질문이있습니다.
현재 예시 코드에서는 state 상태에 따라서 생성자를 매번 호출하는데이거는 메모리 오버플로우 가능성이 있는 코드라고 볼 수 있을까요?
-
해결됨얄코의 떠먹여주는 객체지향 디자인 패턴
DIP 질문
DIP 예제 코드에서 질문이 있습니다.Switchable 이라는 interface를 객체로 Switch가 갖게되는데요.구조가 이렇게 바뀌어도Fan의 turnOn 함수에 예를 들어 매개변수가 들어가게 되면 (Overloading)Switch 클래스에도 영향이 가지 않나요?switch class의 tunrOn함수의 device.turnOn() 함수도 바뀌어야 하니까요..?
-
해결됨[말 한마디로 뚝딱!] AI와 함께 나만의 수익화 웹사이트를 만드는 법
ai툴 유료버전사용?
혹시 커서와 챗지피티 전부 유료버전 끊어서 사용하고 계신가요?
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
wait notify 락 획득 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. notify 로부터 깨어난 스레드와 synchronized 메서드를 호출한 스레드 중 누가 락을 획득한다에 대한 우선권이 있나요?만약 모든 스레드가 wait 을 하고 있는 상태라면 누군가가 notify를 호출해줘야만 하는 건가요
-
해결됨스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판
댓글 수 구현에서 동시성 문제 해결 질문드립니다
학습 관련 질문을 최대한 상세히 남겨주세요!고민 과정도 같이 나열해주셔도 좋습니다.먼저 유사한 질문이 있었는지 검색해보세요.인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.안녕하세요 댓글 수 구현 강의를 해보다가 동시성 문제를 해결해보고 싶어서 비관적 락 for update를 사용하는 방법으로 한번 코드를 짜보고 테스트를 해보고 있습니다.코드는 아래처럼 짜보았습니다@Table(name = "article_comment_count") @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @ToString public class ArticleCommentCount { @Id private Long articleId; private Long commentCount; public static ArticleCommentCount init(Long articleId, Long commentCount) { ArticleCommentCount articleCommentCount = new ArticleCommentCount(); articleCommentCount.articleId = articleId; articleCommentCount.commentCount = commentCount; return articleCommentCount; } public void increase() { this.commentCount++; } public void decrease() { this.commentCount--; } }public interface ArticleCommentCountRepository extends JpaRepository<ArticleCommentCount, Long> { @Lock(LockModeType.PESSIMISTIC_WRITE) Optional<ArticleCommentCount> findLockedByArticleId(Long articleId); }@Service @RequiredArgsConstructor public class CommentService { private final CommentRepository commentRepository; private final Snowflake snowflake = new Snowflake(); private final ArticleCommentCountRepository articleCommentCountRepository; @Transactional public CommentResponse create(CommentCreateRequest request) { Comment parent = findParent(request); Comment comment = commentRepository.save( Comment.create( snowflake.nextId(), request.getContent(), parent == null ? null : parent.getCommentId(), request.getArticleId(), request.getWriterId() ) ); ArticleCommentCount articleCommentCount = articleCommentCountRepository.findLockedByArticleId(request.getArticleId()) .orElseGet(() -> { ArticleCommentCount newCount = ArticleCommentCount.init(request.getArticleId(), 0L); articleCommentCountRepository.save(newCount); return newCount; }); articleCommentCount.increase(); articleCommentCountRepository.save(articleCommentCount); return CommentResponse.from(comment); } private Comment findParent(CommentCreateRequest request) { Long parentCommentId = request.getParentCommentId(); if (parentCommentId == null) { return null; } return commentRepository.findById(parentCommentId) .filter(not(Comment::getDeleted)) .filter(Comment::isRoot) .orElseThrow(); } public CommentResponse read(Long commentId) { return CommentResponse.from(commentRepository.findById(commentId).orElseThrow()); } @Transactional public void delete(Long commentId) { commentRepository.findById(commentId) .filter(not(Comment::getDeleted)) .ifPresent(comment -> { if (hasChildren(comment)) { comment.delete(); } else { delete(comment); } }); } private boolean hasChildren(Comment comment) { return commentRepository.countBy(comment.getArticleId(), comment.getCommentId(), 2L) == 2; } private void delete(Comment comment) { commentRepository.delete(comment); articleCommentCountRepository.findLockedByArticleId(comment.getArticleId()) .ifPresent(articleCommentCount -> { articleCommentCount.decrease(); articleCommentCountRepository.save(articleCommentCount); }); if(!comment.isRoot()) { commentRepository.findById(comment.getParentCommentId()) .filter(Comment::getDeleted) .filter(not(this::hasChildren)) .ifPresent(this::delete); } } public CommentPageResponse readAll(Long articleId, Long page, Long pageSize) { return CommentPageResponse.of( commentRepository.findAll(articleId, (page - 1) * pageSize, pageSize).stream() .map(CommentResponse::from) .toList(), commentRepository.count(articleId, PageLimitCalculator.calculatePageLimit(page, pageSize, 10L)) ); } // 무한 스크롤 public List<CommentResponse> readAll(Long articleId, Long lastParentCommentId, Long lastCommentId, Long limit) { List<Comment> comments = lastParentCommentId == null || lastCommentId == null ? commentRepository.findAllInfiniteScroll(articleId, limit) : commentRepository.findAllInfiniteScroll(articleId, lastParentCommentId, lastCommentId, limit); return comments.stream() .map(CommentResponse::from) .toList(); } public Long count(Long boardId) { return articleCommentCountRepository.findById(boardId) .map(ArticleCommentCount::getCommentCount) .orElse(0L); } }@Test void concurrencyCountTest() throws InterruptedException { Long articleId = 24L; int threadCount = 10; ExecutorService executorService = Executors.newFixedThreadPool(threadCount); CountDownLatch latch = new CountDownLatch(threadCount); for(int i = 0; i < threadCount; i++) { final Long writerId = (long) (1000 + i); executorService.execute(() -> { try { createComment(new CommentCreateRequest(articleId, "concurrency test", null, writerId)); } catch (Exception e) { System.err.println("Exception in thread: " + Thread.currentThread().getName() + " -> " + e.getMessage()); } finally { latch.countDown(); } }); } latch.await(); Long commentCount = restClient.get() .uri("/v1/comments/articles/{articleId}/count", articleId) .retrieve() .body(Long.class); System.out.println("최종 commentCount = " + commentCount); assertThat(commentCount).isEqualTo(threadCount); }그런데 이렇게 했을때맨 처음 실행을 하면 1개의 데이터만 삽입되고 나머지 9개는 소실이됩니다그리고 한번더 실행하면 11개의 데이터가 저장되는데 맨처음 저장된 1개의 데이터 + 10개의 스레드가 저장한 10개의 데이터가 되어 11개가 됩니다.여기서 문제가 article_comment_count 테이블에 데이터가 아예 없을때 10개의 스레드가 동시에 insert문을 날리려고해서 Duplicate entry '24' for key 'article_comment_count.PRIMARY' 이런 문제가 나오지 않나 생각이 듭니다만.. create 메서드에 @Transactional(isolation = Isolation.READ_COMMITTED)로 격리 수준을 높여봤지만 여전히 문제가 해결되지 않습니다.혹시 제가 잘못 이해한 부분이 있을까요? 그리고 동시성 문제를 해결하려면 어떻게 해야할까요? gpt에 물어보거나 구글링해서 찾아봐도 해결이 되지 않아서 질문드립니다!
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
Executorservice 궁금한게 많습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요?예[질문 내용]실무 웹앱의 특정 api 의 연산속도가 너무 느려ExecutorService 를 활용하여 멀티스레드기법으로 연산속도를 올려볼 계획입니다.ExecutorService executor = Executors.newFixedThreadPool(5);위와 같이 스레드풀의 스레드갯수를 5로 설정하려고합니다. 근데 이때 특정 api 에 동시에 5개의 요청이 들어왔다면 executor 객체가 메모리상에 5개가 생성되면서 스레드풀도 자동으로 5개 생성돼 총 25개의 스레드가 생성될것으로 보이는데 이게 서버에 부하를 주지는 않을지 궁금합니다.아니면 실무에서는 ExecutorService 를 static 싱글톤으로 선언해서 더이상 인스턴스가 생성되지 않게 하고 캐시풀 전략을 사용해야하는건지 궁금하네요. 그리고 ExecutorService 같은건 요청이 몰리는 api 같은데서 사용하는게 아니라 배치작업같은데서 사용해야하는건지도 궁금합니다.. 궁금한게 많은 주니어 개발자입니다. 영한님의 답변을 듣고싶네요 ㅠㅠ ai 말고 ㅠㅠ
-
미해결1시간만에 끝내는 virtual thread in spring boot
ThreadPoolTaskExecutor에서의 가상스레드
안녕하세요! 너무 좋은 무료강의 감사합니다:)강의를 듣는와중에 궁금증이 생겼는데요. log.info("3) Service virtual true: {}", Thread.currentThread().isVirtual());현재 스레드가 가상스레드가 맞는지 확인 하는 위와 같은 코드를 심어 실행해 보았습니다. 컨트롤러의 경우 항상 true를 리턴했고, SimpleAsyncTaskExecutor의 경우에도 true를 리턴했습니다. 그러나 예제코드에서 세팅하신 ThreadPoolTaskExecutor의 설정으로는 false를 리턴하였습니다. 해당 현상을 gpt한테 100% 공식문서 기반으로 설명하라고 하자 ThreadPoolTaskExecutors는 VirtualThread와 상호작용 중이라는 힌트 정보를 붙인 것이다(?) 라는 답변을 하여 이해하기가 힘들었습니다. 일단 threadPoolTaskExecutor.setThreadFactory(Thread.ofVirtual().name("vthread-", 0).factory());와 같은 ThreadPoolTaskExecutors의 세팅을 추가해주니 isVirtual 에대한 true값이 나오긴 했습니다. 제 부족한 견문으로는 이해가 되지 않는 현상이라 강사님이 도움을 주실수 있나해서 문의드립니다 🙂