inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

섹션 6 -2강

미해결

토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1

xml관련 설정 강의자료로 남겨주신다고 했는데 어디서 찾을 수 있나요?

  • java
  • spring
  • spring-boot
  • jpa
  • 리팩터링
  • ddd
dengo25.dev 댓글 1 좋아요 0 조회수 197

pop()과 poll()의 차이

해결됨

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

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] Stack의 메서드인 pop()과 Queue의 메서드인 poll()의 차이를 보니 stack이 비어있을 때 pop을 실행하면 NoSuchElementException 예외가 터지고, queue가 비어있을 때 poll을 실행하면 null이 반환되는데, 왜 이렇게 차이를 두고 설계를 한건지 궁금합니다.

  • java
  • 객체지향
  • 코딩-테스트
  • 알고리즘
khcho1492 댓글 1 좋아요 0 조회수 130

07-01 IPv4AddressIntegerField 질문

미해결

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)

안녕하세요 강사님. 강의자료 소스코드 메소드 각각에 대한 세부적인 설명은 자세히 없는 것 같아 질문드립니다. 혹시 틀리거나 부족한 부분이 있다면 설명 부탁드립니다! https://gist.githubusercontent.com/allieus/6134497ba5e0f0aa541a18b700fe9a0e/raw/212aff65dd66095455b2bc87564470f4ba8a5219/IPv4AddressIntegerField.py 1. to_python, get_prep_value, from_db_value 세가지 메소드의 공통점은 value값을 적절한 형식으로 변환하는 것 같은데요. 차이점은 아래와 같이 이해하면 될까요? -get_prep_value: save(), create() 메소드 사용시 호출되는 내부 메소드 -from_db_value: 데이터베이스에서 오브젝트/쿼리셋을 가져올 때 호출되는 내부 메소드 -to_python: ModelForm을 통해 입력받거나 모델.<필드명> = "192.168.56.1" 처럼 직접 필드값을 할당할 때 호출되는 내부 메소드.

  • react
  • python
  • django
  • web-api
  • htmx
성지 댓글 1 좋아요 0 조회수 109

ep12. (2) LEFT JOIN 사용 방법 준수 - 오타 질문

해결됨

Real MySQL 시즌 1 - Part 1

안녕하세요 (2) LEFT JOIN 사용 방법 준수 - 오타 질문 (3:58 부근) 에서 첫 번째 SQL이 아래와 같이 써있는데요 select u.id, u.name, ua.value from user u left join user_attribute ua on ua.user_id=u.id where ua.name='address' where 조건에 ua.name 이 아니고, ua.value가 아닐까 의미적으로 맞는게 아닌가 싶어서 질문드립니다. 전체 스키마가 있는게 아니다보니 제가 오해한 걸수도 있어서, user, user_attribute 테이블 전체 스키마를 주시면 감사하겠습니다!

  • mysql
  • dbms/rdbms
  • backend
  • query-tuning
  • mysql-query
rex 댓글 2 좋아요 0 조회수 119

ep.12 count(*) 질문

해결됨

Real MySQL 시즌 1 - Part 1

안녕하세요, count(1) 대신 count(*)을 쓰라고 하셨는데요, count(1)이 성능이 더 좋다고 알고 있는데 제가 잘못 알고 있는 부분일까요? 성능적인측면에서도 답변 부탁드리면 감사하겠습니다~

  • mysql
  • dbms/rdbms
  • backend
  • query-tuning
  • mysql-query
rex 댓글 2 좋아요 0 조회수 96

데이터 : members.csv 어디서 불러오나용 ㅜㅜ?

해결됨

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

데이터 : members.csv 어디서 불러오나용 ㅜㅜ?

  • python
  • 머신러닝
  • 빅데이터
  • pandas
  • 빅데이터분석기사
윤유나 댓글 2 좋아요 0 조회수 71

build gradle

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] build.gradle 이렇게 하면 되는건가요? 옆에 주석을 써봤는데 제가 이해한게 맞나요? plugins { id 'java' id 'org.springframework.boot' version '3.5.4' id 'io.spring.dependency-management' version '1.1.7' } group = 'hello' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' // 추가 여기부터 implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.1' // SQL 쿼리를 로그로 찍어주는 라이브러리. 개발할 때 DB에서 어떤 쿼리가 실제로 나가는지 확인하기 위함. runtimeOnly 'com.h2database:h2' // H2 DB (인메모리 DB) 사용. 개발이나 테스트용으로 DB 서버 없이 DB를 돌릴 때 편리. // lombok 관련 compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' // querydsl 추가 implementation 'com.querydsl:querydsl-jpa:9.8:jakarta' // QueryDSL JPA 핵심 라이브러리 annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" // 엔티티로부터 Q클래스 자동 생성 annotationProcessor "jakarta.annotation:jakarta.annotation-api" // 컴파일 시 필요한 annotationProcessor "jakarta.persistence:jakarta.persistence-api" // Jakarta EE API // 여기까지 // test lombok testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } // 중괄호 추가 testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() } // 추가 clean { delete file('src/main/generated') }

  • java
  • spring
  • mvc
  • spring-boot
억우 댓글 2 좋아요 0 조회수 250

dirty checking 질문드립니다.

미해결

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

안녕하세요. 강의 14분쯤에 말씀해 주신 dirty cheking에 대해서 질문드립니다. order.cancel(); 호출하면, Order의 status 변경되고, 이는 dirty cheking으로 인해 Order에 대해서 update 쿼리가 발생하고, orderitem.cancel()호출하면, Item의 stockQuantity가 변경되고, 이는 dirty checking으로 인해 Item에 대해서 update쿼리가 발생한다. 기본편 및 강의 내용에 대해서 생각해보다가 이렇게 생각했는데 이렇게 이해하는게 맞을까요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
오리쉐리 댓글 1 좋아요 0 조회수 98

클라이언트 강제종료시 오류 메세지

미해결

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요 선생님 강의를 듣다가 똑같이 서버 실행 후 클라이언트 실행한 뒤에 클라이언트 강제 종료시 "Exception in thread "Thread-0" java.lang.RuntimeException: java.io .EOFException" EOFExcetion 오류가 아닌 "Exception in thread "Thread-0" java.lang.RuntimeException: java.net .SocketException: Connection reset" 이 뜨는데 왜 다르게 뜨는지 궁금해서 여쭤봅니다..! 코드는 강사님 코드와 동일합니다.

  • java
  • 네트워크
  • 객체지향
latteya 댓글 2 좋아요 0 조회수 149

기본적 동작과정에 대한 이해가 부족해 질문드립니다.

해결됨

Spring WebFlux + LLM 실전 구현

안녕하세요 일단 제가 생각은 컨트롤러에서 Mono 나 Flux 를 반환하고 webflux 가 이를 구독할 때 실행된다. 인데 어쨌든 구독하는 동작도 이벤트 루프 스레드가 하는 거라고 생각합니다. 그렇다면 구독에서부터 Mono 또는 Flux 실행까지 같은 이벤트 루프 스레드가 이어서 동작하는 건가요? 만약 제가 생각하는 게 맞다면 컨트롤러에서 수행하는 것과 구독후 수행하는 것의 순서만 다를 뿐 성능 차이를 모르겠는데 제가 어떤 부분을 잘못생각하고있는 걸까요? 개념이 잡히지 않아 질문이 좀 이상한 거 같아 죄송합니다.

  • java
  • spring
  • webflux
  • chatgpt
  • llm
minjun 댓글 2 좋아요 1 조회수 173

플랫폼 타입 설명 문의

해결됨

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

안녕하세요. 플랫폼 타입 설명 중에서 라이브러리를 가져다 쓴 지점을 래핑해서 단일 지점으로 만듦으로써 이슈를 쉽게 대응한다는 게 어떤 말씀이신지 잘 이해나 상황이 그려지지 않아서.. 이게 어떤건지 예시를 통해 알려주실 수 있는지 궁금해서 질문을 남깁니다. '래핑해서 단일 지점으로 만든다'라는 개념과, 이렇게 만들면 이슈를 어떻게 왜 쉽게 대응할 수 있다는건지 이런 부분을 잘 모르겠습니다 ㅠㅠ

  • java
  • kotlin
  • 객체지향
개발자 취업 포기 댓글 2 좋아요 2 조회수 103

회원가입 테스트 중 빈값 오류

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 현재 강의 8분쯤, 회원가입 테스트 할때 "이미 존재하는 회원입니다"를 방지 하기 위해 delete from member; 이후에 정상 작동 되어야 하는데, 오류가 나는 상황입니다. 회원가입 테스트 함수 내에, join 함수 실행 후에, findOne(saveId) 에서 빈값으로 확인됩니다. saveId 의 경우엔 테스트 할때마다 시퀀스가 올라서 11, 12, ... 가 확인됩니다. select * from member; 시에 빈값이고, join(member)가 정상으로 됬기 떄문에 saveId값이 오르고 있는것 같은데, findOne에서 빈값이라고 하니 get()할 값이 없어서 오류가 나는것 같은데, 진도를 나가기 위해 어떻게 수정해야 할까요 ? join이 정상실행 됬다는 확인은 해당 소스 위 아래 sout "1" "2" 를 각각 붙였더니 정상 실행 되었고, findOne 위에 sout("3")까지 출력 됬지만, findOne 아래 sout("4")은 출력되지 않고 오류가 떴습니다. 그리고 오류를 찾아가기 위해, 확인하고 싶은 현 시점에 소스 상황입니다. MemberServcie 클래스에서 @Service 와 빈 주입을 위한 @Autowired 는 주석처리가 되어 있는데 맞을까요 ? 12분 짜리 강의를 위해 3시간째 ㅠㅠ 버벅이고 있습니다. 도와주세요 ㅠㅠ 혹시 제 질문이 부족했다면, 제가 답을 얻기위해 추가 질문이라도 부탁드립니다 ㅠㅠ

  • java
  • spring
  • mvc
  • spring-boot
김*혜 댓글 2 좋아요 1 조회수 103

특정 index의 노드 조회하기 질문

미해결

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

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 1. 특정 index의 노드 조회하기에서 index의 값을 0이나 1로 설정하고 실행시키면 0으로 설정시: index0Node = [A->B->C] 1으로 설정시: index1Node = [B->C] 이런식으로 출력이 되는데 저희가 의도한 출력은 특정 index의 값이므로 index가 0이면 [A], index가 1이면 [B] 와 같이 출력이 되어야 맞는게 아닌가해서 질문드립니다! 메서드를 구현할 때 영한님께서는 Node x = node; 이런식으로 변수에 받아서 구현을 하시는데 제 생각에는 x라는 변수가 굳이 필요 없을 것 같아 아래 코드와 같이 작성해보았는데 잘 작동하였습니다. 변수 x에 담아서 메서드를 처리하는 의도가 따로 있는건지 궁금합니다! 감사합니다 private static Node getNode(Node node, int index) { for (int i = 0; i < index; i++) { node = node.next; } return node; }

  • java
  • 객체지향
  • 코딩-테스트
  • 알고리즘
김예준 댓글 2 좋아요 0 조회수 90

Gradle Build 시 에러 발생

해결됨

6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법

1. 현재 학습 진도 몇 챕터/몇 강을 수강 중이신가요? 2-7강 여기까지 이해하신 내용은 무엇인가요? git Action CI/CD 2. 어려움을 겪는 부분 어느 부분에서 막히셨나요? git push 후 workflow에서 Gradle 빌드 실패 코드의 어떤 로직이 이해가 안 되시나요? 어떤 개념이 헷갈리시나요? 3. 시도해보신 내용 문제 해결을 위해 어떤 시도를 해보셨나요? 에러가 발생했다면 어떤 에러인가요? git push 후 workflow에서 Gradle 빌드 실패 현재 작성하신 코드를 공유해주세요 빌드를 진행할 때 먼저 3개의 테스트에서 실패합니다. SimpleEventListenerTest > 현재 코드 구조에서 @TransactionalEventListener는 작동하지 않는다 FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:143 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1770 Caused by: jakarta.persistence.PersistenceException at AbstractEntityManagerFactoryBean.java:421 Caused by: org.hibernate.exception.JDBCConnectionException at SQLExceptionTypeDelegate.java:49 Caused by: java.sql.SQLNonTransientConnectionException at SQLError.java:111 SimpleEventListenerTest > @TransactionalEventListener는 활성 트랜잭션이 필요하다 FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:143 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1770 Caused by: jakarta.persistence.PersistenceException at AbstractEntityManagerFactoryBean.java:421 Caused by: org.hibernate.exception.JDBCConnectionException at SQLExceptionTypeDelegate.java:49 Caused by: java.sql.SQLNonTransientConnectionException at SQLError.java:111 SimpleEventListenerTest > @EventListener는 트랜잭션이 없어도 정상 동작한다 FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:143 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:1770 Caused by: jakarta.persistence.PersistenceException at AbstractEntityManagerFactoryBean.java:421 Caused by: org.hibernate.exception.JDBCConnectionException at SQLExceptionTypeDelegate.java:49 Caused by: java.sql.SQLNonTransientConnectionException at SQLError.java:111 이후, Redis에 Reconnecting 하려고 시도하지만 Connection이 Refused되면서 빌드에 실패합니다. 2025-08-21T08:34:32.560Z INFO 2235 --- [xecutorLoop-1-2] i.l.core.protocol.ConnectionWatchdog : Reconnecting, last destination was localhost/127.0.0.1:32770 2025-08-21T08:34:32.570Z WARN 2235 --- [ioEventLoop-8-2] i.l.core.protocol.ConnectionWatchdog : Cannot reconnect to [localhost/<unresolved>:32770]: Connection closed prematurely io.lettuce.core.RedisConnectionException: Connection closed prematurely at io.lettuce.core.protocol.RedisHandshakeHandler.channelInactive(RedisHandshakeHandler.java:91) ~[lettuce-core-6.2.6.RELEASE.jar:6.2.6.RELEASE] // 생략 로컬 환경과 AWS EC2 환경에서 동일하게 발생합니다. 해결 방법 gradle build를 5번 정도 시도했는데, 5번 중 4번은 SimpleEventListenerTest 에서 테스트가 실패하고, 1번은 다른 Test에서 실패하였습니다. 그래서, SimpleEventListenerTest 에 대해 개별 테스트를 진행해보니 통과하였습니다. 전체 테스트 진행에서는 JDBC Connection 관련 오류가 발생했고, 개별 테스트 진행에서는 문제가 발생하지 않는다는 점에서 커넥션 풀 설정 문제 를 의심하였습니다. spring: datasource: url: jdbc:mysql://${RDS_ENDPOINT:localhost}:3306/portfolio?useSSL=false&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true&useSSL=false&rewriteBatchedStatements=true username: portfolio_user password: ${RDS_PASSWORD:portfolio1234} driver-class-name: com.mysql.cj.jdbc.Driver hikari: maximum-pool-size: 32 @TestConfiguration public class TestDatabaseConfig { @Container private static final MySQLContainer<?> mysqlContainer; application.yml 의 최대 풀 사이즈는 32로 설정되어 있고, mySQL 컨테이너는 전역으로 설정되어 있으므로 병렬 처리 과정에서 커넥션 풀이 부족할 수 있겠다는 판단하에, maximum-pool-size 를 100으로 늘려보았습니다. package ding.co.backendportfolio.config; import jakarta.annotation.PreDestroy; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; import org.testcontainers.containers.MySQLContainer; import org.testcontainers.junit.jupiter.Container; @TestConfiguration public class TestDatabaseConfig { @Container private static final MySQLContainer<?> mysqlContainer; static { mysqlContainer = new MySQLContainer<>("mysql:8.0.33") .withDatabaseName("testdb") .withUsername("test") .withPassword("test"); mysqlContainer.start(); // A) 기본 설정 + rewriteBatchedStatements 옵션 String originalJdbcUrl = mysqlContainer.getJdbcUrl() + "?rewriteBatchedStatements=true"; // TODO: BulkInsert 모니터링 - 아래 주석을 해제해야함 // originalJdbcUrl = originalJdbcUrl + "&profileSQL=true&logger=Slf4JLogger&maxQuerySizeToLog=2147483647"; System.setProperty("spring.datasource.url", originalJdbcUrl); System.setProperty("spring.datasource.username", mysqlContainer.getUsername()); System.setProperty("spring.datasource.password", mysqlContainer.getPassword()); // 커넥션 풀 늘리기 System.setProperty("spring.datasource.hikari.maximum-pool-size", "100"); System.setProperty("spring.datasource.hikari.minimum-idle", "10"); } @Bean public MySQLContainer<?> mySQLContainer() { return mysqlContainer; } @PreDestroy public void stop() { if (mysqlContainer != null && mysqlContainer.isRunning()) { mysqlContainer.stop(); } } } 이후 테스트를 진행해보니, 기존에 작성해두신 커넥션 풀 테스트인 EventJoinWithExternalConnectionPoolTest 를 제외하고 테스트에 통과하였습니다. 따라서, EventJoinWithExternalConnectionPoolTest 이 테스트에만 작은 커넥션 풀을 적용하도록 하였습니다. @Slf4j @IntegrationTest // 커넥션 설정 @TestPropertySource(properties = { "spring.datasource.hikari.maximum-pool-size=32", "spring.datasource.hikari.minimum-idle=5" }) class EventJoinWithExternalConnectionPoolTest { 문제가 발생한 원인은, Gradle 병렬 테스트 진행 시 커넥션 풀이 부족하여 커넥션이 이뤄지지 않았던 것 같습니다. 사실 최대 커넥션 풀을 100개로 늘리는 건 임시방편인 것 같고, 테스트별로 독립적인 컨테이너 환경을 만들어주는게 좋을 것 같다고 생각합니다. P.S.) GPT, 클로드코드, Cursor, ... 다 문제 원인을 파악하지 못하더라고요 ㅎㅎ

  • java
  • spring
  • mysql
  • redis
  • 이력서
bebe 댓글 3 좋아요 2 조회수 226

문제5번 - 함수 코드 중복 방지를 위한 방법 중 서브쿼리와 CTE의 차이

해결됨

김영한의 실전 데이터베이스 입문 - 모든 IT인을 위한 SQL 첫걸음(SQL부터 차근차근)

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 질문이 서론 과 본론 으로 구분되어 있으며, 실제 질문 내용은 본론 에 있습니다! 서론 안녕하세요 영한님. 문제5번에서는 SUBSTRING_INDEX(email, '@', 1) 함수를 user_id와 id_length에서 두 번 반복해서 사용하게 됩니다. 중복 문제를 개선하기 위해 초기에는 다음과 같이 CHAR_LEGNTH(user_id) AS id_length 로 시도를 했으나 실패했습니다. -- 에러 발생 코드 SELECT email, SUBSTRING_INDEX(email, '@', 1) AS user_id, CHAR_LENGTH(SUBSTRING_INDEX(user_id) AS id_length FROM customers ; 그 이유는 SELECT 절의 모든 표현식이 논리적으로 동시에 평가 되기 때문이라고 판단했고, 이를 해결하기 위한 방법 중 서브쿼리와 CTE(Common Table Expression) 방식을 찾았고 이를 직접 적용해봤습니다. -- sol1. 서브 쿼리 SELECT email, user_id, CHAR_LENGTH(user_id) AS id_length FROM (SELECT email, SUBSTRING_INDEX(email, '@', 1) AS user_id FROM customers ) AS dt ; -- sol2. CTE WITH email_parts AS ( SELECT email, SUBSTRING_INDEX(email, '@', 1) AS user_id FROM customers ) SELECT email, user_id, CHAR_LENGTH(user_id) AS id_length FROM email_parts; 본론 이 과정에서 "서브 쿼리와 CTE의 성능 차이가 있는가?" 에 대한 의문이 들어서 리서치를 했으나 제 수준이 부족한 탓인지 이에 대한 명확한 답변을 찾지 못했는데요(현재 '상황에 따라 다르다' 수준으로만 이해한 상태입니다). 혹시 실무에서는 서브 쿼리와 CTE 중 (성능, 가독성, 개발팀 관례 등의 이유로 인해) 무엇을 선호하는지 의견을 들을 수 있을까 싶어 질문 남깁니다! 혹시 다음 강의에서 다루는/다룰 내용이라면 제가 추후에 해당 강의를 들을 때 학습하도록 하겠습니다!

  • sql
  • mysql
  • dbms/rdbms
  • SQLD
dev.rudevico 댓글 1 좋아요 0 조회수 152

@Lock(OPTIMISTIC)이 필요한 이유

미해결

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

안녕하세요! 강의를 복습하던 중 의문이 생겼습니다. JPA에서 @Version을 사용하면 자동으로 낙관적락이 적용되는 걸로 알고 있는데 @Lock(OPTIMISTIC)이 필요한 이유가 궁금했습니다. 그래서 알아보니 @Version의 경우는 엔티티에 수정/삭제가 될 경우에만 version을 체크하기 때문에 읽기만 존재할 때도 다른 곳에서 변경이 됐는지 감지하기 위해서는 @Lock(OPTIMISTIC)을 사용하라고 하던데 이게 맞을가요? 혹시 맞다면 @Lock(OPTIMISTIC)을 사용해서 OptimisticLockException이 발생하는 예시코드 부탁드립니다. 아래와 같이 테스트코드를 작성해봤는데 테스트가 성공하지 않아서요 @Test void optimistic_lock_on_read_conflict() throws Exception { ExecutorService executor = Executors.newFixedThreadPool(2); Callable<Void> task1 = () -> { service.readWithOptimisticLock(productId); return null; }; Callable<Void> task2 = () -> { service.updatePrice(productId, 4000); return null; }; Future<Void> f1 = executor.submit(task1); Future<Void> f2 = executor.submit(task2); f2.get(); assertThatThrownBy(f1::get) // 읽기만 했던 쪽도 커밋 시점에서 충돌 감지 .hasCauseInstanceOf(OptimisticLockingFailureException.class); executor.shutdown(); } //service.readWithOptimisticLock(productId); @Transactional(readOnly = true) public void readWithOptimisticLock(Long id) { productRepository.findByIdWithOptimisticLock(id); try { Thread.sleep(2000); } catch (InterruptedException e) { throw new RuntimeException(e); } productRepository.flush(); } //service.updatePrice(productId, 4000); @Transactional public void updatePrice(Long id, int newPrice) { Product product = productRepository.findById(id).orElseThrow(); product.setPrice(newPrice); productRepository.flush(); // flush 시점에 @Version 체크됨 }

  • java
  • spring
  • 동시성
안_ 댓글 2 좋아요 0 조회수 124

튜플, 딕셔너리는 자료 첨부가 안되어있네요

미해결

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

안녕하세요 튜플, 딕셔너리 에는 자료가 첨부되어있지않습니다. 이럴경우 별도로 자료 요청을 해야하나요?

  • python
minhee kim 댓글 2 좋아요 0 조회수 58

동시성 관련 질문입니다

미해결

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

링크 위 링크 속 질문에서 영한쌤이 아래와 같은 답변을 해줬습니다 "서버가 한대만 있고, 자바(JVM)로 웹 애플리케이션을 단 하나만 구동하는 상황이면 자바 만으로 동시성 제어를 할 수 있습니다." MVC 1편 강의에서 배운 내용으로는 클라이언트 요청이 들어오면 was 내에 미리 만들어진 쓰레드들이 각 요청을 받고 서블릿 코드를 실행한다고 이해하고 있습니다 그렇다면 서버가 한 대여도 쓰레드는 이미 여러개가 만들어져 있으므로 동시에 여러 요청 처리가 가능하기에 자바만으로 동시성 제어가 안 되는거 아닌가요? 잘못 이해한 부분이 있다면 지적부탁드립니다

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
조태준 댓글 1 좋아요 0 조회수 92

중복제거

미해결

김영한의 실전 데이터베이스 - 기본편

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 풀이 시간에 SELECT distinct u.name, u.email FROM users u JOIN orders o on u.user_id = o.user_id WHERE o.quantity > 1; 한 번의 주문으로 상품을 2개 이상 구매한 고객의 쿼리는 중복제거를 해주셨는데요, SELECT u.name AS 고객명, u.email AS 이메일 FROM users u JOIN orders o on u.user_id = o.user_id JOIN products p on o.product_id = p.product_id WHERE p.category = '전자기기' '전자기기' 카테고리 상품을 한 번이라도 구매한 고객은 중복제거를 해주지 않았더라구요. 하나의 그룹에 고객이 두명이 나오는 게 이상해서 이 경우 distinct 혹은 GROUP BY u.name, u.email을 추가해주어 중복제거 해주면 될까요? distinct 와 GROUP BY 중 어떤걸 사용하는 게 더 좋을까요? 집계함수를 사용하지 않으니 distinct가 더 나을까요?

  • sql
  • mysql
  • dbms/rdbms
  • SQLD
풍얀 댓글 2 좋아요 1 조회수 115

인기 태그

인프런 TOP Writers

주간 인기글