inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

낙관적 락 테스트 실패

미해결

재고시스템으로 알아보는 동시성이슈 해결방법

안녕하세요 낙관적 락을 활용해서 조회수 증가 동시성 테스트를 하고 있습니다! 영상처럼 동일하게 로직을 작성해서 테스트 하는데 동시성 처리가 전혀 안되는 상태라 질문 드립니다ㅜㅜ 아래는 Board 엔티티입니다! import jakarta.persistence.*; import lombok.Getter; @Getter @Table(name = "board") @Entity public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; @Column(name = "view") private long view; @Version private Long version = 0L; public Board(String title, long view) { this.title = title; this.view = view; } public void increaseView() { this.view += 1; } public Board() { } } 서비스 로직입니다! Catch 부분을 전혀 타지 않는 상태인거 같습니다 @Transactional public void increaseViewCountOpticLock(final long boardId) throws InterruptedException { while (true) { try { Board board = boardRepository.findByIdWithOptimistLock(boardId); board.increaseView(); // 조회수 증가 boardRepository.save(board); // 저장 break; // 성공 시 루프 탈출 } catch (ObjectOptimisticLockingFailureException e) { log.info("========================="); Thread.sleep(50); } } } import jakarta.persistence.LockModeType; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Lock; import org.springframework.data.jpa.repository.Query; import org.tkdgus.concurrdemo.entity.Board; public interface BoardRepository extends JpaRepository<Board, Long> { default Board getBoardById(long boardId) { return findById(boardId).orElseThrow(IllegalArgumentException::new); } @Lock(LockModeType.OPTIMISTIC) @Query("SELECT b FROM Board b WHERE b.id = :boardId") Board findByIdWithOptimistLock(long boardId); } DB는 MySQL이고 트랜잭션 격리 수준이나 이런건 다 기본 설정 그대로입니다! @Test @DisplayName("낙관적 락 동시성 테스트") void increaseViewCountOptimisticLock() throws InterruptedException { long boardId = 1L; int concurCnt = 100; ExecutorService executorService = Executors.newFixedThreadPool(32); CountDownLatch latch = new CountDownLatch(concurCnt); for (int i = 0; i < concurCnt; i++) { executorService.submit(() -> { try { boardService.increaseViewCountOpticLock(1L); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { latch.countDown(); } }); } latch.await(); BoardDto afterBoard = boardService.findBoard(boardId); assertThat(afterBoard.view()).isEqualTo(concurCnt); } 위 테스트 코드로 테스트 하면 100이 아니라 항상 10으로 나오는데 원인을 도저히 모르겠습니다ㅜㅜ

  • java
  • spring
  • 동시성
냥덕 댓글 2 좋아요 0 조회수 276

api 버그를 활용한 서체 일괄체크에서 글자색 모두 바꾸기가 안되서 문의드립니다

해결됨

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

안녕하세요. 한글 2024버전에서 API 버그가 픽스 됐는지 FaceNameHangul = "모두" 로 바꿔서 실행하면 콘솔창에서도 out값이 False로 출력되면서 작동이 안됩니다. 한글이 버전업 되면서 버그 픽스가 된걸까요? 실행화면 첨부합니다.

  • python
  • 한컴오피스
김재영 댓글 2 좋아요 1 조회수 205

실습 코드 깃허브 업로드

미해결

[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]

안녕하세요! 데이터분석 직무로 SQL 수업을 듣게 되었습니다! 혹시 실습하면서 정리한 코드 깃허브에 업로드가 가능할까요? - 강의 영상에 대한 질문이 있으시면, 상세히 문의를 작성해주시면, 주말/휴일 제외, 2~3일 내에 답변드립니다 (이외의 문의는 평생 강의이므로 양해를 부탁드립니다.) - 강의 답변이 도움이 안되셨다면, dream@fun-coding.org 로 메일 주시면 재검토하겠습니다. - 괜찮으시면 질문전에 챗GPT 와 구글 검색을 꼭 활용해보세요~ - 잠깐! 인프런 서비스 운영(다운로드 방법포함) 관련 문의는 1:1 문의하기를 이용해주세요.

  • python
  • sql
  • mysql
  • dbms/rdbms
  • 데이터-엔지니어링
이예진 댓글 1 좋아요 0 조회수 166

자료를 다운받았는데 주피터에 뜨지않습니다

미해결

문과생도, 비전공자도, 누구나 배울 수 있는 파이썬(Python)!

제발 도와주세요... 아무리해봐도 주피터에 뜨지않아요 pip 명령어를 통해 extension업그레이드도 해봤는데 안되요..

  • python
escho94 댓글 2 좋아요 0 조회수 206

클라이언트에서 userinfo 엔드포인트 호출 시 질문

해결됨

스프링 시큐리티 OAuth2

안녕하세요 강의 초반에 oauth2Login api를 사용하여 클라이언트에서 token 요청 후 scope email, profile 이렇게 userinfo 엔드포인트 요청 시 인가 서버에서 해당 요청을 받아서 리소스 서버에게 토큰 검증을 맡기고 검증을 성공하게 되면 리소스 서버에 저장된 사용자 정보를 바로 클라이언트에게 전송하나요? 아니면 다시 인가서버로 전송하나요? 만약 scope에 openid가 포함이 안되어 있다면 인가 서버에서 토큰 검증을 수행 후 사용자 정보를 안주는 거 같은데 우리가 보통 사용하는 google, 카카오 네이버 이런 거는 포함 안 시켜도 줬는데.. 또 강의 초반에는 키클록을 사용했는데 이건 키클록 구현과는 좀 틀린가요?

  • java
  • spring
  • spring-boot
  • oauth
hoonseung 댓글 2 좋아요 0 조회수 209

강의 자료 부탁드립니다.

미해결

프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)

강의 자료 부탁드립니다. sindori1@naver.com 입니다. 감사합니다.

  • python
sindori1 댓글 2 좋아요 0 조회수 36

build.gradle 설정 문제 : querydsl,java21,lombok,mapstruct

미해결

실전! Querydsl

해당 스펙의 gradle설정 해보신분 이 계신다면 답변달아주시면 너무 감사하겠습니다ㅠㅠㅠ 가상스레드를 사용할예정이라 java 21, querydsl,lombok을 포함하여 개발을 시작했습니다 (이후 mapstruct를 추가함) 처음설정은 어찌저찌 일일이 지정해가면서 빌드할때 compileQuerydls 태스크만 돌린다던지 querydsl관련 설정을 덕지덕지 붙여서 어떻게 생성시키고 돌아가게는 만들었던것 같습니다. 하지만 기존 설정이 mapstruct를 붙이게 되면서 문제가 생겼고 (anotationprocessor문제로 추정) java21에서는 querydsl의 directory path 설정이라던지 기타 설정없이도 qclass가 생긴다하여 build.gradle 파일을 수정하며 삽질중인데 잘 해결되지 않아 질문글을 남기게 되었습니다. 제가 생각하기로는 lombok과querydsl,mapstruct의 anotationprocessor가 호환이 안되던지 분리해주어야 하거나 추가 설정이 필요해서 되지 않는 것인가 추측해보았습니다. 일단 기존 querydsl, lombok만 설정했던 소스와 현재 수정중인 소스를 첨부합니다 [기존파일] querydsl,lombok 설정 plugins { id 'java' id 'org.springframework.boot' version '3.3.5' id 'io.spring.dependency-management' version '1.1.6' id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' } apply plugin: 'com.ewerk.gradle.plugins.querydsl' group = 'kr.co.aaa' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(21) } } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { // Validation 관련 추가 의존성 implementation 'jakarta.validation:jakarta.validation-api:3.0.2' implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-quartz' implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'org.postgresql:postgresql' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // QueryDSL 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' // QueryDSL JPA 의존성 implementation 'com.querydsl:querydsl-core' implementation 'com.querydsl:querydsl-collections' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' // QueryDSL의 JPAAnnotationProcessor annotationProcessor 'jakarta.annotation:jakarta.annotation-api' // java.lang.NoClassDefFoundError (javax.annotation.Generated) 대응 코드 annotationProcessor 'jakarta.persistence:jakarta.persistence-api' // java.lang.NoClassDefFoundError (javax.annotation.Entity) 대응 코드 //netty implementation 'io.netty:netty-all:4.1.97.Final' // Netty 전체 라이브러리 } // Querydsl 설정부 def generated = file('src/main/generated') // src/main/generated 경로 지정 querydsl { library = 'com.querydsl:querydsl-apt' jpa = true querydslSourcesDir = generated } sourceSets { main { java { srcDirs += "src/main/generated" // generated 폴더를 소스 경로에 추가 } } } tasks.withType(JavaCompile).configureEach { options.annotationProcessorPath = configurations.annotationProcessor options.generatedSourceOutputDirectory.set(generated) // Q 클래스가 src/main/generated에 생성되도록 설정 } // compileQuerydsl 태스크가 이미 존재하는지 확인하고, 없을 경우에만 등록 if (!tasks.names.contains("compileQuerydsl")) { tasks.register("compileQuerydsl", JavaCompile) { source = sourceSets.main.java.srcDirs classpath = sourceSets.main.compileClasspath // Main classpath 설정 options.annotationProcessorPath = configurations.annotationProcessor destinationDirectory.set(generated) // 생성 경로 설정 } } compileQuerydsl { options.annotationProcessorPath = configurations.querydsl } configurations { querydsl.extendsFrom compileClasspath } // gradle clean 시에 QClass 디렉토리 삭제 clean { delete file("src/main/generated") } tasks.named('test') { useJUnitPlatform() } [수정중인 파일] querydsl,lombok,mapstruct이 되도록 빌드하고자 했었음 plugins { id 'java' id 'org.springframework.boot' version '3.3.5' id 'io.spring.dependency-management' version '1.1.6' } group = 'kr.co.artlab' version = '0.0.1-SNAPSHOT' sourceCompatibility = '21' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-quartz' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' implementation 'jakarta.validation:jakarta.validation-api:3.0.2' implementation 'org.hibernate.validator:hibernate-validator:8.0.1.Final' implementation 'org.mapstruct:mapstruct:1.5.5.Final' implementation 'io.netty:netty-all:4.1.97.Final' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' annotationProcessor 'jakarta.annotation:jakarta.annotation-api' annotationProcessor 'jakarta.persistence:jakarta.persistence-api' annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final' runtimeOnly 'org.postgresql:postgresql' developmentOnly 'org.springframework.boot:spring-boot-devtools' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // Querydsl implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' } tasks.named('test') { useJUnitPlatform() } clean { delete file('src/main/generated') }

  • java
  • jpa
  • querydsl
  • mapstruct
송아름 댓글 2 좋아요 0 조회수 419

명령어 입력 후

미해결

프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)

엔터를 치면 출력값이 안나오는데, 매번 컨트롤+f5를 자판으로 치는게 맞나요? 선생님은 코딩하고 바로 출력값이 나오는 것 같은데 따라서 하면 안되서 늘 마우스를 )괄호 끝에 둔 후 두 개의 키를 입력해야 나오더라구요.. 이게 맞는지 문의합니다.

  • python
sellow20 댓글 1 좋아요 0 조회수 59

또 다른 풀이 공유합니다.

해결됨

김영한의 실전 자바 - 중급 1편

질문은 아니고, 수강하시는 분들에게 도움이 되고자 제가 풀이한 또 다른 방식 공유합니다. package time.test; import java.util.Scanner; import java.time.LocalDate; import java.time.DayOfWeek; public class TestCalendarPrinter { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("년도를 입력하세요: "); int year = sc.nextInt(); sc.nextLine(); System.out.print("월을 입력하세요: "); int month = sc.nextInt(); sc.nextLine(); printCalendar(year, month); } private static void printCalendar(int year, int month) { // 사용자 입력에 따른 LocalDate 객체 생성 LocalDate ld = LocalDate.of(year, month, 1); // 요일 표지 출력 System.out.println("Su Mo Tu We Th Fr Sa"); for (int i = 0; i < ld.lengthOfMonth(); i++) { // 해당 월의 1일에 해당하는 요일을 감지하고, 이에 따라 출력 시작 위치를 지정 // ld.getDayOfWeek().getValue()는 해당 날짜의 요일 값을 int로 리턴 Sunday(0), Monday(1) if (i == 0) { for (int j = 0; j < ld.getDayOfWeek().getValue(); j++) { System.out.print(" "); } } // 다음 일을 출력. startPosition은 위에서 맞췄으므로 단순 포맷팅 출력만 하면 됨 LocalDate currentLd = ld.plusDays(i); System.out.printf("%2d ", currentLd.getDayOfMonth()); // Saturday 출력 후에는 다음 줄로 이동 if (currentLd.getDayOfWeek() == DayOfWeek.SATURDAY) { System.out.println(); } } } }

  • java
  • 객체지향
dev.rudevico 댓글 1 좋아요 1 조회수 175

api/v1/members 404 에러 질문입니다.

해결됨

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

[질문 내용] 왜 404 에러가 뜨는지 모르겠네요 ㅠㅠ 도움 요청합니다.

  • java
  • spring
  • spring-boot
  • jpa
han909079 댓글 5 좋아요 0 조회수 274

모니터에 한 줄로 출력

미해결

김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음

C에서는 모니터의 값을 출력할 때 printf("a = %d, b = %d",a,b) 이런식으로 적어서 한줄로 표현 할 문장을 연달아 쓸수 있는데 JAVA에서는 중간에 변수를 출력하고 싶으면 무조건 끊어야하나요?

  • java
  • 객체지향
형호 임 댓글 1 좋아요 0 조회수 82

word wrap 체크 후에도 콘솔 한줄로 출력되는현상

미해결

[신규 개정판] 이것이 진짜 크롤링이다 - 기본편

vscode와 주피터 노트북 설치 후 word wrap체크까지 했는데도 콘솔에 한줄로 나오는데 왜이러는건가요 노트북은 맥북프로이고 파이썬 버전은 3.13.1이고 주피터 노트북은 vscode의 extention으로 설치되었습니다

  • python
  • 웹-크롤링
clean 댓글 1 좋아요 0 조회수 218

vscode 실행

미해결

프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)

2강-1강의 듣는데 왜 저는 실행이 안되나요? 엔터가 아니라 컨트롤 f5 누르면 아래와 같이 화면이 뜹니다.

  • python
sellow20 댓글 3 좋아요 0 조회수 178

vscode

미해결

프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)

다운로드하고 설치까지했는데(명령코드로 확인까지 완료) 매번 새로 실행 할 때마다 새로 설치하라고 뜨는데 어떻게 하면 되나요? 그리고 강의 경로 따라서 다운로드 했는데도 이 파일로는 관리자 실행이 안된다거 계속 떠서 all user 로 설치했는데 상관없는거 맞죠?

  • python
sellow20 댓글 2 좋아요 0 조회수 189

Test의 application.yml을 지웠을 때

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[질문 내용] OrderServiceTest에서 테스트 메서드를 실행하면서 H2 DB에 쿼리가 들어가는지 확인하기 위해 Test 폴더 안에 resources를 지우고 상품주문 테스트 메서드 안에 RollBack(value = false), em.flush()를 통해서 실제 데이터가 들어가는것을 확인하였습니다. 그런데 다시 원래대로 돌리는 과정에서 Test폴더 안에 resource를 만들고 해당 테스트의 application.yml를 돌려났음에도 불구하고 실행했음에도 H2 DB 안에 데이터는 그대로 남더라고요. 그래서 RollBack(value = false), em.flush()를 지우고 다시 실행해도 계속 데이터가 남는데 어떻게 해결하면 좋을까요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
soojinkimss 댓글 2 좋아요 1 조회수 113

docstring이 안 먹혀요

미해결

FastAPI 완벽 가이드

docstring이 안 먹혀요.. AI한테 물어봐도 해결이 안되네요 왜 저는 docstring이 안보일까요?? 다른거 summary 나 tags, description은 다 해결가능합니다.

  • python
  • sql
  • sqlalchemy
  • FastAPI
leejken530 댓글 1 좋아요 0 조회수 103

상속과 오지랖의 콜라보 예제에서 clone() 메서드에 대한 문의드립니다.

해결됨

기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM

해당 예제(22:17)의 setString(String param)에서 string 필드 변수의 값을 수정하고자 아래 구문을 사용하셨는데요, string = param.getBytes().clone(); clone() 메서드를 사용하지 않아도(아래 구문) string 필드 변수의 수정이 가능한데, clone() 메서드를 사용한 이유를 알 수 있을까요? string = param.getBytes(); 해당 의문에 대해서 얇은/깊은 복사 와 관련이 있는지 확인해보기 위해 디버깅을 해본 결과, 두 변수는 값은 같으나, 다른 메모리 위치를 갖는 것으로 확인을 했습니다. -> clone() 메서드가 있는 코드/없는 코드 모두 위와 동일하게 동작하는 것을 확인했습니다. 그래서 다른 이유로 clone() 메서드를 사용하신 거 같은데, 어떤 이유인지 문의 드립니다.

  • java
  • 객체지향
  • jvm
  • data-structure
전종락 댓글 2 좋아요 1 조회수 203

테스트 fixture

미해결

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

안녕하세요 강사님. 코틀린을 배우는데 좋은강의 만들어주셔서 감사합니다. 테스트를 위한 fixture 코드 부분에 대해 의견 여쭤보고 싶습니다. 강의에선 직접 엔티티 내부에 테스트를 위한 fixture 함수를 만들어 주셨는데, 팀 내부 의사결정에 따라 두어도 괜찮을 수도 있을 것 같지만 만약 테스트용 코드는 분리해야 한다고 하면 아래처럼 테스트 코드 패키지쪽에 fixture 생성을 위한 유틸파일을 만들고, 테스트 코드에서만 Book.fixture(...) 같은 형태로 사용할 수 있도록 엔티티에 비어있는 companion object를 만든 뒤 확장함수를 작성하는 형태로 해도 괜찮을지 의견 여쭤보고 싶습니다.! 테스트코드용 유틸 생성 User, Book 등의 엔티티에 비어있는 동행객체 선언 엔티티별 Companion 확장함수 작성 테스트 코드에서 엔티티.fixture() 형태로 사용

  • java
  • spring
  • kotlin
  • spring-boot
  • 리팩토링
우럭아왜우럭 댓글 2 좋아요 1 조회수 240

c,c++로 만든 프로그램을 실행한 프로세스

해결됨

기초 탄탄! 독하게 시작하는 Java - Part 1 : 절차적 프로그래밍

안녕하세요! [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도 각 스레드별 실행 지점만 가지고 있는게 맞나요? 아니면 실행지점 + 명령어도 가지고 있는건가요?

  • java
insub2004 댓글 2 좋아요 0 조회수 191

인기 태그

인프런 TOP Writers

주간 인기글