학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 질문의 제목과 같은 에러가 발생했는데 이를 해결하는 과정에서 JpaMemberRepository에 붙어있는 어노테이션인 @Repository를 제거하니 해결이 됐습니다. 이 이유가 SpringDataJpaMemberRepository에서 자동으로 구현체를 생성하게 되면 이게 빈으로 등록이 되기 때문에 저 어노테이션을 제거해서 해결을 하는 것이 정확한 이유가 되나요?
영상 중 해당 위치에서 left와 right를 둘이 같이 그대로 다른 곳에 쓰여진 코드를 가져오는 기능이 있는 듯이 보이는데요. 혹시 vscode에서도 해당 기능 사용할 수 있나요? 커서 올려두면 하나씩은 보이는데 저렇게 한번에 붙이는 기능이 있으면 좋겠네요. 강의 내용과 크게 상관없는 내용인데... 편리해보이는데 찾아볼 때 바로 원하는게 안나와서요.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 6. 스프링 MVC - 기본 기능.pdf(v20231202) 5페이지에 https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-spring-mvc-welcome-page 이 링크가 있는데 들어가 보면 Welcome 페이지에 대한 설명처럼 느껴지진 않는데 혹시 링크 주소가 변경된 걸까요? 찾아 보니 아래 두 링크가 Welcome Page 설명이랑 비슷하게 느껴졌습니다. 1.1.5. Static Content https://docs.spring.io/spring-boot/docs/current/reference/html/web.html#web.servlet.spring-mvc.static-content 1.1.6. Welcome Page https://docs.spring.io/spring-boot/docs/current/reference/html/web.html#web.servlet.spring-mvc.welcome-page 그리고 index.html에 대해 궁금한 점이 있습니다. index.html의 위치를 변경시키면서 localhost:8080을 호출했을 때 제대로 Welcome Page가 나타나는지 확인해 봤는데 /static /public /resources(resources 하위에 또 resources를 생성) /META-INF/resources 이 위치에 index.html을 두었을 땐 Welcome Page가 제대로 나타나는 걸 확인했습니다. 그런데 /templates 하위에 index.html을 두어도 localhost:8080으로 Welcome Page가 호출이 되는 것 같습니다. 컨트롤러를 통해 접근할 파일들을 /templates 하위에 두는 걸로 이해하고 있었는데, 이렇게 /templates 하위에 index.html을 두고 localhost:8080으로 접근하는 경우가 필요할 때가 있나요?
안녕하세요! 강의 잘 듣고 있습니다. 감사합니다. https://www.inflearn.com/course/lecture?courseSlug=%EC%84%A0%EC%B0%A9%EC%88%9C-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%8B%A4%EC%8A%B5&unitId=156125&category=questionDetail&tab=community&q=1029856 해당 질문과 답변을 보고 추가 질문 드리려고 합니다. 제가 kafka나 redis, 분산서버 등에 대해 이해도가 낮은 점 양해 부탁드립니다! 1. Kafka 미사용시 주문생성/회원가입요청의 타임아웃 및 10분뒤 실행에 대한 해결책으로 Kafka 를 선택한 이유는 배압조절(back pressure) 때문입니다. 이렇게 말씀을 해주셨는데요, 답변에서 말씀하신 예시에서 처럼 10000개 요청이 있고, 카프카를 사용한다면, 요청 100개가 쌓일때마다 db에 insert를 하고, 다시 요청 100개가 쌓일때까지 기다렸다가 insert 하기를 반복한다는 것으로 이해하면 될까요? 2. 그게 맞다면, 강의에서 구현한 apply 메서드에서 100개의 요청이 왔는지 확인하지 않고, kafka를 사용해서 다른곳에 전달하여 처리하는 이유는 무엇인가요? 예시로 apply 메서드 안에서 redis의 incr 값을 체크하면 요청이 몇개가 쌓였는지 알 수 있을테고, 데이터를 임시저장하다가 100개마다 처리할 수 있을거란 생각이 들었습니다. kafka로 다른 모듈로 전달하는 것과의 차이점이 무엇인가 궁금합니다. 3. 실제로 consumer에서 100개의 작업이 완료되었는지는 일반적으로 어떻게 확인하는 걸까요? db에 저장하기 전에 100개의 데이터는 어디에 임시저장을 하나요?
NamedLock을 사용하는 경우에 DataSource를 분리하는 것이 좋다고 하여 시도해봤으나 DataSource 설정의 문제인지 정상적으로 동작하지 않아 질문드리게 되었습니다. Main이 JPA에서 사용하게 될 데이터소스이고, Lock이 JdbcTemplate를 사용하기 위해서 사용하는 데이터소스입니다. spring: datasource: main: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3308/stock_example?serverTimezone=Asia/Seoul username: root password: 1234 lock: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3308/stock_example?serverTimezone=Asia/Seoul username: root password: 1234 hikari: maximum-pool-size: 20 jpa: database: mysql database-platform: org.hibernate.dialect.MySQLDialect hibernate: ddl-auto: create logging: level: root: INFO org: hibernate: SQL: DEBUG type.descriptor.sql.BasicBinder: TRACE 애플리케이션 자체에서 사용해야 할 커넥션 풀만 관리를 하면 될 것이라고 생각하여 동일한 데이터베이스를 사용하였습니다. 먼저, 메인으로 사용하는 NamedLock을 사용하지 않는 데이터소스설정클래스입니다. @Configuration @EnableJpaRepositories( basePackages = "com.example.stock.stock", entityManagerFactoryRef = "mainEntityManager", transactionManagerRef = "mainTransactionManager") public class MainDataSourceConfiguration { @Bean @Primary @ConfigurationProperties("spring.datasource.main") public DataSourceProperties mainDataSourceProperties() { return new DataSourceProperties(); } @Bean @Primary public DataSource mainDataSource() { return mainDataSourceProperties() .initializeDataSourceBuilder() .type(HikariDataSource.class) .build(); } @Bean(name = "mainEntityManager") @Primary public LocalContainerEntityManagerFactoryBean mainEntityManager( EntityManagerFactoryBuilder builder) { return builder.dataSource(mainDataSource()) .packages("com.example.stock.stock") .build(); } @Bean(name = "mainTransactionManager") @Primary public PlatformTransactionManager mainTransactionManager( @Qualifier("mainEntityManager") LocalContainerEntityManagerFactoryBean entityManagerFactoryBean) { return new JpaTransactionManager(Objects.requireNonNull(entityManagerFactoryBean.getObject())); } } 다음으로 Lock을 사용하기 위한 데이터소스 설정 클래스입니다. @Configuration @EnableTransactionManagement public class LockDataSourceConfiguration { @Bean @ConfigurationProperties("spring.datasource.lock") public DataSourceProperties lockDataSourceProperties() { return new DataSourceProperties(); } @Bean public DataSource lockDataSource() { return lockDataSourceProperties() .initializeDataSourceBuilder() .type(HikariDataSource.class) .build(); } @Bean(name = "lockTransactionManager") public JdbcTransactionManager lockTransactionManager(@Qualifier("lockDataSource") DataSource dataSource) { return new JdbcTransactionManager(dataSource); } } @Configuration public class JdbcTemplateConfiguration { @Bean public NamedParameterJdbcTemplate namedParameterJdbcTemplate(@Qualifier("lockDataSource") DataSource dataSource) { return new NamedParameterJdbcTemplate(dataSource); } } 그리고 테스트를 돌려봤는데, 재고가 정상적으로 감소가 되지 않습니다. 이상한 점은 업데이트 쿼리가 발생을 하지 않는다는 점입니다. 또 매번, 생성되는 스톡의 id가 1씩 증가한다는 점입니다. 혹시 제가 놓친 부분이 있을까요..?
안녕하세요, 강사님 강의를 수강중에 강의 환경과 매우 달라서 실습을 진행하지 못 하는 경우가 계속 발생합니다. 강의 리뉴얼이 매우 필요해 보입니다... Elastic BeanStalk 실습 - 간단한 웹 어플리케이션 배포하기 이 강의 또한 실습을 진행이 불가능해보입니다..
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
간혹 유튜브 영상이나 ORM과 관련된 담론이 있는 글들을 보면 JPA의 속도 문제를 문제점으로 삼는 분들을 보았습니다. 그리고 JPA로는 한계가 오는 점들은 네이티브 쿼리를 사용해서 해결을 할 수 있다는 점, 그리고 태현님께서도 특정 상황에서는 JdbcTemplate을 사용해서 문제를 해결할 수 있다는 점을 강의에서 말씀 해주셨는데요. 하지만 그 '특정 상황'의 예시가 잘 떠오르지가 않는데 어떤 것이 있을까요? 배민의 영상에서도 동욱님은 JPA와 QueryDSL을 사용해서 몇 억건의 데이터도 잘 처리하셨고, 영한님께서도 책을 개정판을 내지 않는 이유로 이미 많이 성숙한 기술이라서 극적인 변화가 없는 기술이라고 하셨으며 어떤 유튜버분도 말씀하시길 'JPA라는 기술이 문제 자체를 일으킨다기 보단 개발자가 JPA에 대한 이해가 부족해서 문제가 발생한다.' 라고 하셔서 더 미궁속으로 빠집니다. 혹시 태현님께서도 이런 상황을 겪으신 적이 있으신지, 있다면 어떻게 해결하셨는지 궁금합니다!
사소한 차이같은데 해석이 "서버에서"보다는 "서버에" 또는 "서버로부터"가 맞지 않나 생각이 듭니다. 여러가지 상황이 있겠지만 해석부분만 봤을때 떠오르는 첫번째 상황은 API 호출이 뭔가 모바일 기기나 브라우져가 아니라 서버에서 API 콜이 일어나는 상황처럼 생각되어지는...? 혹시 제가 착각한거일까요?
We are building a program that utilizes the latest tech stacks. 이 문장에 대한 해석으로 "우리는 최신 기술 스택을 활용해 프로그램을 빌드하고 있습니다."라고 되어있는데, "우리는 최신 기술 스택을 활용하는 프로그램을 빌드하고있습니다."가 올바른 해석 아닌가요? a program that utilizes 니까 프로그램이 최신 기술 스택을 활용하고 있는걸로 봐야하는게 아닌지요...?
이 DriverManagerDataSource가 커넥션 풀은 아닌거죠? 매번 getConnection할때마다 새 커넥션을 생성하긴 하지만 URL USERNAME PASSWORD 를 매번 전달하지는 않아도 되는 그냥 좀 더 편리한 DriverManager 라고 생각하면 되는 걸까요
안녕하세요 강의 잘 보고 있습니다 문득 궁금한점이 생겨 여쭤보고 싶은게 있는데요 ! api/auth/[...nextauth]/route.ts 파일 안에 NextAuth가 제공해주는 GET과 POST를 export해놓으면 api/auth/...something 경로로 타고 들어오는 api 요청은 export한 GET과 POST로 사용이 된다라고 말씀해주셨는데 그 GET과 POST는 어디서 호출을 하는걸까요 ? 마찬가지로 middleware.ts 파일에도 NextAuth에서 제공하는 auth를 middleware로 네이밍을 변경하여 사용한다고 하셨는데 그 middleware도 어디서 호출을 해서 사용하고 있는걸까요 ? 내보냈다는건(export) 어디선가 받아와서(import) 해서 사용하는게 아닌가 싶어서 질문 드려봅니다 초보적인 질문이지만 해결하고 가고 싶어서 질문 드려봅니다
안녕하세요! 파이썬을 1달하고 15일 정도 공부한 사람인데요. 제가 블로그의 이벤트를 열기 위해서 파이썬으로 수학게임을 만들었는데, 실행할 때 잘못되는 버그는 없는지, 코드가 전부 정상적으로 잘 작동되는지, 한번 확인차 피드백을 받으려 합니다! import time import random from threading import Timer print("BFB PYTHON ENGINE ver.1.24.2") time.sleep(2) print("launching_[블루의 수학게임]...") time.sleep(10) n=30 o=0 x=0 def addgame(n1,n2): global o global x global n begin=time.time() an=int(input("{}+{}=".format(n1,n2))) end=time.time() if end-begin>10: print("시간 초과!") time.sleep(2) x=x+1 n=n-1 else: if an==int(n1)+int(n2): print("정답!") time.sleep(2) o=o+1 else: print("오답!(정답은 {})".format(n1+n2)) time,sleep(2) x=x+1 n=n-1 def subgame(n1,n2): global o global x global n begin=time.time() an=int(input("{}-{}=".format(n1,n2))) end=time.time() if end-begin>10: print("시간 초과!") time.sleep(2) x=x+1 n=n-1 else: if an==int(n1)-int(n2): print("정답!") time.sleep(2) o=o+1 else: print("오답!(정답은 {})".format(n1-n2)) time,sleep(2) x=x+1 n=n-1 def mulgame(n1,n2): global o global x global n begin=time.time() an=int(input("{}×{}=".format(n1,n2))) end=time.time() if end-begin>10: print("시간 초과!") time.sleep(2) x=x+1 n=n-1 else: if an==int(n1)*int(n2): print("정답!") time.sleep(2) o=o+1 else: print("오답!(정답은 {})".format(n1*n2)) time.sleep(2) x=x+1 n=n-1 print("") print("블루의 수학게임에 오신 걸 환영합니다!") time.sleep(2) print("이 게임은, 문제에 주어지는 연산을 풀어서, 답을 맞추는 수학 퀴즈 게임입니다!") print("답은 10초 이내에 입력해야 하며, 10초를 넘기고 입력 시, 오답 처리됩니다!") print("답을 입력하실 때는, 띄어쓰기 혹은 엔터를 누르지 마시고, 무조건 숫자로 입력해주세요!") name=input("문제를 맞추실 분의 닉네임을 입력해주세요!") mod=input("연산을 선택하세요! 덧셈/뺄셈/곱셈") dif=input("난이도를 선택하세요! 쉬움/보통/어려움") if dif=='쉬움': a=10 b=10 elif dif=='보통': a=100 b=10 elif dif=='어려움': a=100 b=100 while n>0: if mod=='덧셈': li1=[] li2=[] for i in range(1,a): li1.append(i) k1=random.choice(li1) for j in range(1,b): li2.append(j) k2=random.choice(li2) game=addgame(k1,k2) elif mod=='뺄셈': li1=[] li2=[] for i in range(1,a): li1.append(i) k1=random.choice(li1) for j in range(1,b): li2.append(j) k2=random.choice(li2) if k1>=k2: game=subgame(k1,k2) else: game=subgame(k2,k1) elif mod=='곱셈': li1=[] li2=[] for i in range(1,a): li1.append(i) k1=random.choice(li1) for j in range(1,b): li2.append(j) k2=random.choice(li2) if dif=='어려움': game=mulgame(k1,random.randrange(11,20)) else: game=mulgame(k1,k2) print("축하합니다! 수학 게임의 {} 난이도 {} 문제를 전부 풀었습니다!".format(dif,mod)) time.sleep(3) if o==30: print("문제를 전부 맞추셨군요! 상장을 드리겠습니다!") f=open("상장.txt",'w') data="[%s게임의 %s난이도를 전부 맞춘 것에 대한 %s님의 상장입니다!]\n" % (mod,dif,name) f.write(data) f.close() else: print("맞은 문제의 개수는 {}개, 틀린 문제의 개수는 {}개 입니다!".format(o,x)) time.sleep(3) print("수고하셨습니다! 안녕!") time.sleep(10)