묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
첫 프로젝트 생성 문의
프로젝트 생성해서 자바 17버전을 깔고 다시 나갔다 들어오니 처음 화면이 저렇게 나옵니다 우측 선생님과 같은 화면이 안나오는데 어떻게 해야하나요??
-
미해결실습으로 배우는 선착순 이벤트 시스템
Redis의 INCR 사용 해도 Race condition이 잡히지 않는 문제
안녕하세요! 강사님 덕분에 현재 진행중인 프로젝트 코드에 동시성 문제 잘 적용하고 있습니다. 다름이 아니라, 현재 MSA 프로젝트를 하고 있어 쿠폰 쪽 DB는 쿠폰만 쓰기 때문에 부하에 따른 걱정은 덜어도 될 것 같아 카프카가 아닌 Redis의 INCR 명령어를 통해서 선착순 쿠폰 로직의 Race condition 문제를 잡아보려고 하고 있는데요.질문에 앞서 프로젝트 환경을 말씀드리자면 강의와 동일하게 docker pull redis 해서 이미지로 다운받아 실행했고, 6380 포트로 연결해줘서 yml 설정과 Config 설정 또한 해줬습니다. INCR 키 값을 살짝 바꿔서 coupon_count:{couponId} 가 되도록 해줬습니다. 문제는 1000개의 쓰레드로 요청을 날렸을 때 여러번의 요청 테스트는 통과가 안된다는 점입니다.. 쿠폰 발급이 100개 되어야하는데 102, 103번 애매하게 되고 있습니다. (postman으로 API 요청 날릴 때마다 해당 키 값의 value가 1씩 잘 증가하는 것은 확인했습니다) RDB 상에서도 100개의 발급 내역이 잘 들어오고 있구요. (물론 테스트가 DB에 영향을 미치면 안되지만요ㅠㅠ)이런 경우는 왜 그런건가요?? 코드도 첨부 하겠습니다. 감사합니다!!/* * 선착순 쿠폰 발급 */ @Transactional public CouponIssuedResponseDto issueFirstComeCoupon(CouponIssuedRequestDto request) { // 쿠폰 ID로 쿠폰을 찾고, 존재하지 않으면 예외 처리 Coupon coupon = couponRepository.findById(request.couponId()) .orElseThrow(() -> new CustomException(ErrorCode.COUPON_NOT_FOUND)); // 발급 가능한 쿠폰 수량 확인 -> Redis Long currentCount = couponCountRepository.getCount(request.couponId()); if (currentCount > coupon.getMaxQuantity()) { throw new CustomException(ErrorCode.COUPON_ISSUE_LIMIT_EXCEEDED); } // 새로운 쿠폰 발급 -> Redis에서 수량 증가 Long newCount = couponCountRepository.increment(request.couponId()); if (newCount > coupon.getMaxQuantity()) { throw new CustomException(ErrorCode.COUPON_ISSUE_LIMIT_EXCEEDED); } CouponIssued issued = CouponIssued.builder() .coupon(coupon) .userId(request.userId()) .issuedAt(LocalDateTime.now()) .build(); CouponIssued saved = couponIssuedRepository.save(issued); return CouponIssuedResponseDto.fromEntity(saved); }@Repository public class CouponCountRepository { private final RedisTemplate<String, Long> redisTemplate; public CouponCountRepository(RedisTemplate<String, Long> redisTemplate) { this.redisTemplate = redisTemplate; } public Long increment(Long couponId) { String key = "coupon_count:" + couponId; return redisTemplate.opsForValue().increment(key, 1); } public Long getCount(Long couponId) { String key = "coupon_count:" + couponId; Long count = redisTemplate.opsForValue().get(key); return count != null ? count : 0L; } }@BeforeEach public void setUp() { // Redis 초기화 redisTemplate.opsForValue().set("coupon_count:10", 0L); } @AfterEach public void tearDown() { couponRepository.deleteAll(); couponIssuedRepository.deleteAll(); redisTemplate.delete("coupon_count:10"); // 테스트 끝난 후 Redis 데이터 삭제 } @Test public void multipleUserIssueCoupon() throws InterruptedException { // Given // 쿠폰을 생성 Coupon coupon = Coupon.builder() .name("Test Coupon") .couponCode("TEST100") .discountRate(10) .maxQuantity(100L) .issuedQuantity(0L) .expiresAt(LocalDateTime.now().plusDays(30)) .couponType(CouponTypeEnum.FIRST_COME) .build(); couponRepository.save(coupon); Long couponId = coupon.getCouponId(); // 고정된 couponId 사용 Long userId = 1L; // 고정된 userId 사용 // When int threadCount = 1000; ExecutorService executorService = Executors.newFixedThreadPool(50); CountDownLatch latch = new CountDownLatch(threadCount); for (int i = 0; i < threadCount; i++) { executorService.submit(() -> { try { CouponIssuedRequestDto request = new CouponIssuedRequestDto(10L, userId); couponIssuedService.issueFirstComeCoupon(request); } catch (CustomException e) { // Expected exception when limit is exceeded } finally { latch.countDown(); } }); } latch.await(20, TimeUnit.SECONDS); // Then Long count = redisTemplate.opsForValue().get("coupon_count:10"); System.out.println("coupon_count:10 = " + count); // 디버깅용 로그 추가 assertThat(count).isNotNull(); // count가 null이 아닌지 확인 assertThat(count).isEqualTo(100); // 발급된 쿠폰의 수를 확인 long issuedCount = couponIssuedRepository.count(); assertThat(issuedCount).isEqualTo(100); }
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
문제 풀이시 설명 요청 드립니다.
선생님 문제풀이 하실 때 짝수, 약수를 구분해서 빠르게 문제를 파악하는 스킬은 매우 좋은 방법 같아요그런데 코드가 한번 돌아가면서 변수 숫자가 바뀌는데 그냥 풀어버리시니까 어떻게 하는 지 프로그램을 사용해보지 않은 비전공자 입장에서는 이해가 덜 가는 것 같아요조건 반복문에서 변수가 증감되는 것이 헷갈리거든요문제를 풀 때는 하나 하나 숫자를 적어가면서 변하는 값을 알고 대입해야 하는데.. 풀이를 보니 쫒아가지를 못하겠네요조건 반복문 문제풀이에서 어떻게 계산하라는 거지? 라는 생각이 들어요. 제가 표도 그려서 적어보기도 하고.. 여러 방법을 시도해봤는데 여러개의 변수가 들어가면 헷갈리더라고요 (15분 전 문제, 15분 문제)조금만 더 자세하게 천천히 알려주시면 감사하겠습니다. 수포자는 더 힘들어요. ㅋㅋ
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
test-resources - application-test.yml로 했을 때 h2에 테이블이 생성되지않아요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의대로 application.yml로 했을 때는 생성이 잘 되었습니다.그런데 test -resource - application-test.yml로 넘어가니h2에 Member테이블이 생성되지 않습니다. 어떻게 해야할까요?
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
강의 중 이해가 안되어 질문드립니다.
마지막 if문에서value i==0 && value j==0이면 트루인데위에 문장에서 count되어서 숫자가 하나씩 계속 증가하게 되는거 아닌가요? 그럼 트루가 아니게 되는게 아닌지 모르겠어서 여쭤봅니다.
-
미해결예제로 배우는 스프링 입문 (개정판)
jar 안되는 분들 참고하세요
java -jar target/spring-petclinic-3.3.0-SNAPSHOT.jar강의에서 처럼 주소 지정이 안찾아지는 분들은 왼쪽 상단바에 jar검색하셔서 해당하는 주소값을 마지막에 적으시면됩니다.왼쪽 파일 검색 jar검색java -jar target/해당하는 파일명.jarex)java -jar target/spring-petclinic-3.3.0-SNAPSHOT.jar
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
질문을 이상한데다 했었네요ㅠㅠ
https://www.inflearn.com/questions/1307841답변 부탁 드립니다!!
-
해결됨자바 9부터 자바 21까지
14강 Map에 대해서 질문이 있습니다.
안녕하세요 !항상 좋은 강의 감사합니다. 😃강의 10:09 에서 말씀해주실때 firstEntry와 lastEntry만 immutable이라고 말씀해주셔서 테스트를 해봤습니다.pollFirstEntry와 pollLastEntry도 unmodifiable copy 객체를 반환하는 거같아서요 public static void main(String[] args) { LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>(); linkedHashMap.put("key1", "value1"); linkedHashMap.put("key2", "value2"); linkedHashMap.put("key3", "value3"); Map.Entry<String, String> firstEntry = linkedHashMap.pollFirstEntry(); firstEntry.setValue("new value"); }이렇게 했는데 예외가 발생했습니다.추가로14강 9:50 에 reversed()도 immutable이라고 말씀해주셨었는데 호기심에 테스트를 해보니 데이터가 수정됩니다.@Test @DisplayName("reversed 데이터 추가 및 원본 데이터 수정가능하다.") void add() { LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>(); linkedHashMap.put("key1", "value1"); linkedHashMap.put("key2", "value2"); linkedHashMap.put("key3", "value3"); SequencedMap<String, String> reversed = linkedHashMap.reversed(); reversed.put("key4", "value4"); Assertions.assertSame(4, linkedHashMap.size()); }
-
해결됨자바 9부터 자바 21까지
12강 AnimalDto에 대해서 질문이 있습니다.
12강 11:24 쯤 질문이 있습니다sealed interface AnimalDto를 구현한 Dto 2개를 switch와 sealed를 사용해서 코드를 깔끔하게 할 수 있다는 걸 알게되었습니다.실제 코드로 작성하면 of의 반환 타입은 인터페이스인 AnimalDto가 되는데 이때 DogDto와 CatDto의 필드를 조회할 수 있는 추상 메서드가 모두 있다는 전제로 말씀해주시는게 맞을까요?
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
자바 파이썬 기출문제 변형 수업자료
없나요 ㅠㅠ?
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
질문
System.out.printin("str1==str2:"+(str1==str2));여기서 출력값이 왜 true혹은 false로 나오는건가요? 앞에 +가 참거짓을 나타나게해주는건가요? 디테일한 설명이 없어서 따라가기가 힘듭니다.. 강의수준에는 입문이라고 되어있는데전혀 입문강의가 아니네요ㅜㅜ지금 강의 하나만 계속 반복해서 듣고 저게 무슨말이지 하면서 진도를 나갈수가없네요.열심히 따라가고 싶은데 힘드네요.
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
프로그래밍언어 자바가 어렵네요..
강의를 잘해주시는데 문제풀이로 들어가면 막히기 시작하는거 같습니다… 추가적인 문제풀이를 통해서 복습하는 수강을 하실 계획이 있는지 궁금하네요ㅠ 23년 1회차부터 24년 1회차까지 혼자서 문제풀어보니 이미 봐왔던 문제들이고 정답을 알고 있어서 막힘없이 풀리기는 하는 상태네요.. 로직 이해를 좀더 해야되는 것 같고 자바 수강을 마쳤음에도 한번 더 수강을 하려고 합니다.
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강사님 코드 그대로 했는데 결과가 다릅니다. @SequenceGenerator 값이 50씩 늘어나요.
[질문 내용]안녕하세요 김영한 강사님. 강의 잘 듣고 있습니다.실습도중 저는 강사님과 똑같은 코드임에도 불구하고 다르게 동작하게 되어 질문 남기게 되었습니다.GeneratedValue 전략에서IDENTITY 전략은 persist 하는 과정에서 바로 DB insert를 하는 것을 이해했고SEQUENCE 전략은 allocationSize를 통해 처음 call next value 2번 호출 후 -1 의 값이 나와야하는데 저는 -1이 되지 않습니다.create 으로 하고 실행하고 create-drop 하고 실행하고 아예 캐시 문제인가 하여, DB를 전부 드랍후 다시 해보았는데도 TEAM_ID ID NAME null 1 m4null 2 nullnull 3 nullnull 4 nullnull 52 m4null 53 nullnull 54 nullnull 55 null값이 이런식으로 저장됩니다. 강사님과 코드는 동일한데 무엇 때문에 이렇게 동작할까요?package hellojpa; import jakarta.persistence.*; /** * @author : ewjin * @fileName : Member * @since : 24. 6. 20. */ @Entity @SequenceGenerator(name = "MEMBER_SEQ_GENERATOR", sequenceName = "MEMBER_SEQ", initialValue = 1, allocationSize = 50) public class Member { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR") private Long id; @Column(length = 300) private String name; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; public Long getId() { Class<? extends Member> a = getClass(); System.out.println(a); return id; } public Team getTeam() { return team; } public void setTeam(Team team) { this.team = team; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } package hellojpa; import jakarta.persistence.*; import org.hibernate.Transaction; import java.util.Arrays; import java.util.List; 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 { Member m1 = new Member(); m1.setName("m1"); Member m2 = new Member(); m1.setName("m2"); Member m3 = new Member(); m1.setName("m3"); Member m4 = new Member(); m1.setName("m4"); em.persist(m1); em.persist(m2); em.persist(m3); em.persist(m4); System.out.println("m1.getId() = " + m1.getId()); System.out.println("m2.getId() = " + m2.getId()); System.out.println("m3.getId() = " + m3.getId()); System.out.println("m4.getId() = " + m4.getId()); tx.commit(); } catch (Exception e) { System.out.println("에러남========================="); tx.rollback(); System.out.println(e.getCause()); System.out.println(e.getMessage()); System.out.println(e.getStackTrace()); e.printStackTrace(); } finally { em.close(); emf.close(); } } }
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
8강 반복문+조건문 문제 풀이 예제 관련 질문
선생님, 안녕하세요!제가 비전공자 문과 직장인이라 ^^; 정보처리기사 실기 코드해석 문제들을 어떻게 준비해야될지 막막했는데,이번에 좋은 강의 마련해주셔서 감사한 마음으로 잘 듣고 있습니다. 다름이 아니라 금번에 업데이트해주신 8강 반복문+조건문 문제 풀이 영상에서올려주신 예제의 풀이가 잘 이해되지 않아서 질문글을 올리게 되었습니다.해당 예제는 6번째 슬라이드에 있는 Java 코드입니다. 강의 9:06 경에서 0, 2, 4, 3, 8 이렇게 5개를 언급해주셨는데,i<10 에 해당하는 정수에 대해서(i%2==0lli%3==0)&&i%6!=0 에 해당하는 것은제가 생각했을 때는 2, 3, 4, 8, 9 이렇게 5개가 되는게 맞는게 아닐까 해서요. ^^;(정수 0의 경우에는 6으로 나누면 어차피 0이니까) 제가 코드 해석 배우는건 이번이 처음이라 ^^;모르는거 투성이라 너무 지엽적인걸 여쭤봐서 괜히 선생님 시간을 뺏는게 아닐까 조심스럽기는 하네요.모쪼록 확인 한번 해주시면 학습에 많은 도움이 될 것 같습니다. 코드 해석이라면 늘 어렵고 막연하게만 생각했는데저 같은 초보도 잘 이해할 수 있도록 설명을 차근차근 쉽게 해주셔서 준비에 많은 도움이 되고 있습니다.마지막 강의까지 잘 따라가보겠습니다.비가 많이 오는데 모쪼록 안전에 유의해주시고 행복이 가득한 주말 보내세요~~!! 감사합니다.
-
해결됨자바 9부터 자바 21까지
compact constructor 질문이 있습니다.
강의 10강 7:15 여기에 보시면컴팩트 컨스트럭터를 사용하는 경우 필드에 값을 넣어줄 수 없다고 말씀해주셨는데여기서 직접 this.name 으로 넣는건 불가능하지만public record MemberRecord( String name, @CustomAnnotation int age ) { private static final String DEFAULT_NAME = "Unknown"; private static final int DEFAULT_AGE = 1; public boolean isAdult() { return age > 20; } public MemberRecord { if (name == null || name.isBlank()) { name = DEFAULT_NAME; } if (age < 0) { age = DEFAULT_AGE; } } }this.name으로 값을 할당하는 것이 아니라 잘못된 값이 들어오면 그걸 변경해서 넣어주는건 되는거 같습니다.이런 용도로 컴팩트 컨스트럭처를 사용해도 될까요?아니면 말씀해주신 것처럼 검증 용도로만 사용하는 것을 권장하시나요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
강의 오디오 안들림
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의를 듣는 도중 오디오가 잘 나오다가 갑자기 안 나오더니 그때부터 모든 강의 소리가 안들리는데 왜그런지 알 수 있을까요?.. 노트북 오디오는 잘 작동합니다.
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
이해가 안가네요
설명을 하는데 이해가 바로 안되네요혼자 고민하고 몇번을 들어야 이해가 가는데 이강의는 정보처리기사 공부하는 사람들이 대부분인데 초보들이 대다수일건데 설명이 너무 빠르고 따라가기가 어렵네요
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
설명이 좀 세밀햇음 합니다. 이해가 안되요
이해가 어려운 섹션이나 영상 설명은 질문으로 꼭 남겨주세요.기출문제를 풀다가 막힌 개념이 있나요? 질문으로 회차나 번호, 개념을 예시로 질문해주세요. 답변에 도움이 됩니다.이론 문제는 통합본 PDF 파일로 제공될 예정입니다. (6월 중 업로드 예정)합격을 가르는 것은 역시 코드해석문제. 이론을 외울 시간이 없다면 코드에 익숙해지고, 중요 개념을 몇 가지 외워가면 합격할 수 있습니다.
-
미해결토비의 스프링 6 - 이해와 원리
정적 팩토리 메서드
안녕하세요 토비님 😄 강의 맛있게 잘 보고 있습니다.마이너 한 질문인데, 테스트에 Clock 을 이용한 테스트에서 6.50 초 쯔음 아래 와 같은 fixed <- 의 유형 ? 을 정적 팩토리 메서드라고 하셨는데 객체를 반환하기 위해 static 키워드를 사용해야 정적팩토리 메서드가 아닌지 여쭤봅니다@Bean public Clock clock() { return Clock.fixed(Instant.now(), ZoneId.systemDefault()); }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
테스트코드 회원가입정보를 h2에넣고싶은데 테스트코드 통과해도 h2에 안 들어가요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.이렇게 했습니다.