묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결파이썬 라즈베리파이 IoT프로젝트-원격모니터링 자동차
etcher flash 실패
(사진)
-
RPA와 Process Mining 입문과 연계
강의 중복
삭제된 글입니다
-
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
실행 오류 관련 문의드립니다
삭제된 글입니다
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
질문이 두개 있습니다
안녕하세여 강사님 먼저 좋은 강의 감사드리고여 질문이 두개 있습니다 둘다 save 함수에 관해서인데여 1.Statement.RETURN_GENERATED_KEYS 를 리턴 받기 위해 디비 설정이 추가적으로 필요한가요? ex) pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 2.member.setId(rs.getLong(1)); 를 하는 이유는 무엇인가여? if (rs.next()) { // 입력 성공시 member 객체의 id 설정 하기 member.setId(rs.getLong(1)); } else { throw new SQLException("id 조회 실패"); }
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
파이썬 인터프리터
파이썬 인터프리터 설치하는 게 안 떠요. 영상 그대로 파이썬 설치한 것 같은데요..
-
미해결CSS Flex와 Grid 제대로 익히기
질문이 잇습니다.
flex: 1을 주면 basis가 0이 되는건가요? 그리고 basis가 0이 되면 차일드로 해논 width값은 없어지는건가요? 그냥 비율에 맞게 0으로 모두 바꿔버리는 거지요? auto 로 해노면 값을 width값으로 정해져서 적용할수잇구요?ㅠ 헷가리네요 ㅠ 아그리고 flex: 1 1 200px로 햇을시 basis 픽셀은 영향을 안받나요? ㅠㅠ
-
미해결스프링 데이터 JPA
특정 repository를 이용해 save 후 DB에도 반영된 정보가 해당 repository 를 통해 find 시 DB반영된 정보를 가지고 오지 못하는 현상에 대한 질문드립니다.
아래와 같은 소스들이 있습니다. 1. 인터페이스기반의 repository public interface TestModelRepository extends JpaRepository<TestModel, Long>{ } 2. 서비스 @Service public class TestService { ... @Autowired TestModelRepository testModelRepository; public void test() { ... while(true) { Optional<TestModel> optTestModel = testModelRepository.findById(id); TestModel testModel; if(optTestModel.isPresent()) { testModel = optTestModel.get(); logger.info("testModel: {}", testModel.toString()); } } } ... } 3. worker thread를 통해 호출되는 코드 public class TestAction { ... public void act(TestModelRepository testModelRepository, TestModel testModel) { ... testModel.setComment("new comment"); TestModel savedTestModel = testModelRepository.save(testModel); logger.info("savedTestModel: {}", savedTestModel.toString()); } ... } 상태 TestService의 test()에 의해 다른 worker thread에서 동작하는 TestAction의 act()가 호출됩니다. TestAction.act에 전달된 testModelRepository는 TestService의 것과 동일한 레퍼런스입니다. TestAction.act()에 의해 정상적으로 DB에 저장된 것이 확인됩니다. 그런데, TestService의 test()에서 주기적으로 TestAction.act()호출 시에 전달한 testModel에 대한 id를 이용해서 `testModelRepository.findById(id)` 를 수행하면 저장된 값이 아닌 저장 이전의 값만 가지고 오고 있습니다. 질문(이해가되지 않는 부분) 위 상태 1.에 의해 저장에 의해 SimpleJpaRepository의 save()의 처리를 타면서 저장한 정보가 merge되었기 때문에 Persistence Context에 정상적으로 적용이 될 것이기 때문에 상태 3의 `testModelRepository.findById(id)` 코드를 통해 해당 entity를 가져오면 정상적으로 변경된 내용을 가지고 와야 할 것 같은데 이해가 되지 않습니다.(제가 Persistence Context관련하여 놓치고 있는 부분이 있는 것 같은데 잘 모르겠네요.) 왜 그럴까요?
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
변수명 = 함수명.... 가능한가요?
index = python.index("n") 여기에서 함수가 index인데 함수명과 같은 변수를 선언해도 되는건가요? c에서는 안되는걸로 알고있는뎅
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
npm run start가 되지 않습니다.
안녕하세요. npm run start 입력 시 이런 오류가 뜹니다. 오류 사진 첨부합니다. 구글링하니 cached를 없애고 npm을 재설치해라 등등 하라는대로 해봤는데 안되네요... 조언 부탁드립니다. 감사합니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
앤티티에서 두개의 같은 앤티티를 매핑하는 법에 대해 질문드립니다.
안녕하세요 선생님 선생님의 강의 덕분에 JPA 대해 많은것을 알게 되었습니다. 다름이 아니오라 JPA를 활용한 가벼운 프로젝트를 만들다 이럴때는 어떤 방식으로 하시는지 궁금해 질문드리게 되었습니다. 예를 들어 A팀과 B팀이라는 축구 팀이 있습니다. (Team 이라는 앤티티) 이 두팀의 서로 경기일정, 장소,경기 득점을 담는 경기일정 테이블이 있습니다. (Match 라는 앤티티) 여기서 Match라는 앤티티에 두팀을 매핑 시키는 방법에 대해 질문드리게 되었습니다. -------------------------------------------------------------------------------------------------------------- 첫번째 방법은 Match테이블에 두 앤티티를 받는 방법인데 생각한 방식은 홈팀과 어웨이 팀으로 해서 만드는 방식을 생각했습니다 그런데 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.springjpa.sample.soccorshop.domain.team.match.Match column: team_pkid (should be mapped with insert="false" update="false") 이 오류의 설명 처럼 insert="false" update="false"로 하는 것이 맞는지 모르겠습니다. 두개의 동일한 앤티티를 한 앤티티에 넣는 경험이 없어 맞는지 의심이 들어... --------------------------------------------------------------------------------------------------------------------- 두번째 생각한 방법은 한 Match 테이블에서 한쪽은 Team으로 다른쪽은 팀의 주장인 Member앤티티로 조회하는 방법 강의를 통해서 또는 다른 기능들을 구현하면서(예를 들어 한 회원이 팀에 들어가고 싶어 축구 팀에 가입 신청을 하면 팀에서 가입 요청 목록을 조회하여 그회원을 가입허가) Member(회원 ){1} ------- {N}JoinRequest(가입요청){M}----------{1}Team(팀) 다른 엔티티를 탐색하는 것에 익숙하다 보니 이방식으로 구현할수도 있다고 생각합니다. 경기가 끝나고 득점같은 것을 Match테이블에 기록하고 나중에 경기 결과 리스트를 만들때는 'homeTeam의 id와 소속한 팀의 id가 같거나 awayCaption의 id와 소속한 팀의 주장의 id와 같은 Match테이블'을 jpql로 해서 받을수 있지 않을까 생각합니다. ---------------------------------------------------------------------------------------------------------------- 세번째는 그냥 Member, Team 매핑 하지말고 그냥 String으로 두개의 팀이름으로 작성하자는 방법입니다. 이렇게 테이블을 작성하고 나중에 조회할때는 homeTeamName, awayTeamName 둘중 하나와 소속한 팀의 이름이 같은 Match테이블 리스트를 반환하는 방법입니다. 이 방법으로는 쉽게 구현할 수 있다고 생각하지만 디테일한 예전 기록을 볼려면 getter을 활용한 List를 반환 받을수 없다고는 생각합니다 세가지 방법을 생각해봤는데 2번째 방법은 다른 앤티티 탐색의 경험으로 저렇게 하면 되지 않을까 라는 생각이지만 굳이 저렇게 할 필요가 있나? 라는 생각도 있어 잘 모르겠습니다... 현업에서는 매칭 같은 것은 어떤 방식으로 구현하시는지 궁금해 여쭙게 되었고 혹시나 제가 생각한것과 다른 방식이 있는지 조언을 여쭙고자 글을 남기게 되었습니다. 혹시 설계의 기본도 없다고 말씀해 주셔도 감사히 새겨 듣겠습니다. 마지막으로 활용1,2 데이터 JPA, querydsl도 한번으로 끝내지 않고 여러번 정독하면서 제것으로 만들려고 하고 있습니다. 좋은 강의, 기술들을 쉽게 잘 설명해 주셔서 항상 감사드립니다.
-
미해결[백문이불여일타] 데이터 분석을 위한 중급 SQL
코드를 입력해서 올렸는데 이런 오류는 무엇일까요
제생각엔 저 코드가 맞다고 생각해서 테스트해보니 no response on stdout~ 뜨네요 https://share.getcloudapp.com/wbu7gkv7
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
혹시 이렇게 풀어도 되려나요..?
import sys sys.stdin=open('input.txt','rt') n=int(input()) a=list(map(int,input().split())) k=n b=[n] for i in range(-2,-n-1,-1): k-=1 b.insert(a[i],k) print(b) 뒤에서부터 접근하는 방식으로 풀어봤습니다.. 그리고 혹시나 해서 여쭤보는건데, k=n을 생략하고 그냥 쓰면 혹시 나중에 버그같은게 걸릴 수 있는지 궁금합니다. 마치 밑의 예시처럼요.. import sys sys.stdin=open('input.txt','rt') n=int(input()) a=list(map(int,input().split())) b=[n] for i in range(-2,-n-1,-1): n-=1 b.insert(a[i],n) print(b)
-
미해결애플 웹사이트 인터랙션 클론!
스크롤하이트가 정의되지않았다고 에러뜨는데 왜일까요,,??
(() => { let yOffset = 0; // window.pageYOffset 대신 쓸 변수 let prevScrollHeight = 0; // 현재 스크롤 위치 (yOffset) 보다 이전에 위치한 스크롤 섹션들의 스크롤 높이 합 let currentScene = 0; // 현재 활성화 된(눈 앞에 보고 있는) 씬 (scroll-section) let enterNewScene = false; // 새로운 씬이 시작 된 순간 true const sceneInfo = [ { //0 type: 'sticky', heightNum: 5, //브라우저 높이의 5배로 scrollHeight 세팅 scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-0'), messageA: document.querySelector('#scroll-section-0 .main-message.a'), messageB: document.querySelector('#scroll-section-0 .main-message.b'), messageC: document.querySelector('#scroll-section-0 .main-message.c'), messageD: document.querySelector('#scroll-section-0 .main-message.d'), canvas: document.querySelector('#video-canvas-0'), context: document.querySelector('#video-canvas-0').getContext('2d'), videoImages: [] }, values: { videoImageCount: 300, imageSequenc: [0, 299], canvas_opacity: [1, 0, {start: 0.9, end: 1 }], messageA_opacity_in: [0, 1, { start: 0.1, end: 0.2 }], messageB_opacity_in: [0, 1, { start: 0.3, end: 0.4 }], messageC_opacity_in: [0, 1, { start: 0.5, end: 0.6 }], messageD_opacity_in: [0, 1, { start: 0.7, end: 0.8 }], messageA_translateY_in: [20, 0, { start: 0.1, end: 0.2 }], messageB_translateY_in: [20, 0, { start: 0.3, end: 0.4 }], messageC_translateY_in: [20, 0, { start: 0.5, end: 0.6 }], messageD_translateY_in: [20, 0, { start: 0.7, end: 0.8 }], // 20=> translateY를 20%만큼 조정, %는 밑에 playAnimation()에서 붙여줄 거임 messageA_opacity_out: [1, 0, { start: 0.25, end: 0.3 }], messageB_opacity_out: [1, 0, { start: 0.45, end: 0.5 }], messageC_opacity_out: [1, 0, { start: 0.65, end: 0.7 }], messageD_opacity_out: [1, 0, { start: 0.85, end: 0.9 }], messageA_translateY_out: [0, -20, { start: 0.25, end: 0.3 }], messageB_translateY_out: [0, -20, { start: 0.45, end: 0.5 }], messageC_translateY_out: [0, -20, { start: 0.65, end: 0.7 }], messageD_translateY_out: [0, -20, { start: 0.85, end: 0.9 }] } }, //1 { type: 'normal', // heightNum: 5, // type normal에서는 필요없음 scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-1') } }, //2 { type: 'sticky', heightNum: 5, // 브라우저 높이의 5배로 scrollHeight 세팅 scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-2'), messageA: document.querySelector('#scroll-section-2 .a'), messageB: document.querySelector('#scroll-section-2 .b'), messageC: document.querySelector('#scroll-section-2 .c'), pinB: document.querySelector('#scroll-section-2 .b .pin'), pinC: document.querySelector('#scroll-section-2 .c .pin'), canvas: document.querySelector('#video-canvas-1'), context: document.querySelector('#video-canvas-1').getContext('2d'), videoImages: [] }, values: { videoImageCount: 960, imageSequenc: [0, 959], canvas_opacity: [1, 0, { start: 0.9, end: 1}], messageA_translateY_in: [20, 0, { start: 0.15, end: 0.2 }], messageB_translateY_in: [30, 0, { start: 0.6, end: 0.65 }], messageC_translateY_in: [30, 0, { start: 0.87, end: 0.92 }], messageA_opacity_in: [0, 1, { start: 0.25, end: 0.3 }], messageB_opacity_in: [0, 1, { start: 0.6, end: 0.65 }], messageC_opacity_in: [0, 1, { start: 0.87, end: 0.92 }], messageA_translateY_out: [0, -20, { start: 0.4, end: 0.45 }], messageB_translateY_out: [0, -20, { start: 0.68, end: 0.73 }], messageC_translateY_out: [0, -20, { start: 0.95, end: 1 }], messageA_opacity_out: [1, 0, { start: 0.4, end: 0.45 }], messageB_opacity_out: [1, 0, { start: 0.68, end: 0.73 }], messageC_opacity_out: [1, 0, { start: 0.95, end: 1 }], pinB_scaleY: [0.5, 1, { start: 0.6, end: 0.65 }], pinC_scaleY: [0.5, 1, { start: 0.87, end: 0.92 }] } }, //3 { type: 'sticky', heightNum: 5, // 브라우저 높이의 5배로 scrollHeight 세팅 scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-3'), canvasCaption: document.querySelector('.canvas-caption') }, values: { } } ]; function setCanvasImages() { let imgElem; for (let i = 0; i < sceneInfo[0].values.videoImageCount; i++) { imgElem = new Image(); // imgElem = document.createElement('img'); imgElem.src = `./video/001/IMG_${6726 + i}.JPG`; sceneInfo[0].objs.videoImages.push(imgElem); } let imgElem2; for (let i = 0; i < sceneInfo[2].values.videoImageCount; i++) { imgElem2 = new Image(); imgElem2.src = `./video/002/IMG_${7027 + i}.JPG`; sceneInfo[2].objs.videoImages.push(imgElem2); } } function setLayout() { // 각 스크롤 섹션의 높이 세팅 for (let i = 0; i < sceneInfo.length; i++) { if (sceneInfo[i].type === 'sticky') { sceneInfo[i].scrollHeight = sceneInfo[i].heightNum * window.innerHeight; } else if (sceneInfo[i].type === 'normal') { sceneInfo[i].scrollHeight = sceneInfo[i].objs.container.offsetHeight; } sceneInfo[i].objs.container.style.height = `${sceneInfo[i].scrollHeight}px`; } // 새로고침 해도 씬이 고정되게 세팅 yOffset = window.pageYOffset; let totalScrollHeight = 0; for (let i = 0; i < sceneInfo.length; i++) { totalScrollHeight += sceneInfo[i].scrollHeight; if(totalScrollHeight >= yOffset) { currentScene = i; break; } } document.body.setAttribute('id', `show-scene-${currentScene}`); const heightRatio = window.innerHeight / 1080; // 디바이스 높이에 따라 이미지 조정 sceneInfo[0].objs.canvas.style.transform = `translate3d(-50%, -50%, 0) scale(${heightRatio})`; sceneInfo[2].objs.canvas.style.transform = `translate3d(-50%, -50%, 0) scale(${heightRatio})`; // translate3d로 가운데 정렬 후 scale로 이미지 크기 조정 } function calcValues(values, currentYOffset) { let rv; // 현재 씬(스크롤섹션)에서 스크롤 된 범위를 0~1 사이의 비율로 구하기 const scrollHeight = sceneInfo[currentScene].scrollHeight; const scrollRatio = currentYOffset / scrollHeight; if (values.length === 3) { // start ~ end 사이에 애니메이션 실행 const partScrollStart = values[2].start * scrollHeight; const partScrollEnd = values[2].end * scrollHeight; const partScrollHeight = partScrollEnd - partScrollStart; if(currentYOffset >= partScrollStart && currentYOffset <= partScrollEnd) { rv = (currentYOffset - partScrollStart) / partScrollHeight * (values[1] - values[0]) + values[0]; } else if (currentYOffset < partScrollStart) { rv = values[0]; } else if (currentYOffset > partScrollEnd) { rv = values[1]; } } else { rv = scrollRatio * (values[1] - values[0]) + values[0]; } return rv; } function playAnimation() { const objs = sceneInfo[currentScene].objs; const values = sceneInfo[currentScene].values; const currentYOffset = yOffset - prevScrollHeight; // 현재 씬에서 얼만큼 스크롤했는지를 확인 const scrollHeight = sceneInfo[currentScene].scrollHeight; // const scrollRatio = yOffset / 현재 씬의 scrollHeight; const scrollRatio = currentYOffset / scrollHeight; switch (currentScene) { case 0: // console.log('0 play'); let sequence = Math.round(calcValues(values.imageSequenc, currentYOffset)); objs.context.drawImage(objs.videoImages[sequence], 0, 0); objs.canvas.style.opacity = calcValues(values.canvas_opacity, currentYOffset); if (scrollRatio <= 0.22) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.42) { // in objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.62) { // in objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.82) { // in objs.messageD.style.opacity = calcValues(values.messageD_opacity_in, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageD.style.opacity = calcValues(values.messageD_opacity_out, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_out, currentYOffset)}%, 0)`; } break; case 2: // console.log('2 play'); let sequence2 = Math.round(calcValues(values.imageSequenc, currentYOffset)); objs.context.drawImage(objs.videoImages[sequence2], 0, 0); if (scrollRatio <= 0.32) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.67) { // in objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } else { // out objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } if (scrollRatio <= 0.93) { // in objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } else { // out objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } break; case 3: // console.log('3 play'); break; } } function scrollLoop() { enterNewScene = false; prevScrollHeight = 0; for (let i = 0; i < currentScene; i++) { prevScrollHeight += sceneInfo[i].scrollHeight; } if (yOffset > prevScrollHeight + sceneInfo[currentScene].scrollHeight) { enterNewScene = true; currentScene ++; document.body.setAttribute('id', `show-scene-${currentScene}`); } if (yOffset < prevScrollHeight) { enterNewScene = true; if(currentScene === 0) return; // 브라우저 바운스 효과로 인해 마이너스가 되는 것을 방지 (모바일) currentScene --; document.body.setAttribute('id', `show-scene-${currentScene}`); } if (enterNewScene) return; playAnimation(); } window.addEventListener('scroll', () => { yOffset = window.pageYOffset; scrollLoop(); }); // window.addEventListener('DOMcontentLoaded', setLayout) 이미지가 업로드 되기 전에 실행 window.addEventListener('load', () => { setLayout(); sceneInfo[0].objs.context.drawImage(sceneInfo[0].objs.videoImages[0], 0, 0); }); window.addEventListener('resize', setLayout); setCanvasImages(); })();
-
애플 웹사이트 인터랙션 클론!
안녕하세요 에러가 나오는데 어떻게 해결해야되나요?
삭제된 글입니다
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
Mongodb
Mongo db 와 연결이 안되는지 npm run dev 를 입력하면 에러가 나는데 어떻게해야하나요ㅠㅠ
-
미해결[OpenCV] 파이썬 딥러닝 영상처리 프로젝트 2 - 불량사과를 찾아라!
소스코드는 어디서 다운로드 받나요?
소스코드는 어디서 다운로드 받나요?
-
미해결비전공자를 위한 개발자 취업 개론
데이터사이언티스트
안녕하세요~ 강의를 듣다가 궁금해서 글을 올려봅니다~ 데이터사이언티스트와 빅데이터 쪽은 다른건가요?? 강의에서 반년정도 공부하면 데이터 사이언티스트가 가능하다고 하셨는데 빅데이터쪽은 신입을 거의 안뽑는걸로 알고 있어서요 ~ 그리고 강의 들으면서 차근차근 알아가서 너무 좋습니다! 너무 많은 양의 정보들이 있어 뭐가 맞고 그른지 알 수 없었는데 선생님 강의를 듣고 명확해지고 있습니다~ 감사합니다^^
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JdbcMemberRepository에서 import 문제
선생님 안녕하세요. 우선 정말 이 수업을 개설해 주셔서 정말정말 감사하다는 말씀 드립니다. 프로젝트 수업으로 스프링 프레임워크에서 스트레스를 엄청 받다가 선생님의 강의를 듣고 한줄기 희망이 생겼습니다!!! 지금 DB 파트 강의에서 순수 JDBC 듣는 중인데, 원래는 오라클 SQL을 사용하려다 import 하는 부분에서 막히길래, 역시 강의와 다른 걸 쓰려니 힘들구나 싶어서ㅜㅜ 우선은 그냥 수업에서 사용하시는 H2로 다시 시도하고 원리를 좀 깨친 다음에 오라클로 재시도 하려 했습니다만.... 결국은 똑같은 곳에서 문제가 생기길래 이렇게 질문을 드립니다. H2에서 DB 생성하고, build.gradle에서 의존성 주입했고, application.properties에 url, driver-class-name까지 설정은 완료한 상태입니다. 그러고나서 JdbcMemberRepository 코드를 작성했는데, 이상하게 이 부분만 import에서 오류가 생깁니다. import org.springframework.jdbc.datasource.DataSourceUtils;(밑줄 친 부분에 오류가 있다고 빨간 줄이 생김) 에러메시지는 "The import org.springframework.jdbc cannot be resolved" 라고 뜨고, 클래스를 새로 생성하라는 식으로만 나오고 있습니다 ㅜㅜ 강제로 실행시키면 다음 메시지가 나옵니다. "Description:Parameter 0 of constructor in hello.hellospring.SpringConfig required a bean of type 'javax.sql.DataSource' that could not be found. The following candidates were found but could not be injected: - Bean method 'dataSource' in 'JndiDataSourceAutoConfiguration' not loaded because @ConditionalOnClass did not find required class 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' - Bean method 'dataSource' in 'XADataSourceAutoConfiguration' not loaded because @ConditionalOnClass did not find required class 'javax.transaction.TransactionManager' Action: Consider revisiting the entries above or defining a bean of type 'javax.sql.DataSource' in your configuration. " 사용 환경은 윈도10 / Eclipse EE / Spring boot 2.3.3. 입니다.수업을 착실히 들었다고 생각했는데 혹시 설정 같은 걸 빼먹은 게 아닌지 싶은데, 구글링해도 답을 얻을 수 없어 여쭤봅니다. 감사합니다 !!
-
미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL
Window 함수를 이용한 누적 합 문의
안녕하세요. 좋은 강의 잘 들었습니다. window 관련한 누적 합 문의 드립니다. 예를들어 A, B, C 모델의 일별 판매량을 누적으로 구하고자 합니다. 1일 : 2개 , 1개, 2개 2일 : 2개 , 2개, 2개 3일 : 0개, 0개, 0개 4일 : 0개, 1개, 2개 각각 A B C의 판매량이 있을때, partition 모델명, order 날짜로 하면 - 중간에 0이 모두 있는 곳 혹은 - A라는 모델만 추출했으때 3일과 4일은 누적합의 리스트에 나오지 않는데.. 이를 해결하기 위한 팁이 있나요? 중간에 판매가 0이라도 전일 누적값이 그대로 출력되어 표현하고 싶습니다.
-
해결됨단 두 장의 문서로 데이터 분석과 시각화 뽀개기
시계열 데이터 전처리 질문입니다.
강사님 replace 설명중에([5/25] 시계열 데이터 전처리4:40) 에 string이 다 일치 하지 않는 다고 설명하셨는데, 자세하게 설명 부탁합니다. 해당 날짜는 전부 object 로 보여지는데, 그렇지 않아서 앞에 str를 붙인다고 하시니 이해가 되지 않아서요. 답변 미리 감사드리고 건강 조심하세요.