묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Repository, Service에 따른 , @Transaction(readOnly=ture)에 따른 쿼리 차이에 대해 질문드립니다.
@Entity @Getter @Setter public class Category { @Id @Column(name="CATEGORY_ID") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="MEMBER_ID") private Member member; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="PARENT_ID") private Category parent; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) private List<Category> child = new ArrayList<>(); } @Repository public class CategoryRepository { private final EntityManager em; public List<Category> findAll(){ return em.createQuery("select c from Category c", Category.class) .getResultList(); } } @Service @Transactional @RequiredArgsConstructor public class CategoryService { private final CategoryRepository categoryRepository; @Transaction <-- 이부분 //@Transaction(readOnly=true) <-- 이부분 public List<Category> findAll() {return categoryRepository.findAll(); } } @RestController @RequiredArgsConstructor public class CategoryApiController { private final CategoryService categoryService; private final CategoryRepository categoryRepository; private final MemberService memberService; @GetMapping("/api/v1/categories") public Result getCategory(@RequestParam(required = false, value = "id") String memberId){ List<Category> categories = categoryService.findAll(); <-- 이부분 // List<Category> categories = categoryRepository.findAll(); <-- 이부분 List<CategoryDto> categoryDtos = categories.stream() .map(c -> new CategoryDto(c)) .collect(Collectors.toList()); return new Result(categoryDtos.size(), categoryDtos); } @Data @AllArgsConstructor static class CategoryDto{ public CategoryDto(Long id, String name) { this.id = id; this.name = name; } public CategoryDto(Category category) { this.id = category.getId(); this.name = category.getName(); this.child = category.getChild().stream() .map(c -> new CategoryDto(c.getId(),c.getName())) .collect(Collectors.toList()); } private Long id; private String name; private List<CategoryDto> child; private Long parentId; } } categoryRepository.findAll()를 호출 했을 때 2022-05-12 23:35:46.474 DEBUG 18928 --- [nio-9090-exec-2] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor 2022-05-12 23:35:46.527 INFO 18928 --- [nio-9090-exec-2] p6spy : #1652366146527 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select category0_.category_id as category1_0_, category0_.member_id as member_i3_0_, category0_.name as name2_0_, category0_.parent_id as parent_i4_0_ from category category0_ select category0_.category_id as category1_0_, category0_.member_id as member_i3_0_, category0_.name as name2_0_, category0_.parent_id as parent_i4_0_ from category category0_; 2022-05-12 23:35:46.539 INFO 18928 --- [nio-9090-exec-2] p6spy : #1652366146539 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id in (?, ?, ?, ?, ?, ?, ?, ?) select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id in (6, 7, 8, 9, 10, 11, 12, 13); 2022-05-12 23:35:46.566 DEBUG 18928 --- [nio-9090-exec-2] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor categoryService.findAll() 을 호출 했을 때 1)@Transaction(readOnly = true) 2022-05-12 23:31:45.235 DEBUG 18388 --- [nio-9090-exec-1] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor 2022-05-12 23:31:45.258 DEBUG 18388 --- [nio-9090-exec-1] o.s.orm.jpa.JpaTransactionManager : Found thread-bound EntityManager [SessionImpl(72969494<open>)] for JPA transaction 2022-05-12 23:31:45.258 DEBUG 18388 --- [nio-9090-exec-1] o.s.orm.jpa.JpaTransactionManager : Creating new transaction with name [com.blog.demo.service.CategoryService.findAllRootCategories]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly 2022-05-12 23:31:45.261 DEBUG 18388 --- [nio-9090-exec-1] o.s.orm.jpa.JpaTransactionManager : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@675de2b1] 2022-05-12 23:31:45.292 INFO 18388 --- [nio-9090-exec-1] p6spy : #1652365905292 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select category0_.category_id as category1_0_, category0_.member_id as member_i3_0_, category0_.name as name2_0_, category0_.parent_id as parent_i4_0_ from category category0_ select category0_.category_id as category1_0_, category0_.member_id as member_i3_0_, category0_.name as name2_0_, category0_.parent_id as parent_i4_0_ from category category0_; 2022-05-12 23:31:45.301 DEBUG 18388 --- [nio-9090-exec-1] o.s.orm.jpa.JpaTransactionManager : Initiating transaction commit 2022-05-12 23:31:45.301 DEBUG 18388 --- [nio-9090-exec-1] o.s.orm.jpa.JpaTransactionManager : Committing JPA transaction on EntityManager [SessionImpl(72969494<open>)] 2022-05-12 23:31:45.301 INFO 18388 --- [nio-9090-exec-1] p6spy : #1652365905301 | took 0ms | commit | connection 1| url jdbc:h2:tcp://localhost/~/blog ; 2022-05-12 23:31:45.302 DEBUG 18388 --- [nio-9090-exec-1] o.s.orm.jpa.JpaTransactionManager : Not closing pre-bound JPA EntityManager after transaction 2022-05-12 23:31:45.303 INFO 18388 --- [nio-9090-exec-1] p6spy : #1652365905303 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id in (?, ?, ?, ?, ?, ?, ?, ?) select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id in (6, 7, 8, 9, 10, 11, 12, 13); 2022-05-12 23:31:45.329 DEBUG 18388 --- [nio-9090-exec-1] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor 2)@Transaction 2022-05-12 23:37:14.348 DEBUG 19206 --- [nio-9090-exec-2] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor 2022-05-12 23:37:14.369 DEBUG 19206 --- [nio-9090-exec-2] o.s.orm.jpa.JpaTransactionManager : Found thread-bound EntityManager [SessionImpl(1468362384<open>)] for JPA transaction 2022-05-12 23:37:14.369 DEBUG 19206 --- [nio-9090-exec-2] o.s.orm.jpa.JpaTransactionManager : Creating new transaction with name [com.blog.demo.service.CategoryService.findAllRootCategories]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 2022-05-12 23:37:14.371 DEBUG 19206 --- [nio-9090-exec-2] o.s.orm.jpa.JpaTransactionManager : Exposing JPA transaction as JDBC [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@4209a22e] 2022-05-12 23:37:14.402 INFO 19206 --- [nio-9090-exec-2] p6spy : #1652366234402 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select category0_.category_id as category1_0_, category0_.member_id as member_i3_0_, category0_.name as name2_0_, category0_.parent_id as parent_i4_0_ from category category0_ select category0_.category_id as category1_0_, category0_.member_id as member_i3_0_, category0_.name as name2_0_, category0_.parent_id as parent_i4_0_ from category category0_; 2022-05-12 23:37:14.414 DEBUG 19206 --- [nio-9090-exec-2] o.s.orm.jpa.JpaTransactionManager : Initiating transaction commit 2022-05-12 23:37:14.414 DEBUG 19206 --- [nio-9090-exec-2] o.s.orm.jpa.JpaTransactionManager : Committing JPA transaction on EntityManager [SessionImpl(1468362384<open>)] 2022-05-12 23:37:14.418 INFO 19206 --- [nio-9090-exec-2] p6spy : #1652366234418 | took 0ms | commit | connection 1| url jdbc:h2:tcp://localhost/~/blog ; 2022-05-12 23:37:14.419 DEBUG 19206 --- [nio-9090-exec-2] o.s.orm.jpa.JpaTransactionManager : Not closing pre-bound JPA EntityManager after transaction 2022-05-12 23:37:14.420 INFO 19206 --- [nio-9090-exec-2] p6spy : #1652366234420 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=? select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=6; 2022-05-12 23:37:14.421 INFO 19206 --- [nio-9090-exec-2] p6spy : #1652366234421 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=? select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=7; 2022-05-12 23:37:14.423 INFO 19206 --- [nio-9090-exec-2] p6spy : #1652366234423 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=? select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=8; 2022-05-12 23:37:14.424 INFO 19206 --- [nio-9090-exec-2] p6spy : #1652366234424 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=? select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=9; 2022-05-12 23:37:14.424 INFO 19206 --- [nio-9090-exec-2] p6spy : #1652366234424 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=? select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=10; 2022-05-12 23:37:14.424 INFO 19206 --- [nio-9090-exec-2] p6spy : #1652366234424 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=? select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=11; 2022-05-12 23:37:14.425 INFO 19206 --- [nio-9090-exec-2] p6spy : #1652366234425 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=? select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=12; 2022-05-12 23:37:14.425 INFO 19206 --- [nio-9090-exec-2] p6spy : #1652366234425 | took 0ms | statement | connection 1| url jdbc:h2:tcp://localhost/~/blog select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=? select child0_.parent_id as parent_i4_0_1_, child0_.category_id as category1_0_1_, child0_.category_id as category1_0_0_, child0_.member_id as member_i3_0_0_, child0_.name as name2_0_0_, child0_.parent_id as parent_i4_0_0_ from category child0_ where child0_.parent_id=13; 2022-05-12 23:37:14.456 DEBUG 19206 --- [nio-9090-exec-2] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor 안녕하세요. 좋은 강의 감사합니다. 강의에서 Order로 api를 만들어주셔서 저는 개인적으로 Category에 대해서 api를 간단하게 만들어보면서 테스트를 몇가지 진행했었는데요. Controller에서 Category의 child를 지연로딩을 통해서 가져올 때 아래 세가지의 경우에 따라 쿼리문이 달라지는 현상을 겪었습니다. 위 코드에서 `<-- 이부분` 으로 표시된 부분을 참고해주시면 감사하겠습니다. 1. Repository로 최초에 Category를 가져올 때에는 in 쿼리가 잘 나갔고, 2. Controller에서 Service로 최초에 Category를 가져올 때는 Service의 해당 메소드에 @Transaction 일떄에는 N+1 문제가 발생하고 3. readOnly=true 일때에는 in 쿼리로 잘 가지고 오는데 이 상황에대해서 이해가 잘 되지 않아 질문 드리게 됐습니다. 3가지 상황 모두 OSIV가 켜져있고, default_batch_fetch_size: 100인 상황입니다. 각각 상황에 대해서 왜 in 쿼리가 나가고 안나가는지에 대해서 설명해주실 수 있을까요? 감사합니다. Repository와 Service차이의 경우 OSIV가 켜져있기 때문에 Controller에 돌아와서도 영속성 컨텍스트가 유지되는게 동일 할텐데 왜 쿼리 차이가 있는지 모르겠고 readOnly=true인 경우, 영속성 컨텍스트의 내용을 플러시하지 않는 것으로 알고있는데 플러시 여부와 지연로딩시 쿼리가 다르게 나가는 것은 상관이 없을 것 같은데 왜 차이가 나는지 파악이 안되고 있습니다. * 트랜잭션 로그를 찍어보니 Repository에서는 transaction을 생성하지 않고 트랜잭션없는 읽기를 진행하는 것으로 보이고 Service에서는 readOnly인 트랜잭션을 생성하냐/아니냐의 차이로 보입니다.
-
미해결실전! Querydsl
동적 쿼리 작성을 위한 SearchCondition 사용시 주의사항
안녕하세요. 강사님. 동적 쿼리 작성을 위해 SearchCondition 방식을 팁으로 알려주셨는데요. SearchCondition 과 엔티티의 필드가 1:1 로 이루어져야 동적 쿼리 작성에 유용할거 같은데 SearchCondition -> BooleanBuilder 로 변환해야되고 이 과정에서 메모리 사용량이 많아질거 같은데요. SearchCondition 적용하므로 인한 메모리 이슈등은 없었는지요? 해당 이슈를 방지할수 있는 팁이 좀 더 있을까요?^^
-
미해결이미지 관리 풀스택(feat. Node.js, React, MongoDB, AWS)
s3 ClientConfiguration 옵션 질문
server/aws.js 에서는 s3 인스턴스 생성할 때 ClientConfiguration 옵션 객체에 accesskey랑 secretkey를 넣어줬는데요 lambda/index.js 에서는 안해줘도 되나요? 어떻게 인증이 되는건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
//짝수값만 벽 if (x % 2 == 0 || y % 2 == 0)
//짝수값만 벽 if (x % 2 == 0 || y % 2 == 0) 이 코드에서 짝수값만 벽이라 하셨는데 왜 테두리 까지 빨간색으로 되어있는지 모르겠습니다.
-
해결됨[백문이불여일타] 데이터 분석을 위한 고급 SQL
해커랭크 Top Earners 문제 답답합니다 ㅜㅜ
변수 명명이 헷깔립니다. 1. WHERE절에 서브쿼리를 할때 SELECT months*salary , count(*) FROM Employee WHERE months*salary = (SELECT MAX(months *salary) FROM Employee) GROUP BY months*salary 이렇게 months*salary를 따로 명명해주지 않아도 잘 돌아갑니다. 그런데 SELECT months*salary AS earnings, count(*) FROM Employee WHERE earnings = (SELECT MAX(months *salary) FROM Employee) GROUP BY earnings 이런식으로 WHERE과 GROUP BY에 earnings라고 명명한 변수를 쓰면 에러가 납니다. 그 이유를 모르겠습니다. 2. 그런데 HAVING 절에 서브쿼리를 쓰는 경우는 이와 반대가 됩니다. SELECT months*salary AS earnings, count(*) FROM Employee GROUP BY earnings HAVING earnings = (SELECT MAX(months*salary) FROM Employee) 이렇게 GROUP BY와 HAVING에 earnings라고 명명한 변수를 주면 잘 돌아갑니다. 그런데 SELECT months*salary , count(*) FROM Employee GROUP BY months*salary HAVING months*salary = (SELECT MAX(months*salary) FROM Employee) 이렇게 이름을 따로 명명해주지 않으면 안돌아갑니다. 명명부분이 너무 어렵습니다ㅜㅜ 도와주세요
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
4분 쯤에 post 방식으로 전송했을 때, 개발자 도구에 form data가 안나오네요..
저는 영한님이랑 다르게 user-agent 까지만 나오고 form-data 부분이 안나옵니다. 어떻게 확인할 수 있을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
UpdatePosition질문
기초적인 부분이긴 하지만 아직도 정확히 이해가 안가서 질문드립니다... 사용자의 입력을 받고 UpdatePoposition이 매 프레임마다 호출되는 과정에서 dist가 if와 else의 조건을 둘다 만족하게 되어 Idle인 상태와 Moving인 상태를 왔다라 갔다리 하는것 까지는 느낌적인 느낌으로 알겠습니다. 그런데 dist < _speed * Time.deltaTime 에서 1) _speed (= 5) * Time.deltaTime 이 무엇을 의미를 하는지 모르겠습니다. ( 사용자의 컴퓨터 사양이 다르기 때문에 이것을 해준다 라고는 들었는데 어떻게 동작을 하는것인지...ㅠㅠ) 2) TIme.deltaTime의 값이 얼마 인지를 잘 모르겠습니다.
-
미해결Outlook과 OneNote로 스마트한 업무 시스템 만들기
강의 자료를 공유 받을수 있을까요?
안녕하세요? 강의를 잘 듣고 있습니다. 혹시 강의 자료를 공유 받을수 있을까요? 실무에 적용하면서 틈틈히 꺼내어 볼 수 있었으면 해서요. 감사합니다^^
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
gradlew build 에러 뜹니다ㅠㅜ
./gradlew build 하면 ERROR: JAVA_HOME is set to an invalid directory: /Library/Java/JavaVirtualMachines/jdk11.0.12.jdk/Contents/Home Please set the JAVA_HOME variable in your environment to match the location of your Java installation. 이렇게 뜨는데 어떻게 해야하나요ㅠㅠ 맥북 사용중입니다!!
-
미해결파이썬 증권 데이터 수집과 분석으로 신호와 소음 찾기
url 앞에 'f'를 붙이는 것에 대한 의미를 정확히 모르겠습니다.
교수님 안녕하세요? 아래 질문한 학생인데 한 가지 질문이 더 있어서 이렇게 여쭙습니다. url = f"https://finance.naver.com/item/sise_day.naver?code={item_code}&page={page_no}" 에서 'f'를 붙이는 의미를 정확히 이해 못 하겠습니다. 처음에는 그냥 넘어갔는데, 이후에도 몇 번 나와서 여쭙습니다. 감사합니다!
-
미해결파이썬 증권 데이터 수집과 분석으로 신호와 소음 찾기
fdr에서 미국 주식 종목코드대신 티커(Ticker)를 사용하면 에러가 납니다. 왜 그런가요?
교수님 안녕하세요? 수업 너무 잘 듣고 있는 학생입니다. fdr에서 미국 주식 종목코드대신 티커(Ticker)를 사용하면 에러가 납니다. 왜 그럴까요? ㅠ amd = fdr.DataReader("AMD", "2015", "2021") amd --------------------------------------------------------- --------------------------------------------------------------------------- JSONDecodeError Traceback (most recent call last) ~\anaconda3\lib\site-packages\requests\models.py in json(self, **kwargs) 909 try: --> 910 return complexjson.loads(self.text, **kwargs) 911 except JSONDecodeError as e: ~\anaconda3\lib\json\__init__.py in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw) 345 parse_constant is None and object_pairs_hook is None and not kw): --> 346 return _default_decoder.decode(s) 347 if cls is None: ~\anaconda3\lib\json\decoder.py in decode(self, s, _w) 336 """ --> 337 obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 338 end = _w(s, end).end() ~\anaconda3\lib\json\decoder.py in raw_decode(self, s, idx) 354 except StopIteration as err: --> 355 raise JSONDecodeError("Expecting value", s, err.value) from None 356 return obj, end JSONDecodeError: Expecting value: line 1 column 1 (char 0) During handling of the above exception, another exception occurred: JSONDecodeError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_6068/1779725454.py in <module> 4 # amd 5 ----> 6 amd = fdr.DataReader("AMD", "2015", "2021") 7 amd ~\anaconda3\lib\site-packages\FinanceDataReader\data.py in DataReader(symbol, start, end, exchange, data_source) 39 # Investing 40 reader = InvestingDailyReader ---> 41 df = reader(symbol, start, end, exchange, data_source).read() 42 end = min([pd.to_datetime(end), datetime.today()]) 43 while len(df) and df.index[-1] < end: # issues/30 ~\anaconda3\lib\site-packages\FinanceDataReader\investing\data.py in read(self) 60 start_date_str = self.start.strftime('%m/%d/%Y') 61 end_date_str = self.end.strftime('%m/%d/%Y') ---> 62 curr_id = self._get_currid_investing(self.symbol, self.exchange, self.data_source) 63 if not curr_id: 64 raise ValueError("Symbol unsupported or not found") ~\anaconda3\lib\site-packages\FinanceDataReader\investing\data.py in _get_currid_investing(self, symbol, exchange, data_source) 28 } 29 r = requests.post(url, data={'search_text': symbol}, headers=headers) ---> 30 jo = r.json() 31 if len(jo['quotes']) == 0: 32 raise ValueError(f"Symbol('{symbol}') not found") ~\anaconda3\lib\site-packages\requests\models.py in json(self, **kwargs) 915 raise RequestsJSONDecodeError(e.message) 916 else: --> 917 raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) 918 919 @property JSONDecodeError: [Errno Expecting value] <!DOCTYPE HTML> <html lang="en-US"> <head> <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> <meta name="robots" content="noindex, nofollow" /> <meta name="viewport" content="width=device-width,initial-scale=1" /> <title>Just a moment...</title> <style> html, body {width: 100%; height: 100%; margin: 0; padding: 0;} body {background-color: #ffffff; color: #000000; font-family:-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, "Helvetica Neue",Arial, sans-serif; font-size: 16px; line-height: 1.7em;-webkit-font-smoothing: antialiased;} h1 { text-align: center; font-weight:700; margin: 16px 0; font-size: 32px; color:#000000; line-height: 1.25;} p {font-size: 20px; font-weight: 400; margin: 8px 0;} p, .attribution, {text-align: center;} #spinner {margin: 0 auto 30px auto; display: block;} .attribution {margin-top: 32px;} @keyframes fader { 0% {opacity: 0.2;} 50% {opacity: 1.0;} 100% {opacity: 0.2;} } @-webkit-keyframes fader { 0% {opacity: 0.2;} 50% {opacity: 1.0;} 100% {opacity: 0.2;} } #cf-bubbles > .bubbles { animation: fader 1.6s infinite;} #cf-bubbles > .bubbles:nth-child(2) { animation-delay: .2s;} #cf-bubbles > .bubbles:nth-child(3) { animation-delay: .4s;} .bubbles { background-color: #f58220; width:20px; height: 20px; margin:2px; border-radius:100%; display:inline-block; } a { color: #2c7cb0; text-decoration: none; -moz-transition: color 0.15s ease; -o-transition: color 0.15s ease; -webkit-transition: color 0.15s ease; transition: color 0.15s ease; } a:hover{color: #f4a15d} .attribution{font-size: 16px; line-height: 1.5;} .ray_id{display: block; margin-top: 8px;} #cf-wrapper #challenge-form { padding-top:25px; padding-bottom:25px; } #cf-hcaptcha-container { text-align:center;} #cf-hcaptcha-container iframe { display: inline-block;} </style> <meta http-equiv="refresh" content="35"> <script> //<![CDATA[ (function(){ window._cf_chl_opt={ cvId: "2", cType: "non-interactive", cNounce: "32421", cRay: "70a2066eee2252f5", cHash: "a3250cbc257b75f", cUPMDTk: "\/?__cf_chl_tk=4AEdswm23.t_D1Kw4CowdKfl.p2O_4HDm_Fqhdm4tdk-1652346667-0-gaNycGzNCH0", cFPWv: "b", cTTimeMs: "1000", cRq: { ru: "aHR0cHM6Ly9jbi5pbnZlc3RpbmcuY29tLw==", ra: "TW96aWxsYS81LjAgKE1hY2ludG9zaCkgQXBwbGVXZWJLaXQvNTM3LjM2IENocm9tZS85OC4wLjQ3NTguMTA5", rm: "R0VU", d: "IrGXJX8WwxjHXC6SsLCyk5flSLKTkxdpBpn2uRFFjlhGA8FCzv1106INRQFcBCSOcc34UH5nxCxgebdO8IxwHVtQJTP7KekrmViRq1uOINl+AdX/a7i5RtF81mAIjVfGeDs5efiKIHUugONm7di/Xrw8p8JJpQ5ptheMrfDN1MVAnNeUvNeVv9OBWKcGIDbP2k+o7eVU1w7jEiUcPon932rhc5zweSsD5q9de0QkKxsXdTtwDZinxn7yaenlYYyUKTOn6Wt8sAyn09ME+iz+2TuAFvPMEt5eHG5m40pfZDbyah/W2SuEYPdwIZmZDb6Sd6WfuxBrNfJe1UbCbef8R/bjsw/1l0O/3Br3hOzTupONzZEFsiApEyFnaHd2gQWBhx1cbTGslUAYpdbj+micFY2zvAfLMgOHC56YmIFGk+EKEihMkaIuz2o9V0p7tBGsmexvHiBt4pChBoSUidvZ6tD/YQFC6qfBpn5moCRnzw7ngg2KtreyKZ540WXrUrrJQJG4w6A7kGJXbGy/YdLm8V3l8lSWhu1sfZiHBxiHPBDmyV9WzYbBUz/vGxNVlx3A9XcUsUE6KtZo8ITJWVvgnjvbbufQ1XMr3H4pbPDDtX4=", t: "MTY1MjM0NjY2Ny4zNTkwMDA=", m: "w8fUFTCnxEtk0fB7RJyyNGcBwOGo18NG04QMYvJ3GdE=", i1: "2nPfOKusxCugpSkSIFoqHQ==", i2: "n23pckyYeUXKbesrZe6pow==", zh: "JJQg2KI/+bPgJbLHlLjmrs/mnno8aAGH5k3tm8QDk4c=", uh: "POxlFgDekQG5h9Kd7TiU8+U9MUspCK9r8ctlJLyBZWY=", hh: "T2hi97JJ3TXBbbaDfe4fVaGfimFjucUPtz+gmsc9Zq0=", } } window._cf_chl_enter = function(){window._cf_chl_opt.p=1}; })(); //]]> </script> </head> <body> <table width="100%" height="100%" cellpadding="20"> <tr> <td align="center" valign="middle"> <div class="cf-browser-verification cf-im-under-attack"> <noscript> <h1 data-translate="turn_on_js" style="color:#bd2426;">Please turn JavaScript on and reload the page.</h1> </noscript> <div id="cf-content" style="display:none"> <div id="cf-bubbles"> <div class="bubbles"></div> <div class="bubbles"></div> <div class="bubbles"></div> </div> <h1><span data-translate="checking_browser">Checking your browser before accessing</span> cn.investing.com.</h1> <div id="no-cookie-warning" class="cookie-warning" data-translate="turn_on_cookies" style="display:none"> <p data-translate="turn_on_cookies" style="color:#bd2426;">Please enable Cookies and reload the page.</p> </div> <p data-translate="process_is_automatic">This process is automatic. Your browser will redirect to your requested content shortly.</p> <p data-translate="allow_5_secs" id="cf-spinner-allow-5-secs" >Please allow up to 5 seconds…</p> <p data-translate="redirecting" id="cf-spinner-redirecting" style="display:none">Redirecting…</p> </div> <form class="challenge-form" id="challenge-form" action="/?__cf_chl_f_tk=4AEdswm23.t_D1Kw4CowdKfl.p2O_4HDm_Fqhdm4tdk-1652346667-0-gaNycGzNCH0" method="POST" enctype="application/x-www-form-urlencoded"> <input type="hidden" name="md" value="7F11XeMx.ejOcm5oKagE6vMFVK_j.Pz2FIc0swxinqE-1652346667-0-AUybo4Ro0l1qXkmJ1DkI4qZxcjJTXb_JroUhYqMxz1IHsItTMBcl2SvE-Nwc4YHtH3aCMgTLJZWSB6iWaoUAX7Dmord_nj_y6po-kTqWq_7k1ucnDXpezv_jWsMqMtHSHvWQRx_f0KsYCu83UyAyJtz8xLKqwRREZuC0gjQydYhL9JjSVGkuSvaZ4VyOq3bLZPSfEfkw_yI164lnskD2Qcyv6qZmidWqUks3762SXA-D6ZDzp_hV5X5IdoelmjhxzUg1o9hVZ0-IJufOEtCUdN2dAocVEM_DEHm4AA77bfTIbaefwd3Ss170zUJxGFYm4rcwTtuF1zYbnyDwuUNg0ljsQoQNnO0D0hcHZv03_F992DYAinpFnsmEQd2awPYIlRCoOJVGxRfqXgtXNdgdtHulARtKVjsswAHxzWCvAmTz9sJsXSKiRgNMd3BdK1YkTmqmL8OuBmozDM78JKdZaBsUcrOrQmy0ebWDhYUJlUwJlt6SPYzH6n4wwuAVemHd6Zt4wwjvqjbF_tXTXR0eHyumR57Zem88H4CQtUVFSS96zoU3jCMqPSzMIDXw4ajVX4y4Vr6xiScXZ-vF-fcRZqNHtj2tgjcnA-bCvIwLPiecKnsNgLqbOOy3dRP4P0Xdp2UU4220QecPLwd3Z1lvmLg" /> <input type="hidden" name="r" value="VmkvMwaXQCCXVwuKHULAoIBe8.rhkYFvpLZ8qM0cZ44-1652346667-0-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"/> <input type="hidden" value="2a8239f20bf11282609a7a5d0fb900d6" id="jschl-vc" name="jschl_vc"/> <!-- <input type="hidden" value="" id="jschl-vc" name="jschl_vc"/> --> <input type="hidden" name="pass" value="1652346668.359-GRitOVYXok"/> <input type="hidden" id="jschl-answer" name="jschl_answer"/> </form> <script> //<![CDATA[ (function(){ var a = document.getElementById('cf-content'); a.style.display = 'block'; var isIE = /(MSIE|Trident\/|Edge\/)/i.test(window.navigator.userAgent); var trkjs = isIE ? new Image() : document.createElement('img'); trkjs.setAttribute("src", "/cdn-cgi/images/trace/jschal/js/transparent.gif?ray=70a2066eee2252f5"); trkjs.id = "trk_jschal_js"; trkjs.setAttribute("alt", ""); document.body.appendChild(trkjs); var cpo=document.createElement('script'); cpo.type='text/javascript'; cpo.src="/cdn-cgi/challenge-platform/h/b/orchestrate/jsch/v1?ray=70a2066eee2252f5"; window._cf_chl_opt.cOgUHash = location.hash === '' && location.href.indexOf('#') !== -1 ? '#' : location.hash; window._cf_chl_opt.cOgUQuery = location.search === '' && location.href.slice(0, -window._cf_chl_opt.cOgUHash.length).indexOf('?') !== -1 ? '?' : location.search; if (window._cf_chl_opt.cUPMDTk && window.history && window.history.replaceState) { var ogU = location.pathname + window._cf_chl_opt.cOgUQuery + window._cf_chl_opt.cOgUHash; history.replaceState(null, null, "\/?__cf_chl_rt_tk=4AEdswm23.t_D1Kw4CowdKfl.p2O_4HDm_Fqhdm4tdk-1652346667-0-gaNycGzNCH0" + window._cf_chl_opt.cOgUHash); cpo.onload = function() { history.replaceState(null, null, ogU); }; } document.getElementsByTagName('head')[0].appendChild(cpo); }()); //]]> </script> <div id="trk_jschal_nojs" style="background-image:url('/cdn-cgi/images/trace/jschal/nojs/transparent.gif?ray=70a2066eee2252f5')"> </div> </div> <div class="attribution"> DDoS protection by <a rel="noopener noreferrer" href="https://www.cloudflare.com/5xx-error-landing/" target="_blank">Cloudflare</a> <br /> <span class="ray_id">Ray ID: <code>70a2066eee2252f5</code></span> </div> </td> </tr> </table> </body> </html> : 0
-
미해결ES6 문법과 함께하는 모던 Javascript(자바스크립트) 고급 Part.1
Set에서 entries를 사용해야 할 필요가 있나요?
결국 key, value가 같은 값으로 생성이 되는데, 굳이 entries로 뭔가 작업할 일이 있을까 싶어서요.
-
미해결모던 자바스크립트(javascript) 개발을 위한 ES6 강좌
로또 구현
const SETTING = { name: 'Lucky Lotto!', count: 6, maxNumber: 45 } function getSingleNum(min, max) { return Math.floor(Math.random() * (max - min + 1)) + 1 } function getLottoNum() { let numSet = new Set() let {count, maxNumber} = SETTING while(numSet.size !== count) { let num = getSingleNum(1, maxNumber) if(!numSet.has(num)) numSet.add(num) } return [...Array.from(numSet).sort((a, b) => a - b)] } console.log(getLottoNum())
-
미해결
수강기간 연장 문의
안녕하세요? 그동안 사정이 있어서 강의를 결제만 해 놓고 못 들었는데 오늘 보니까 유효기간이 1년이더라구요 ㅠㅠ 저는 평생강의인줄 알았어요.. 혹시 2~3달정도 더 연장이 안 될까요?
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
안녕하세요!!!몇가지 질문 드리려고 합니다!!!ㅎㅎ
현재 저는 Django restframework api 로 s3에 video파일을 업로드 하고 이를 처리하는 코드를 만들고 있습니다!! 여기서 저는 AWS Lambda(trigger), S3, Mediaconvert을 통해 업로드 되는 미디어 파일을 일괄 트랜스 코딩 작업을 해서 저장을 하려고 합니다!! 현재 동작방식은 (아직 제 장고서버에는 적용하지 않았지만 테스트 서버로써) s3 특정 버켓에 video파일이 올라가면 자동으로 lambda trigger를 동작시켜 제가 지정한 경로에 video파일이 transcoding이 되도록 작업을 해두었습니다!! (차후 아래 사항이 해결이되면 장고로 video가 업로드가 되면 위를 접목시킬 예정입니다) 1. 제 생각에는 비동기 처리가 순서대로 두번 이루어 지는것 같은데 첫번째로는 파일을 업로드하기위한 post요청시 응답을 비동기 처리 (장고에서 처리) , 두번째는 트랜스코딩 처리 이는 aws단에서 이루어지기 때문에 관련이 없을것같습니다. 그래서 첫번째 post요청시(create video) 비동기 처리를 해야하는데 이와 관련된 참고할만한 class나 자료가 있을까요?? (제가 modelviewset을 활용하고 있는데 create async기능 때문에 상속 class를 바꾸어서 modelviewset의 편리함을 다 포기해야할까요 ㅠㅠ? or 아예 async createapi만 따로 만들어서 처리를 해야할까요!!?? ) 즉!! redit을 보면 비디오 파일 업로드시 비동기처리가 되고 업로드가 완료되면 push알람이 오더라고요 ㅎㅎ 요론식으로 구현을 원해서 이와 관련된 서드파티라이브러리나 좋은 자료가 있을까요!!?? 2. 장고로 파일을 s3에 업로드 하면 저장이 되는데 그중 혹시라도 파일명이 겹칠 수 가 있자나요?? 이부분을 처리를 해야할것같은데 제가 생각한 방법은 전에 선생님께서 전에 알려주신 serializer에 to_representation 메소드를 이용해서 파일명을 임의로 변경해서 reponse하도록 하는것을 생각해 보앗는데 이게 문제는 없는 방법일까요!!?? 아니면 보통 이러한 경우는 어떻게 처리를 하나요!!?? ㅎㅎ 3. 마지막으로 장고랑은 좀 무관한 내용이지만 위와 관련해서 video 트랜스 코딩 과정사항을 알기 위해서 polling과정이 있어야 할텐데 클라이언트에서 polling 이루어지는 과정이 어떻게 되나요 ?? 제가 소속된 팀은 코틀린을 사용하고 있고요 꼭 코틀린이 아니더라도 어떻게 이루어지는 궁금합니다! 그냥 제 개인적인 예상은 몇초단위로? 계속 api요청을 보내서 status값이 completed면 이후 처리 .. 막 이런식으로 예상을 해보았는데 실제 서비스를 돌릴 때도 이러한 과정으로 비동기 처리에 대한 polling 이루어지나요!?? (위 과정이 맞다면 boto3를 활용해서 mediaconvert reponse status api를 따로 만들어주려고 합니다!) 질문이 다소 많았는데 파고들수록 어렵고 복잡해 지네요 ㅠㅠ 제가 경험이 부족하다보니 프로세스에 대하여 잘못 이해하고 있거나 이해가 안되시는 부분은 말씀해주시면 바로 자세하게 설명드리겠습니다!! ㅎㅎ 그리고 제 예상으론ㅎㅎ 사무실이 곧 or 이미 오픈하신것으로 아는데 너무너무 축하드리고요!! 선생님의 명품 장고 세미나 정말너무너무너무 기대하고 있습니다!! 항상 진심으로 감사드립니다!! ㅎㅎ
-
미해결
안녕하세요. Ubuntu하다가 막혀서 글남깁니다. ㅠ
안녕하세요. 우분투 활용중에 fatal: destination path 'ardupilot' already exists and is not an empty directory. 라고 떠서 도저히 무슨말인지 서치해도 모르겠습니다 .ㅠㅠ 알려주세요ㅠㅠㅠㅠㅠㅠㅠㅠㅠ
-
해결됨만들면서 배우는 리액트 : 기초
const title =<h1>제목</h1>; 에는 괄호가 없어도 되네요?
한줄이기 때문에 그런 걸까요?
-
미해결풀스택 리액트 라이브코딩 - 간단한 쇼핑몰 만들기
안녕하세요! 장바구니에 왜 담기지 않는지 궁금합니다
깃허브 주소 먼저 첨부드리겠습니다 https://github.com/shinwonse/shopping-mall 핸들러에서 잘못된거 같은데 계속 돌려보면서 따라쳐봐도 어디가 문제인지 모르겠네요ㅜㅜ 혹시 깃허브에 mocks 폴더도 올려주실수있나요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
인터셉터와 시큐리티
안녕하세요 늘 강의 잘보고 있습니다 이번에 인터셉터 강의를 보면서 스프링 시큐리티와 비슷하다는 생각을 했습니다 물론 세세하게 따져보면 기능들이 다를테지만,,, 이번 강의에서 나오는 해당 url 접속시 낚아채는 기술은 인터셉터에서도 있고, 시큐리티에서도 사용했던 경험이 있어서 헷갈립니다 인터셉터와 시큐리티에서 제공하는 url 접근시 낚아채는 기술은 어떤 상황에서 각각 사용하면될까요?? 감사합니다
-
미해결Vue.js 끝장내기 - 실무에 필요한 모든 것
Child Component member function access
안녕하세요.먼저 유용한 강의 감사합니다.강의를 바탕으로 프로젝트를 진행하고 있습니다. 제가 Naver Map Api를 이용해 주소를 기반으로 대락젹인 위치를 잡고, 지도를 통해 정확한 위치를 잡고자 컴포넌트를 작성했습니다. import NaverMap from "@/components/External/NaverMap/NaverMap"; const map = { install( Vue ) { const clientId = process.env['VUE_APP_X_NCP_APIGW_API_KEY_ID']; if( !clientId ) return; const URL = `https://openapi.map.naver.com/openapi/v3/maps.js?ncpClientId=${clientId}`; const script = document.createElement('script'); script.setAttribute('src', URL); script.id = 'naver-map-load'; script.setAttribute('async', ''); script.setAttribute('defer', ''); document.head.appendChild(script); Vue.component('naver-map', NaverMap); } } export default map; 지도 컴포넌트에서는 지도가 로드되면 지도 컴포넌트 자신을 상위 컴포넌트에 $emit 함수를 통해 전달합니다. methods: { genCenter() { return this.map.getCenterPoint(); }, createMap() { let options = {}; options.zoom = 17; if( this.options.longitude && this.options.latitude ) { options.center = new window.naver.maps.LatLng(this.options.latitude, this.options.longitude); } this.map = new window.naver.maps.Map(this.map_content_id, options); window.naver.maps.Event.addListener( this.map, 'center_changed', event => this.$emit( 'center_changed', event ) ) window.naver.maps.Event.addListener( this.map, 'centerPoint_changed', event => this.$emit( 'centerPoint_changed', event ) ) this.$emit('loaded', this ); } } 위 코드에서 발생된 'loaded' 이벤트가 상위 컴포넌테에 전달되면 전달된 컴포넌트를 data에 저장합니다. 그리고 'center_changed' 이벤트가 발생하면 기존 전달된 컴포넌트 객체의 getCenter 함수를 통해 맵의 중심좌표를 가져와 data 설정하도로록 되어 있습니다. onLoadMap( map ) { this.map = map; }, onCenterChanged() { const map = this.map; const center = map.getCenter(); this.center.longitude = center.x; this.center.latitude = center.y; }, 그러나 data의 map 변수의 'getCenter' 함수에 접근할 수 없습니다. 디버그를 통해 보니 map 변수는 Proxy라는 기존 컴포넌트를 감싸고 있어 바로 접근이 안됩니다.위 부분을 어떻게 처리하면 좋을까요?