묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Firebase 서버를 통한 Android앱 개발 지침서
Database 에서 버전이 바뀌면서 코드도 바껴서 적어 드려요
taskSnapshot.getDownloadUrl(); 이코드가 없어졌어요 그래서 업로드한 경로를 알려면 Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() { @Override public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception { if (!task.isSuccessful()) { throw task.getException(); } // Continue with the task to get the download URL return riversRef.getDownloadUrl(); }}).addOnCompleteListener(new OnCompleteListener<Uri>() { @Override public void onComplete(@NonNull Task<Uri> task) { if (task.isSuccessful()) { Toast.makeText(UploadActivity.this, "업로드 성공", Toast.LENGTH_SHORT).show(); //파이어베이스에 데이터베이스 업로드 @SuppressWarnings("VisibleForTests") Uri downloadUrl = task.getResult(); ImageDTO imageDTO = new ImageDTO(); imageDTO.setImageUrl(downloadUrl.toString()); imageDTO.setTitle(etTitle.getText().toString()); imageDTO.setDescription(etDesc.getText().toString()); imageDTO.setUid(mAuth.getCurrentUser().getUid()); imageDTO.setUserId(mAuth.getCurrentUser().getEmail()); //image 라는 테이블에 json 형태로 담긴다. //database.getReference().child("Profile").setValue(imageDTO); // .push() : 데이터가 쌓인다. database.getReference().child("Profile").push().setValue(imageDTO); Intent intent = new Intent(getApplicationContext(), UserActivity.class); startActivity(intent); } else { // Handle failures // ... } }}); Uri downloadUrl = task.getResult(); 이 코드를 쓰면 됩니다.
-
미해결[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발
안녕하세요 . FIltering 관련해서 질문이 있습니다.!
안녕하세요. 우선 좋은 강의 감사드립니다.! 프로그래밍으로 제어하는 Filtering 방법 강의를 보다가 궁금한 점이 생겼는데, 이렇게 따로 필터링을 적용한 방법과 단순히 DTO를 따로 만들어서 객체를 리턴해주는 것과 기술적으로 차이점이 있을까요? 예를들어서 예제처럼 password만 제외하고 값을 받고 싶으면 @Getter@Setterpublic class UserDto { private Integer id; private String name; private Date joinDate; private String ssn;} 이렇게 DTO를 만들어서 DTO객체를 리턴해주는 방법과 어떤 차이점이 있는지 궁금합니다.!
-
미해결애플 웹사이트 인터랙션 클론!
강사님 질문있어서 문의드립니다!
첫번째 문제 발생현상 : 새로고침 했을 경우 간혈적으로 이런 에러 문구가 출력이 됩니다. 섹션0부분에 이미지파일은 눈으로 봤을땐 정상적으로 출력된 상황입니다. 에러문구는 하단에 붙히겠습니다. main.js:258 Uncaught TypeError: Failed to execute 'drawImage' on 'CanvasRenderingContext2D': The provided value is not of type '(CSSImageValue or HTMLImageElement or SVGImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap or OffscreenCanvas)' at playAnimation (main.js:258) at scrollLoop (main.js:364) at main.js:368 두번째 문제 발생현상 : 이것도 간혈적으로 출력되는 문제이며 main.js:352 Uncaught TypeError: Cannot read property 'scrollHeight' of undefined at scrollLoop (main.js:352) at main.js:368 이러 한 문구가 출력이 됩니다. 정말 죄송하지만 제 코드한번 봐주실수 있을까요?? (() => { let yOffset = 0; //window.pageYOffset 대신 쓸 변수 let prevScrollHeight = 0; // 현재 스크롤 위치(yOffset)보다 이전에 위치한 스크롤 섹션들의 스크롤 높이값의 합 let currentScene = 0; // 현재 활성화된(눈 앞에 보고있는) 씬(scroll-section) let enterNewScene = false; // 새로운 scene이 시작된 순간 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, imageSequence: [0, 299], 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 }], 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'), content: document.querySelector('#scroll-section-1 .description') } }, { // 2 type: 'sticky', heightNum: 5, 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') }, values: { 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, scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-3'), canvasCaption: document.querySelector('.canvas-caption') }, values: { } } ]; function setCanvasImages() { for (let i = 0; i < sceneInfo[0].values.videoImageCount; i++) { imgElem = new Image(); imgElem.src = `./video/001/IMG_${6726 + i}.JPG`; sceneInfo[0].objs.videoImages.push(imgElem); } } setCanvasImages() 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.content.offsetHeight + window.innerHeight * 0.5; } 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}`); } function calcValues(values, currentYOffset) { let rv; //현재 씬(스크롤섹션)에서 스크롤된 범위를 비율로 구하기 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 = currentYOffset / scrollHeight; switch (currentScene) { case 0: let sequence = Math.round(calcValues(values.imageSequence, currentYOffset)); objs.context.drawImage(objs.videoImages[sequence], 0, 0); 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'); 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) { if (currentScene === 0) return // 브라우저 바운스 효과로 인해 마이너스가 되는 것을 방지(모바일) enterNewScene = true; 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); window.addEventListener('resize', setLayout); })();
-
미해결풀스택을 위한 탄탄한 프런트엔드 부트캠프 (HTML, CSS, 바닐라 자바스크립트 + ES6) [풀스택 Part2]
section 클래스
강의에서는 section 태그안에 따로 main 클래스를 정의하셔서 section 태크에는 기본 css 적용 후 main 클래스에 배경 이미지의 css 적용을 하셨는데 main클래스에 적용한 css를 section 태그에 같이 적용해도 상관없는건가요? 차이점이 궁금해서 질문드립니다!! 그리고 지나간 부분이지만 header 태크 css 부분에서 top:0 과 left:0 은 어떠한 이유로 적용한지 알 수 있을까요? (p.s 좋은 강의 잘 수강하고 있습니다!)
-
미해결Vue.js 끝장내기 - 실무에 필요한 모든 것
로그아웃을 직접 누르지 않고 싸이트를 나가는 경우
로그아웃을 직접 누르지 않고 싸이트를 종료 시키면 쿠키에는 계속 정보가 남아서 로그인 상태가 계속 유지되는데 이를 막기 위해서는 실무에서는 보통 어떤 방법을 쓰나요? 생각할 수 있는 방법은 프론트에서 쿠키 만료시간을 쓰거나, 백엔드에서 토큰 만료시간을 정하던가 할 것 같습니다.
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
Random Forest Regressor에 보스턴 데이터셋 실습시킬때 질문
안녕하세요 강의 보는 중에 이전 회귀 모델이나 descion tree 모델을 학습시킬때에는 dataset을 train_test_split를 통해서 train_set, test_set으로 나눴지만 Random Forest Regressor 모델을 학습 시킬 때에는 X_data, y_target에 대해서 train_set, test_set으로 나누지 않는 이유가 있나요? 혹시 그 이유가 Random Forest Regrssor에 bootstrap기법때문인가요?
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
수업에서 이론에 대한 부분이 이해가 잘 안됩니다
안녕하세요. 비전쪽 공부를 하고 싶어서 인공지능에 무지하지만 먼저 신청해서 들었습니다 그런데, 실습은 어느정도 따라가고 하는데 RCNN 처음부터 이론에 대한 이해가 많이 부족한 것 같습니다 머신러닝 강의도 신청을 했는데, 이 강의를 들어야만 이론에 대한 이해가 조금 될까요? 감사합니다
-
누구나 할 수 있는 안드로이드 앱 개발 - 1 (Kotlin)
버튼을 눌러도 왜 토스트 메시지는 안나올까요??
삭제된 글입니다
-
미해결스프링 프레임워크 핵심 기술
강의 하시면서 사용하는 resolving 이란 단어는 어떤 의미인가요?
강의 잘 듣고 있습니다. :)강의하시면서 사용하시는 resolving 이란 단어는 어떤 의미로 사용하고 계신지 여쭤봐도 될까요? 감사합니다.
-
미해결파이썬 입문 및 웹 크롤링을 활용한 다양한 자동화 어플리케이션 제작하기
download2-8-1.py 질문입니다.
안녕하세요 현재 download2-8-1.py에서 진행되고있는 네이버 이미지 태그들이 다 바뀐거같아서 질문드립니다. 바뀐 태그에 맞게 선택자를 사용하여 img_list 저장했습니다. img_list = soup.select("div.tile_item > div.thumb > img") 바뀐태그로 넣었음에도 img_list 변수에 공백 리스트로 리턴됩니다. 확인 부탁드립니다 ㅠㅠ opener = req.build_opener() opener.addheaders = [('User-agent', 'Mozilla/5.0')] req.install_opener(opener) 추가해도 안되네요...
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
[사진첨부]하기 질문 관련
사진과 같이 한도가 32 인데도, vm을 알려주신 대로 생성하면 한도가 0이라고 에러가 뜹니다..
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
vs2019에 내장된 함수에 관하여 문의드리고 싶습니다.
수업 중에서 사용하셨던 Math 와 같이 제가 따로 제작한 것이 아니라 이미 완성되어 내장되어 있는 클래스들 목록을 확인하고 어떤 기능을 하는 지 훑어보고 싶은데 어떤 식으로 접근을 해야할 지 몰라 수업 내용과 거리가 있지만 질문드려 봅니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
findById 메소드에서 Optional 처리가 마무리가 안된것 아닌가요??
id로 찾은값이 null 인 경우를 대비해서 Optional로 반환받았는데.. 여기서 마무리하면 null 처리가 제대로 안된거 아닌가요?? 아래처럼 orElse(...) 까지 해줘야 null 처리가 마무리 되는거 아닌가요?? Optional 을 처음 접하는 초보입장에서 질문드립니다 ㅠ Optional.ofNullable(store.get(id)).orElse(...)
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
할당량 초기값
안녕하세요, 이미 현재한도가 32로 돼있던데.. 그럼 다시 1로 낮춰서 요청안해도 되나요..?
-
미해결Vue.js 시작하기 - Age of Vue.js
vscode import Vue부분에 경고문이 뜨네요
vscode plugin관련 질문인데, 제 화면에서는 import 부분이 경고 표시가 뜨네요. Vetur에서 tsconfig.json 등을 설정하라는데 vue-cli폴더에 세팅해주면 되는걸까요?
-
미해결React & Express 를 이용한 웹 어플리케이션 개발하기
codepen.io 에 퀵에드가 없는데요ㅜㅜ
초보라서 잘몰라서 그런가봐요.코드펜에 들어가서 자바스크립트 js 클릭하고 바벨로 설정하고 퀵에드로 리엑트랑 돔 넣으려고 하는데 없어요ㅜㅜ어떻게 하죠?
-
미해결문과생도, 비전공자도, 누구나 배울 수 있는 파이썬(Python)!
수업자료
수업자료를 다운을 받고 했고 옮겼는데 다음에는 어떻게 해야 강의에 나오는 것처럼 목차가 나오게 할 수 있나요?
-
미해결우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
wait의 done(), not_done() 그리고 as_completed의 cancelled 질문입니다!
안녕하세요! 우선 새해 복 많이 받으세요! 다름이 아니라 as_completed의 cancelled 메소드에 대해서 몇 가지 궁금한게 있습니다! 1. wait 같은 경우에는 설정한 timeout을 초과하는 작업에 대해서는 not_done()으로 출력해줄 수 있고 취소된 작업이 뭔지 확인할 수 있습니다! 그렇다면 as_completed는 애초에 구현되는 과정이 WORK_LST의 work들을 submit해서 append해준 futures_lst 리스트안에 담긴 작업들을 다시 for문으로 돌려서 작업들 중 시간이 적게 걸리는 작업들을 자동적으로 파악해서 알아서 시간이 적게 걸리는 작업들 순으로 동시성을 수행해주는 건가요? 2. 1번에서 설명드렸던과 같이 어쨋든 as_completed는 작업이 적게 걸리는 순으로 작업을 해준다고 한 것이고 결과적으로 작업이 엄청나게 많은 시간이 걸려도 어쨋든 '모든 작업을 완료' 한다는 점에서 wait와는 다르다고 판단됩니다(wait는 timeout 설정을 해주니깐요!) 그렇다면 as_completed에서 cancelled 메소드는 어떤 이유로 존재하는 건가요? cancelled 메소드가 취소된 작업이 무엇인지 알려주기 위한 것인데, 시간이 아무리 오래 걸리는 작업도 '수행 완료' 상태는 되기 마련인데, 그렇다면 모든 작업들에 대해 cancelled는 False일 거고... cancelled 메소드의 존재 이유가 궁금합니다! 3. 마지막으로 wait의 done(), not_done()에 대한 질문인데요! 다음과 같이 done()된 작업들, not_done()된 작업들 결과물로 이렇게 표시가 되는데, <Future at ~~~ > 이런식으로 나오는 표기를 보고 수행된 또는 중지된 작업들이 구체적으로 '내가 만든 어떤 작업'인지 어떻게 알 수 있나요..? 메모리 id(0x7fa~~같은 값들)를 보고 알아차려야 하나요?
-
미해결함수형 프로그래밍과 JavaScript ES6+
설정방법
질문에 앞서 새해 인사드립니다. 선생님~ 2021년 대박나시고 좋은 일 많으시길 기도합니다!!! 구글링 해봤는데 실력이 없어서 원하는 방법을 찾지 못해서 선생님께 질문드립니다. 강의 중 log로 console.log를 대체해서 사용하셔서 궁금했는데요. 저와같은 궁금으로 질문을 하신 분의 글에 선생님께서 const log = console.log; 이렇게 할당해서 사용하신다는 답변 글을 봤습니다. 그럼, 콘솔 창 최상단에 선언해서 사용하시는 건가요? 아니면, webstorm이나 크롬 devtool에 추가로 설정해서 사용하시는 건가요? 읽어주셔서 감사합니다!!!
-
미해결스프링 핵심 원리 - 기본편
@Configuration에 관한 질문입니다.
@Configuration 에노테이션 없이 싱글톤이 보장되지 않는다는 것을 테스트코드로 확인하기 위해서 테스트코드 작성을 하였습니다. 그런데 테스트코드를 실행하니 @Configuration이 없음에도, Singleton으로 생성한다는 문구가 보이고, 테스트코드 또한 실패하였습니다. 무엇이 원인인지 잘모르겠습니다..