묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨고객의 친구가 되기 위한 'UX Writing'
강의자료 요청드립니다.
제가 메일을 잃어버려서요.. 로 혹시 강의자료를 부탁드려도 될까요? 부탁드립니다.
-
미해결[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
6회 기출 -> 1유형 -> 2번 이처럼 풀이해도 될까요?
import pandas as pd df = pd.read_csv('data6-1-2.csv') # print(df.head()) df['전교생'] = df['1학년'] + df['2학년'] + df['3학년'] + df['4학년'] + df['5학년'] + df['6학년'] df['교사당학생수'] = df['전교생'] // df['교사수'] print(df.sort_values('교사당학생수', ascending=False)) # 19 답은 당연히 동일하게 나오는데요! iloc, loc 사용 않고 별도 컬럼 추가해주면서 계산하는 방식도 또 하나의 풀이 과정으로 볼 수 있겠죠?살짝 하드코딩 느낌이 나서 여쭤봅니다
-
해결됨
리액트 & 스프링 부트 SSE 알람 기능 구현 CORS에러
헌재 상황은 NGINX로 HTTPS로 백엔드를 배포하고 있고 리액트는 로컬에서 작업 중인데 알람 기능을 구현할 때 OPTIONS가 CORS에러를 일으킵니다.```@Service @RequiredArgsConstructor @Log4j2 @Transactional public class NotificationService { // SSE 이벤트 타임아웃 시간 private static final Long DEFAULT_TIMEOUT = 24L * 60 * 60 * 1000; // SSE 연결 타임아웃 (1일) private final CustomNotificationRepository customNotificationRepository; private final MemberRepository memberRepository; private final CommunityRepository communityRepository; private final NotificationRepository notificationRepository; // 메시지 알림 public SseEmitter subscribe(String memberEmail, String lastEventId) throws Exception { // 회원 조회 MemberEntity findMember = memberRepository.findByMemberEmail(memberEmail); // 매 연결마다 고유 이벤트 ID 부여 String eventId = makeTimeIncludeId(findMember); log.info("eventId {} ", eventId); // SseEmitter 생성후 Map에 저장 SseEmitter sseEmitter = customNotificationRepository.save(eventId, new SseEmitter(DEFAULT_TIMEOUT)); // 사용자에게 모든 데이터가 전송되었다면 emitter 삭제 sseEmitter.onCompletion(() -> { log.info("onCompletion callback"); customNotificationRepository.deleteById(eventId); }); // Emitter의 유효 시간이 만료되면 emitter 삭제 // 유효 시간이 만료되었다는 것은 클라이언트와 서버가 연결된 시간동안 아무런 이벤트가 발생하지 않은 것을 의미한다. sseEmitter.onTimeout(() -> { log.info("onTimeout callback"); customNotificationRepository.deleteById(eventId); }); // 503 에러를 방지하기 위한 더미 이벤트 전송 sendToClient(eventId, sseEmitter, "알림 서버 연결 성공 [memberId = " + findMember.getMemberId() + "]"); // 클라이언트가 미수신한 Event 목록이 존재할 경우 전송하여 Event 유실을 예방 if (hasLostData(lastEventId)) { sendLostData(lastEventId, findMember.getMemberId(), sseEmitter); } return sseEmitter; } private static @NotNull String makeTimeIncludeId(MemberEntity findMember) { String eventId = findMember.getMemberId() + "_" + System.currentTimeMillis(); return eventId; } private void sendToClient(String eventId, SseEmitter sseEmitter, Object data) { try { sseEmitter.send(SseEmitter.event() .name("connect") .id(eventId) .data(data)); } catch (IOException e) { customNotificationRepository.deleteById(eventId); throw new RuntimeException("알림 서버 연결 오류"); } } private boolean hasLostData(String lastEventId) { return !lastEventId.isEmpty(); } private void sendLostData(String lastEventId, Long memberId, SseEmitter sseEmitter) { Map<String, Object> eventCaches = customNotificationRepository.findAllEventCacheStartWithByMemberId(memberId); eventCaches.entrySet().stream() .filter(entry -> lastEventId.compareTo(entry.getKey()) < 0) .forEach(entry -> sendToClient(entry.getKey(), sseEmitter, entry.getValue())); } ...이렇게 서비스를 구현하고@RestController @RequestMapping("/api/v1/notify") @RequiredArgsConstructor @Log4j2 public class NotificationController implements NotificationControllerDocs { private final NotificationService notificationService; // 메시지 알림 // SSE 통신을 위해서는 produces로 반환할 데이터 타입을 "text/event-stream"으로 해주어야 함 @GetMapping(value = "/subscribe", produces = MediaType.TEXT_EVENT_STREAM_VALUE) @PreAuthorize("hasRole('ROLE_USER') or hasRole('ROLE_ADMIN')") public SseEmitter subscribe(@AuthenticationPrincipal UserDetails userDetails, @RequestHeader(value = "last-event-id", required = false, defaultValue = "") final String lastEventId, HttpServletResponse response) { try { if (userDetails == null) { throw new IllegalArgumentException("인증 정보가 필요합니다."); } response.setHeader("Connection", "keep-alive"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("X-Accel-Buffering", "no"); String email = userDetails.getUsername(); SseEmitter responseEmitter = notificationService.subscribe(email, lastEventId); log.info("Subscribed to email: " + email); log.info("response: " + responseEmitter); return responseEmitter; } catch (Exception e) { throw new RuntimeException(e); } } ...NGINX 설정server { listen 443 ssl; server_name meettify.store; ssl_certificate /etc/letsencrypt/live/meettify.store/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/meettify.store/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # SSE용 헤더 설정 location /api/v1/notify/subscribe { # OPTIONS preflight 요청을 처리하도록 설정 if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' 'http://localhost:5173' always; add_header 'Access-Control-Allow-Credentials' 'true' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type' always; add_header 'Access-Control-Max-Age' 3600 always; return 204; } proxy_pass https://meettify.store; # Spring Boot 서버로 요청 전달 proxy_http_version 1.1; proxy_set_header Connection ''; # SSE 연결 유지 proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ''; proxy_buffering off; proxy_cache off; chunked_transfer_encoding off; # SSE 연결 타임아웃 방지 proxy_set_header Cache-Control no-cache; proxy_read_timeout 86400s; keepalive_timeout 86400s; # 필요에 따라 시간 조정 add_header Access-Control-Allow-Origin "http://localhost:5173"; add_header Access-Control-Allow-Credentials "true"; } # 기본 프록시 설정 (백엔드 애플리케이션) location / { proxy_pass http://ubuntu-api-1:8080; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Connection ''; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection ''; proxy_buffering off; proxy_cache off; chunked_transfer_encoding off; } 이렇게 엔진엑스 설정까지 한다음@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:5173") .allowedHeaders("Authorization", "Content-Type") .allowCredentials(true) .exposedHeaders("Cache-Control", "Content-Type", "X-Accel-Buffering") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS"); } } 이렇게 설정했는데 계속 CORS에러가 발생합니다.해당 문제가 지속적으로 반복중입니다. ㅠㅠ
-
미해결
인프라,DevOps, 클라우드 직군 북스터디
스터디 주제 :인프라,DevOps, 클라우드 직군 북스터디스터디 목표 : 인프라,DevOps, 클라우드 직군 관련 북스터디를 합니다. (EX: 쿠버네티스, 도커, 테라폼 등)예상 스터디 일정(횟수) : 월요일 PM 9~10시 현재 테라폼 쿡북을 진행할 예정입니다. 책이 끝나면 조율을 한 후, 다른 책을 정합니다. 북스터디의 경우 챕터를 나눠 깃허브, 블로그에 매주 정리 후 디스코드 혹은 구글 MEET에서 전원 발표 및 기술적인 토의를 합니다. 매 책이 끝나면 전체 토의가 있습니다. 다른 진행 의견이 있으면 모집 후 조율하겠습니다.빠진 인원이 있더라도 3명 이상이 되면 무조건 진행합니다. 모두의 시간은 소중하니 되도록 빠지지 말아주세요. 빠지더라도 미리 하루 전이나 당일 이른 오후까지는 꼭 말씀주세요. 예상 모집인원 : 6명 스터디 관련 주의사항 : 1만원의 보증금이 있습니다. 빠진 횟수 당 2천원을 벌금으로 차감합니다. 보증금은 1권의 책을 완료할 때 돌려받습니다. 새로운 책을 진행할 때마다 보증금을 겁니다. 스터디에 지원할 수 있는 방법을 남겨주세요. (이메일, 카카오 오픈채팅방, 구글폼 등.) : 오픈 카톡으로 와주세요. https://open.kakao.com/o/suTXRYMg
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
추상 클래스와 인터페이스에 대해서 궁금한 것이 있습니다.
안녕하세요 ㅎㅎ좋은 강의 제공해주셔서 감사합니다. 추상 클래스와 인터페이스 사용 시점에 대해 궁금한 것이 있습니다. 제가 처음에 생각한 내용은추상 클래스 : 부모 클래스와 자식 클래스가 공통으로 제공하는 내용(메서드)도 존재하지만, 자식클래스 별로 다른 내용을 제공할 때는 abstract 메서드를 사용하여 구현을 강제시킨다.인터페이스 : 부모와 자식 간에 공통으로 가지는 내용(메서드 내용이 동일한)이 없으므로, 상속받는 클래스가 반드시 메서드를 구현한다. 그런데 JAVA8부터 인터페이스에 default 메서드가 추가되었더군요.인터페이스에 default 메서드를 선언하면, 인터페이스를 상속받는 클래스에서 구현을 하지 않고도 사용할 수 있더라구요.interface Shape { final int SIZE = 5; void render(); default int getSize() { return SIZE; } } class Rectangle implements Shape { @Override public void render() { StringBuilder buffer = new StringBuilder(); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { buffer.append("*\t"); } buffer.append("\n"); } System.out.println(buffer); } }public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int input = sc.nextInt(); Shape shape; if (input == 0) { shape = new Rectangle(); } else { shape = new Triangle(); } shape.render(); System.out.println(shape.getSize()); } } 그렇다면 default 메서드가 추상 클래스의 일반 메서드(추상 클래스가 아닌)와 동일하게 작동하게 되는데public abstract class Shape { public static final int SIZE = 5; public abstract void render(); public int getSize() { return SIZE; } }추상 클래스와 인터페이스를 사용하는 시기(?)를 어떻게 구별해야할까요? 구글링을 해보니 인터페이스에 default 메서드가 추가된 이유가 추후에 인터페이스에 새로운 메서드를 추가했을 때, 해당 인터페이스를 상속하고 있는 클래스에서 오류가 발생하지 않기 위해서라고 하는데그 오픈소스가 엄청 유명해져서 전 세계 사람들이 다 사용하고 있는데, 인터페이스에 새로운 메소드를 만들어야 하는 상황이 발생했다. 자칫 잘못하면 내가 만든 오픈소스를 사용한 사람들은 전부 오류가 발생하고 수정을 해야 하는 일이 발생할 수도 있다. 이럴 때 사용하는 것이 바로 default 메소드다. 결론적으로 내용을 정리하게 되면추상 클래스에서 새로운 메서드를 추가해야 한다면 abstract를 추가하지 않는다.인터페이스에서 새로운 메서드를 추가해야 한다면 default 메서드를 사용한다.default 메서드가 추가 되면서 추상 클래스와 인터페이스를 언제 사용해야 하는지 잘 모르겠습니다...! 감사합니다!
-
미해결최신 딥러닝 기술과 객체인식
강의자료
안녕하세요 수업 자료를 다운 받았는데, 혹시 강의 슬라이드가 없어서요 확인 가능하실까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
회원 등폭폼, 상품등록폼 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.<form th:action="@{/items/new}" th:object="${form}" method="post"><form role="form" action="/members/new" th:object="${memberForm}" method="post">첫번째는 상품등록 폼의 action이 th태그로 사용된경우두번째는 회원등폭 폼의 action이 그냥 사용된경우입니다.상품,회원의 @getMapping createForm과 @postMapping create의 경로가 같기때문에(member/new, items/new) 저는 위의 2개의 form.html 에있는 action을 action=""으로 둘다 설정했는데 저렇게 따로 하는 이유가 있을까요 ? 제가 배운 기억으로는 경로가 같으면 action="" 이렇게 사용하면 처음 요청했던곳으로 다시 post요청한다고 알고있어서요
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
작업형 1 모의 문제 1 (13강 질문)
3번 문제 코딩을#f3의 결측치 0, silver는 1, gold는 2, vip는 3으로 반환 후 총 합을 정수형으로 출력 df.head() df=df['f3'].fillna(0) df.replace('silver',1).replace('gold',2).replace('vip',3)이런 방법으로 풀어나갈 수 있는 방법은 없을까요?
-
해결됨한 입 크기로 잘라먹는 Next.js(v15)
#9.1 이미지 최적화 / css backgroundImage url 최적화 관련 질문
강의를 잘 듣던 도중에 궁금증이 생겨 질문드립니다. #9.1 이미지 최적화 강의를 듣고 나서 생긴 궁금증입니다. 여러 img태그를 next에서 제공하는 Image 태그로 교체함으로써 웹사이트의 이미지를 최적화시킬 수 있다는 점은 잘 이해했습니다. 하지만 이렇게 된다면 이전 강의에서 배운 도서 상세 페이지에서 도서의 표지를 검은색 배경으로 깔기 위해 사용했던 div 태그 내의 css ( BackgroundImage: url(...) ) 부분이 가져오는 이미지는 최적화가 전혀 되지 않을 것 같다는 생각이 들었습니다. 열심히 최적화를 해 봐야 저 부분에서 풀 사이즈의 이미지를 중복해서 가져온다면 성능에 다시 악영향이 갈 것 같다고 생각하였고, 나름의 답을 생각해 보았는데, 어떤 답이 맞는 것인지 잘 모르겠어 이렇게 질문드립니다. 배경 부분도 Image 태그로 불러운 다음 css를 적절하게 사용해 똑같이 배경 느낌으로 만들어 준다.css url로 가져온 이미지는 자주 가져오지 않으므로 최적화하지 않아도 큰 영향은 없다.사실 고민을 해 보아도 이 두가지 밖에 떠오르지 않아 둘 중에 답이 있는 것인지, 아니라면 어떤 방법을 적용하는 것이 좋은 방법일지 질분드립니다.
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
원핫 인코딩과 레이블인코딩
작업형 2에서 카테고리가 많으면 레이블인코딩을 진행하고, 적으면 원핫인코딩을 한다고 이해해도될까요? 그리고 레이블 인코딩은 범주형데이터만 사용하는데, 원핫 인코딩은 그러지 않는 이유가 궁금합니다
-
해결됨[React / VanillaJS] UI 요소 직접 만들기 Part 1
[#보일러플레이트 코드 사용법 문의] 강의자료[보일러플레이트] 사용법에 대해서 문의 드려요
안녕하세요!보일러플레이트 코드를 다운받아 npm install 을 하면,route 관련 코드가 작성되어 있고,http://localhost:3000으로 브라우저를 들어가면좌측 메뉴가 disabled 되어 클릭이 안되는 상태입니다. route 설정 코드가 보일러플레이트 코드에 일부 작성되어 있는데, route 설정 강좌를 시청 해야하는지 혹은 강좌 내용대로 코드를 다시 작성해야하는지 궁금합니다. routes.ts를 보면,children의 값이 null 인 부분이 확인됩니다. 아코디언 강좌를 예로 든다면,아코디언 컴포넌트를 만들고, 여기 null 인 부분에 값을 넣는거 아닐까 생각이 드는데요 첨부된 보일러플레이트 코드를 어떻게 사용해야하는지 질문 드립니다. 감사합니다! :]
-
해결됨디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기
CPU강의 관련하여 질문드립니다.
안녕하세요 삼코치님. 좋은 강의 잘 듣고있습니다. 강의 수강 중 궁금한 점이 있어 질문드립니다. 1. instruction과 PC에서 4bit 씩 더해서 다음 instruction을 처리한다고 설명하셨는데, 왜 4bit씩 더해지는 것인지 궁금합니다.instruction이 32bit= 4byte이므로 PC에서 4byte씩 더해져야 하는 것으로 이해하였습니다.그래서 32bit안에 opcode와 메모리 주소가 들어있는데, 이걸 4bit씩 끊으면 다음 주소로 넘어간다는 게 이해가 가지 않습니다. CPU에서는 왜 read write가 아닌 load와 store를 사용하는 건가요? 행위는 동일하지만 단어만 다른것인지, 서로 전혀 다른 개념인지 궁금합니다. 3. 설계 프로젝트에서 data mem과 reg file이 언급해주신 store와 write back이 저장하는 장소의 차이라고 생각하면 될까요? (store는 메모리, write back은 cpu reg에 저장) 긴 글 읽어주셔서 감사합니다!
-
미해결CAN 통신 - 자동차 신입이 알아야 할 모든 것
D-sub 핀과 120옴 저항 질문드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요. 강사님 궁금한 점 질문드립니다. 앞 강의에서 D-sub 커넥터를 설명해주시고, 지금은 120옴 저항을 설명해주셨는데, 제가 인턴으로 근무하면서 'D-sub 커넥터'라고 언급하기보단 거의 모든 분들이 '120옴 저항'이라는 단어로 해당 핀을 언급하셨습니다. 그러다보니 헷갈려서 그러는데, 저항과 커넥터는 다른 것이지만, CAN통신 특성에 120옴 저항을 사용해야 하기 때문에 해당 저항 특성이 포함되어 있는 D-sub 핀을 사용하는 것이다 라고 이해하고 넘어가도 될까요?
-
해결됨10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
학습 방법 문의
안녕하세요 이제 큰돌님 강의를 듣기 시작한 취준생입니다.일단 0주차부터 순서대로 강의를 듣고있었는데 0주차의 재귀함수듣고 순열 듣다보니 이 내용이 교안 앞부분에도 없고 뭐지 하면서 일단 들었는데 교안을 쭉 다시 보니 뒤쪽에 있더군요.이 강의를 들으며 학습을 시작하기 전에 C++과 자료구조 내용이 들어있는 알고리즘 교안을 혼자서 모두 익힌 후에 강의를 듣기 시작하면 되는거고 다른 알고리즘_개념교안 이라고 되어있는 자료가 강의들으면서 참조하는 자료인건가요?0주차에 있는 개념 내용들은 교안에 있는 부분중 영상이 필요하다고 생각된 부분을 보충하신거라고 생각하면 될까요?
-
미해결[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
길벗 책으로 공부 중인데 데이터 불러오는 방법
인강은 자료 다운로드 받아서 드래그앤드롭하면 되는 거 알겠는데책으로 할 때는 자료 어떻게 불러오나요?작업형1 연습문제 풀고 있는데 복붙하면 자료 안 불러져와서 에러 뜨네요빠른 답변 해주세요ㅠㅠ
-
미해결
강의 일시 정지 요청
학업 수준 따라가기가 힘들어서 일시정지 신청합니다
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
데이터 불러오는 방법
구글 코랩에서 사용 중인데, 파일 업로드 어떻게 하나요?코드에import pandas as pd df = pd.read_csv("type1_data1.csv") df = pd.read_csv("https://raw.githubusercontent.com/lovedlim/bigdata_analyst_cert/main/part1/ch3/type1_data1.csv")이렇게 붙여넣기 했는데 이렇게 하는게아닌가요? 드래그앤드롭 하라고 하셨는데 어디다 드래그앤드롭 하라는 건가요?ㅠ
-
해결됨코틀린 코루틴 완전 정복
Coroutine 취소 시점 체크
isActive라는 확장 프로퍼티를 이용해서 일시 중단 시점을 만들지 않고도 확인할 수 있다는 내용은 이해했습니다.다만 본 강의의 예시에서는 while문을 통해서 계속해서 isActive를 확인해서 취소된 걸 곧바로 알 수 있었지만,만약 실무에서 coroutine내에 어떤 로직들이 길게 적혀 있다면, 한 줄 한줄 마다 if 문을 통해 isActive를 확인해야 하는 코드가 들어가야 하는 걸까요? 아니면 조금 비효율적인 것을 감안하고 yield 같은 함수를 중간 중간에 넣어두어야 하는 걸까요?
-
해결됨개발자 이력서 작성 & 면접대비 완벽가이드
이전 회사에서 못한 작업, 이력서에 담는 법 질문
안녕하세요, 이력서 강의 잘 듣고 있습니다.현재 퇴사한 상태로, 이력서 지원 자격을 검토하며 준비하고 있습니다.퇴사 후 이전 회사에서 시도하지 못했던 작업들(ex. 캐시 처리, 테스트코드 작성)을 직접 해보고 싶은데,이런 경험을 이력서에 어떻게 표현하면 좋을지 조언 부탁드립니다!
-
미해결처음 만난 리액트(React)
index.js를 수정 후 npm start를 하면 계속 포트running이라고 뜹니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 강사님과 동일하게 index.js를 수정하고 terminal - new terminal을 하면 저는 경로가 계속 my-app의 상위 경로로 되어있어서 cd my-app을 해주고 npm start를 하는데 (이부분도 저는 왜 계속 이렇게 뜨는지 궁금합니다..my-app을 우클릭 후 터미널을 열면 되긴합니다만..) 이렇게 떠서 계속 새로운 포트를 추가해서 사용하게 됩니다..저도 강사님처럼 실습하고 싶은데 어떻게 하면 될까요..?