묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
카프카 커넥트 서버 기동시 발생하는 오류
안녕하세요 선생님, 좋은 강의 잘 듣고 있습니다. 오늘은 카프카 커넥션 서버 기동시 발생하는 오류가 있어 질문드립니다. 우선, 발생하는 오류에 대한 로그 정보는 아래와 같습니다. log4j:ERROR Could not read configuration file from URL [file:C:/kafka_demo/confluent-6.1.0/config/tools-log4j.properties]. java.io.FileNotFoundException: C:\kafka_demo\confluent-6.1.0\config\tools-log4j.properties (지정된 경로를 찾을 수 없습니다) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:219) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:112) at java.base/sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:86) at java.base/sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:184) at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:557) at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:526) at org.apache.log4j.LogManager.<clinit>(LogManager.java:127) at org.slf4j.impl.Log4jLoggerFactory.<init>(Log4jLoggerFactory.java:66) at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72) at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45) at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150) at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124) at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:417) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:388) at org.apache.kafka.connect.cli.ConnectDistributed.<clinit>(ConnectDistributed.java:57) log4j:ERROR Ignoring configuration file [file:C:/kafka_demo/confluent-6.1.0/config/tools-log4j.properties]. log4j:WARN No appenders could be found for logger (org.apache.kafka.connect.runtime.WorkerInfo). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.LoggingResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.LoggingResource will be ignored. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource will be ignored. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.ConnectorPluginsResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.ConnectorPluginsResource will be ignored. 4월 22, 2021 10:13:57 오후 org.glassfish.jersey.internal.inject.Providers checkProviderRuntime WARNING: A provider org.apache.kafka.connect.runtime.rest.resources.RootResource registered in SERVER runtime does not implement any provider interfaces applicable in the SERVER runtime. Due to constraint configuration problems the provider org.apache.kafka.connect.runtime.rest.resources.RootResource will be ignored. 4월 22, 2021 10:13:58 오후 org.glassfish.jersey.internal.Errors logErrors WARNING: The following warnings have been detected: WARNING: The (sub)resource method listLoggers in org.apache.kafka.connect.runtime.rest.resources.LoggingResource contains empty path annotation. WARNING: The (sub)resource method createConnector in org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource contains empty path annotation. WARNING: The (sub)resource method listConnectors in org.apache.kafka.connect.runtime.rest.resources.ConnectorsResource contains empty path annotation. WARNING: The (sub)resource method listConnectorPlugins in org.apache.kafka.connect.runtime.rest.resources.ConnectorPluginsResource contains empty path annotation. WARNING: The (sub)resource method serverInfo in org.apache.kafka.connect.runtime.rest.resources.RootResource contains empty path annotation. 위 로그를 보고 confluent-6.1.0 폴더에 config\tools-log4j.properties 라는 파일이 없어 이 문제가 발생한다고 생각 했습니다. 그래서 카프카 서버를 설치한 곳에 있는 \config\tools-log4j.properties 파일을 복사해 생성해주었지만 또 다른 오류가 발생하고 해결이 되지 않았습니다. 하지만, 동작은 선생님께서 하신 실습처럼 정상적으로 동작합니다. 다만 로그가 발생하지 않고 있습니다. 검색을 해봤지만 해결하지 못해 도움 부탁드립니다.
-
미해결자바(javafx) 실전 데스크탑앱 프로젝트 - 유튜브관리앱
에러가 떠요
강의보고 똑같이 따라햇는데 오류가 떠요 Error occurred during initialization of boot layer java.lang.module.FindException: Module JavaFXTutorial1 not found
-
미해결파이썬 무료 강의 (활용편1) - 추억의 오락실 게임 만들기 (3시간)
"pip install pygame"이라고 입력했을 때 오류가 뜹니다.
"pip install pygame"이라고 입력했을 때 아래와 같은 오류가 뜹니다. pip : 'pip' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다. 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올바른지 검증한 다음 다시 시도하십시오. 위치 줄:1 문자:1 + pip install pygame + ~~~ + CategoryInfo : ObjectNotFound: (pip:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException 어떤 문제이고, 어떻게 해야 해결할 수 있을까요?
-
미해결크롤링으로 웹, 텔레그램봇, REST API, 모바일 앱 만들기
flutter를 이용하여 모바일 앱 만들기
마지막 강의 'flutter를 이용하여 모바일 앱 만들기' 중 3분 경의 코드 따라 작성해보았는데요. 작성한 코드 class MyApp extends StatelessWidget { fetchMonitors() async { var response = await http.get('생성한 URL'); print(response.body); } 아래와 같은 오류 메세지가 나타납니다. lib/main.dart:10:35: Error: The argument type 'String' can't be assigned to the parameter type 'Uri'. - 'Uri' is from 'dart:core'. 이 문제는 어떻게 해결하면 좋을지 도움 주시면 감사하겠습니다.
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
최적 하이퍼 파라미터 질문
params = { 'n_estimators': [100, 500], 'learning_rate': [0.05, 0.1] } 이 부분에서 [100, 500] 100에서 500으로 변경한다는 뜻인가요? 아니면, 100과 500을 모두 넣고 최적 하이퍼 파라미터를 찾는다는 뜻인가요? 답변 미리 감사드립니다.
-
미해결스프링 핵심 원리 - 기본편
@RequiredArgsConstructor 와 @Autowired
@RequiredArgsConstructor가 final이 붙은 필드를 모아 생성자를 자동으로 만들어 주는것은 알겠습니다. 그런데, @RequiredArgsConstructor가 @Autowired까지 생성자에 자동으로 붙여주는것인지 아니면, @RequiredArgsConstructor가 생성한 생성자가 한개여서 @Autowired를 springcontainer가 처리하는것인지 궁금합니다.
-
미해결[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
강의 9분 18초 중 이해가 어려운 부분이 있습니다ㅠㅠ
강사님 안녕하세요:) 드디어 끝이 보이네요! 좋은강의 정말 감사합니다! 덕분에 포기하지 않고 끝까지 잘 듣고 있습니다:) 강의 9분 18초 쯤에 이해가 어려운 부분이 있어서요, start, num = 1, 0 은 함수 밖에 선언되어 있기 때문에 if 안에 들어간 for문이 끝나더라도 101부터 시작되는건가요? 반복해서 듣고 생각해봤는데 이해가 어려워서요ㅠㅠ
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
안녕하세요 영한님 수업자료 공개에 대해 여쭤봅니다.
안녕하세요 영한님? 양질의 좋은 강의 찍어주셔서 아주 유익하게 보고있습니다. 다름이 아니라 혹시 제가 운영하고있는 기술블로그에 이 강의에서 배운 내용을 정리하고 싶은데 수업자료를 캡처해서 올려도 될까요? 혹 된다면 출처는 어떤식으로 밝히면 되는지 여쭤보고 싶습니다. 예를 들면 인프런 - 김영한의 모든 개발자를 위한 HTTP 웹 기본지식. 이런식으로요. 감사합니다!
-
미해결파이썬 증권 데이터 수집과 분석으로 신호와 소음 찾기
Nbextensions 설치관련 문의드립니다.
안녕하세요. 강사님. Nbextensions 설치관련 문의드립니다. 기존 사용하고 있는 jupyter 노트북에 Nbextensions를 추가 설치를 했는데 첨부된 사진과 같이 Nbextensions 탭은 생성이 되었지만 Table of Contents (2) 는 보이지가 않습니다.
-
미해결Slack 클론 코딩[실시간 채팅 with React]
key 에러로 스크롤 오류가 발생합니다 ㅜㅜ
스크롤을 맨 위로 올리면, 기존에 있던 똑같은 섹션이 한번 더 나와서 키가 중복됐다고 나오는데, 코드는 똑같이 친 것 같은데 뭐가 문제인지 모르겠습니다.. ㅜㅜ 깃헙주소 첨부하겠습니다.. https://github.com/97baek/sleact
-
미해결스프링 핵심 원리 - 기본편
자바 코드관련 질문
안녕하세요. 스프링 핵심 원리 이해1 - 예제 만들기의 예제 코드관련하여 질문이 있습니다. OrderApp 클래스에서 아래와 같이 2개의 객체를 생성하게 되면, MemberService memberService = new MemberServiceImpl(); OrderService orderService = new OrderServiceImpl(); 한번은 MemberServiceImpl()에 의해서, private final MemberRepository memberRepository = new MemoryMemberRepository();가 수행되면서 MemoryMemberRepository객체가 생성되고, 두번째로 OrderServiceImpl()에 의해서 private final MemberRepository memberRepository = new MemoryMemberRepository();가 또 수행되면서 MemoryMemberRepository객체가 또 생성되는거로 보이는데요. 첫번째 객체의 MAP store 변수가 static으로 되어있기 때문에 메모리 저장소는 공유하는 것으로 보이는데요. 질문1 : 실제로 메모리상 객체는 어떻게 생성되고, store변수는 어떻게 공유되는지 궁금합니다. 질문2 : private final을 쓰는 이유는? 그 의미는? ※ 자바 기본과정도 공부해봤고, 여기저기 물어봐도 잘 아는 분들이 없네요^^
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
양방향 연관관계에서의 편의 메서드
강의중, 연관관계 편의 메서드는 연관관계의 주인으로 설정된 엔티티에서 형성하는 것이 좋다고 하셨는데 Order 엔티티에 //연관관계 메서드public void setMember(Member member) { this.member = member; member.getOrders().add(this);}public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this);}public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this);} 이렇게 메서드를 구성했습니다. 그러나 Order - OrderItem 두 엔티티가 갖는 연관관계에서 주인은 OrderItem입니다. 그렇다면 Order에 .addOrderItem()을 없애고 OrderItem 엔티티에 public void setOrder(Order order){ this.order = order; order.getOrderItems().add(this);} 위와 같은 편의 메소드를 추가하는것이 맞지 않을까 질문합니다!
-
미해결실전! Querydsl
alias 질문드립니다 !
안녕하세요. 비전공 개발공부 8개월차 주니어입니다. 먼저 정말 유익한 강의 감사드립니다. 제게 큰 도움이 됐습니다. 다름아니고 질문드릴게 있는데요, 퇴근 후 QueryDSL로 토이프로젝트를 하고있습니다. 일별 방문자 수와, 누적 방문자 수 통계를 구하고 있는데요. 우선 제가 작성한 쿼리입니다. SELECT SUM(R.C) FROM (SELECT COUNT(DISTINCT CLIENT_IP) AS C FROM REQUEST_LOG GROUP BY DATE(REG_DATE) ) AS R; 쿼리 의도입니다. 1. 로깅테이블(REQUEST_LOG)에서 일별로 그룹핑하고, 클라이언트 IP로 중복을 제거한 값을 구합니다. (일별 방문자) 2. 일별 방문자를 모두 더합니다. (누적 방문자) 이걸 QueryDSL로 옮기려니 표현식과 alias를 쓰기가 막막한 느낌이 있습니다. 제가 참고한 문서와 작성한 코드입니다. http://www.querydsl.com/static/querydsl/3.6.3/reference/ko-KR/html_single/#alias @Override @Transactional(readOnly = true) public Long allVisitors() { JPAQueryFactory queryFactory = new JPAQueryFactory(getEntityManager()); return queryFactory .select(requestLog.clientIp.countDistinct()) .from(requestLog) .groupBy(functionDate(requestLog.regDate)) .fetch() .stream() .reduce(0L, Long::sum); } private StringTemplate functionDate(DateTimePath regDate) { return stringTemplate("date({0})", regDate); } 결국 alias를 어떻게 쓸지 잘 알지 못해 우선 서브쿼리를 포기하고 단순 select 문으로 일별 방문자수를 구해온 후 어플리케이션에서 stream으로 일별 방문자수를 모두 더해 누적 방문자수를 구해서 구현했습니다. 근데 그냥 자바코드없이 QueryDSL만을 이용해서 쿼리한방에 끝내고 싶지만 방법을 잘 알지 못해 어떻게 해결해야 할지 계속 고민중입니다. 혹시 실례가 안된다면 간단한 예제코드나 힌트 좀 주실 수 있으실까요? 😥 전체적인 소스코드 주소입니다. https://github.com/shirohoo/Application-SubscribeTechBlogs
-
미해결애플 웹사이트 인터랙션 클론!
opacity_out 질문입니다
messageA_opacity_out이 실행이 안 되고 scrollRatio가 2.5일때 messageA가 사라집니다 (function () { let yOffset = 0; //window.pageYOffset 대신 쓸 변수 let prevScrollHeight = 0; //현재 스크롤 위치(yOffset)보다 이전에 위치한 스크롤 섹션들의 스크롤 높이값의 합 let currentScene = 0; //눈앞에 보고 있는 씬 let enterNewScene = false; //새로운 scene이 시작된 순간 true const sceneInfo = [ { //0 type: 'sticky', heightNum: 5, 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') }, values:{ messageA_opacity_in:[0,1,{start : 0.1, end: 0.2}], messageA_opacity_out:[1,0,{start : 0.25, end: 0.3}] } }, { //1 type: 'normal', heightNum: 5, scrollHeight: 0, objs:{ container:document.querySelector('#scroll-section-1') } }, { //2 type: 'sticky', heightNum: 5, scrollHeight: 0, objs:{ container:document.querySelector('#scroll-section-2') } }, { //3 type: 'sticky', heightNum: 5, scrollHeight: 0, objs:{ container:document.querySelector('#scroll-section-3') } } ]; //각 스크롤 섹션의 높이 세팅1 function setLayout() { for (let i = 0; i < sceneInfo.length; i++) { sceneInfo[i].scrollHeight = sceneInfo[i].heightNum * window.innerHeight; 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; //totalscrollheight가 yoffset 보다 커지면 현재 i를 currentscene으로 세팅하고 for문을 빠져나온다 if(totalScrollHeight >= yOffset){ currentScene = i; break; } } // 바디에다가 현재씬 갱신한 것 세팅,새로고침할 때 id를 잘 넣어준다 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 사이에 애니메이션 실행, values[2]는 start:0.1,end:0.2 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(){ //container에서 가져온것 const objs = sceneInfo[currentScene].objs; const values = sceneInfo[currentScene].values; //현재 씬의 yoffset,씬이 넘어가면 그 씬이 yOffset을 새로 세팅해준다 const currentYOffset = yOffset - prevScrollHeight; const scrollHeight = sceneInfo[currentScene].scrollHeight; // 현재씬에서 얼마나 스크롤 했는지 비율이 나온다 const scrollRatio = currentYOffset / scrollHeight; console.log(scrollRatio); switch(currentScene){ case 0: const messageA_opacity_in = calcValues(values.messageA_opacity_in,currentYOffset); const messageA_opacity_out = calcValues(values.messageA_opacity_out,currentYOffset); if(scrollRatio <= 0.22){ objs.messageA.style.opacity = messageA_opacity_in; } else{ objs.messageA.style.opacity = messageA_opacity_out; } break; case 1: break; case 2: break; case 3: break; } } //햔제 스크린이 몇번 씬에 있는지 알려줌2 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; // scene이 바뀌는 순간 -값을 방지 currentScene++; document.body.setAttribute('id',`show-scene-${currentScene}`) } if(yOffset < prevScrollHeight){ enterNewScene = true; // scene이 바뀌는 순간 -값을 방지 if(currentScene ===0) return; //위로 바운스효과 때문에(모바일) currentScene--; // 현재 씬에 맞춰서 바디에 아이디가 세팅된다,바뀌는 순간(resize)에만 체크 document.body.setAttribute('id',`show-scene-${currentScene}`) } //scene이 바뀌는 순간에 함수를 종료해서 playanimation이 한 턴 걸러진다 if(enterNewScene) return; playAnimation(); } // scroll해서 section을 넘어가면 currentScene[i]값이 실시간으로 바뀐다 window.addEventListener('scroll',function(){ yOffset = window.pageYOffset; scrollLoop(); }); window.addEventListener('load',setLayout); window.addEventListener('resize',setLayout); })();
-
미해결
intellij 파일 오류 해결 도와주세요
제가 원래는 이렇게 되어야 되는 파일을 무언가 잘못 만져서인지 계속 이렇게 떠서 어떻게 해야될지 모르겠네요 ㅠㅠㅠ 제발 도와주세요
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
부동 소수점의 지수부 표현 방법에 대하여
지수부는 unsigned라고 말씀해주셨는데요, 음수 지수는 사용되지 않는건가요??
-
미해결Slack 클론 코딩[실시간 채팅 with React]
타입스크립트에 질문드립니다.
자주 질문드려서 죄송합니다!! 타입스크립트를 활용하는 부분이 여기서 처음 나오는 것 같은데요. 제가 타입스크립트를 배웠을 때에는 추론이 되더라도 장점을 살리기 위해 왠만하면 다 붙여주는 것으로 알고 있습니다. 하지만 현재 프로젝트에서는 추론되어지는건 생략하고 추론되어지지 않는 부분만 타입스크립트를 사용하시는 것 같아서요. 혹시 이게 더 좋은 방법이고 현업에서도 이렇게 이루어지는지 궁금합니다! 마지막으로 한가지 더 질문드립니다. onChange같은 경우는React.ChangeEvent<HTMLInputElement> 을 활용하면 any를 사용하지 않고 오류를 발생하지 않는것으로 알고 있습니다. 밑에 코드처럼 이렇게 작성하면 되는지 궁금합니다! import { Dispatch, SetStateAction, useCallback, useState } from 'react'; const useInput = <T = any>( initialData: T, ): [T, (e: React.ChangeEvent<HTMLInputElement>) => void, Dispatch<SetStateAction<T>>] => { const [value, setValue] = useState(initialData); const handler = useCallback((e) => { setValue(e.target.value); }, []); return [value, handler, setValue]; }; export default useInput;
-
미해결풀스택을 위한 탄탄한 프런트엔드 부트캠프 (HTML, CSS, 바닐라 자바스크립트 + ES6) [풀스택 Part2]
babel.js 적용 후 개발자 도구에서 main.js 보이지 않는 현상
안녕하세요. index.html에 아래와 같이 바벨을 사용하도록 수정한 이후부터 크롬 개발자 도구에서 js/main.js가 보이지가 않습니다. <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-standalone/6.24.0/babel.js"></script> <script type="text/babel" src="js/main.js"></script> 아래는 강의 자료 파일을 그대로 GoLive로 띄웠을 때 화면입니다. 혹시 다른 설정을 확인해 봐야 할까요.
-
미해결타입스크립트 시작하기
4:44초
단방향과 양방향의 차이점이 무엇인지 조금만 더 알려주실 수 있으실까요 ? 또한 Orange가 값이 아닌 아이템의 이름이라는게 문자열과 enum안에서 선언된 Orange의 key값으로 === 비교를 해서 false가 출력이 되는게 맞는거죠 ? 보통 const enum을 사용하는 경우가 많을까요 아니면 그냥 enum으로 정의를 많이 하나요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Switch-case문에서 break가 없을 경우가 이해가지 않습니다.
좋은 강의 잘듣고있습니다! 다름이 아니라 이해가 안가는 부분이 있어서 질문 드립니다. 분기문 강의 25분쯤입니다. input이 ROCK인 상황에서 switch case를 사진과 같이 작성했을 시, 첫 case ROCK문에 break를 걸지 않았다 해도, 그다음 실행되는 코드는 case PAPER: 이라고 생각해서, 어짜피 "보를 냈습니다" 가 출력이 되지 않을 것 같은데, 왜 출력이 되는지 궁금합니다