실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)
안녕하세요? 강의는 이미 구입하였으나 그동안 다른일로 바빠서 수강을 미루다가 이제서야 들을려고 하는데 공유해주신 샘플 프로젝트를 다운받아서 실행할려고 하니 다음과 같은 에러가 발생해서 문의드립니다. Execution failed for task ': com.group .libraryapp.LibraryAppApplication.main()'. > Process 'command 'C:/Program Files/Amazon Corretto/jdk17.0.14_7/bin/java.exe'' finished with non-zero exit value 1 다른 버전의 JDK나 아마존에서 배포하는 JDK를 다운받아서 실행해보아도 동일한 에러가 계속 반복되어서 문의드립니다. 참고로 사용중인 IDE는 IntelliJ IDEA 2024.3입니다. 감사합니다.
안녕하세요 https://inf.run/QwLTR 위의 링크와 연계되는 질문입니다. 복습을 하다 보니 언제 when()으로 stubbing 을 해 줘야할까에 대해 헷갈려져서, 저의 사고 흐름을 정리해봤습니다 컨트롤러에서는 서비스 단 하위로는 모킹을 한다. 모킹하는 객체들은 테스트에서 주 관심사가 아니며, 항상 잘 동작한다고 가정한다. 모킹해오는 객체들은 stubbing을 해주지 않는다면 기본 값들을 반환하는 정책을 따른다. 위 질문 링크의 "판매 상품을 조회한다." 테스트에서는 모킹 객체인 productService의 메소드가 어떤 리턴값을 반환하든 presentation 레이어에서 검증하고 싶은 내용이 아니기 때문에, 검증을 수행하지 않았고, productService.getSellingProducts()에 대한 stubbing도 굳이 필요 없다. "메일 전송 테스트" 에서 mailSendClient.sendEmail()에 대한 stubbing이 필요한 이유 모킹 객체인 mailSendClient.sendMail()이 기본 값 반환 정책이 false이어서, 테스트 하고자 하는 mailService.sendMail()에 영향을 미치기 때문이다. (여기서 기본 값 반환 정책이 true였다면 굳이 stubbing 해주지 않아도 된다 -> "메일 전송 테스트" 에서 검증하고자 하는 대상이 아니기 때문에) 이런식으로 테스트에 검증하고자 하는 대상에 집중하다 보면 모든 동작을 제대로 stubbing했다고 보장하기 어려워 진다 -> Mockist의 치명적인 단점 제가 정리해 본 내용이 적절한지 알려주시면 감사합니다. 테스트의 세계는 정말 헷갈리네요..
안녕하세요! 강의를 마친 후, 여러 가지 궁금한 점이 생겼습니다. 지금까지 로컬,및 도커에서 사용한 config-service, apigateway-service, discovery-service(유레카 서버) 의 역할이 Kubernetes 환경에서 대체될 수 있다는 것을 배웠습니다. 구체적으로는: 유레카 대체: 각 Pod의 DNS 이름을 사용하여 서비스 간 통신 API Gateway 대체: Ingress 리소스를 사용하여 외부 요청을 라우팅(강의엔 없음) Config 서버 대체: RabbitMQ를 통한 busrefresh로 설정 정보를 업데이트하는 대신, Kubernetes의 ConfigMap을 사용하여 설정을 동적으로 업데이트 이렇게 Kubernetes에서 많은 기능을 간편하게 처리할 수 있다는 점에 대해 배우면서, 이전의 복잡한 서비스 구조가 생각보다 간단하게 대체될 수 있다는 점에서 약간 허무한 느낌도 듭니다. 강의를 마친 후의 궁금증은, 실제 MSA 개발 시에 Kubernetes, Docker, AWS를 사용하는 다양한 배포 방식 중 어떤 선택을 해야 할지에 대한 부분입니다. EC2에 Docker 사용하여 배포 EC2에 Kubernetes 사용하여 배포 AWS의 EKS, ECS, API Gateway를 사용하는 방법 등 여러가지 방법이 있을텐데요 이와 같은 다양한 옵션 중에서 어떤 방식을 선택 해야하는지 공부의 방향성을 제시해주시면 감사하겠습니다. 좋은 강의 감사합니다!
안녕하세요 선생님 질문이 생겨서 글 남깁니다.! 선생님이 생각하시는 가장 이상적인 테스트 코드 범위는 어디 까지인가요?? 예를들어 controller,service,repository가 있다고 가정하고 선생님 강의처럼 각각 레이어별로 테코를 짜고 service 쪽도 repo를 mock처리하여 단위테스트까지도 진행 하여야하나요? 제 질문을 정리하자면 controller,service,repository 각각 단위테스트 작성후 service + repo로 통합테스트 하는게 옳은 이상적인 범위인가 궁금합니다 감사합니다
안녕하세요! (섹션 2. 람다가 필요한 이유) 수업 자료 17p 해당 페이지에서 "변하는 부분은 그대로 유지하고, 변하지 않는 부분을 어떻게 해결할 것 인가에 집중하면 된다." 라고 쓰여있는데 해당 페이지 맨 밑에 부분에는 "변하지 않는 부분은 그대로 유지하고, 변하는 부분은 외부에서 전달 받아서 처리한다" 라고 나와있습니다! 두 말이 서로 맞지 않는 것 같아서요..ㅜㅜ "변하는 부분은 그대로 유지하고, 변하지 않는 부분을 어떻게 해결할 것 인가에 집중하면 된다." -> "변하지 않는 부분은 그대로 유지하고, 변하눈 부분을 어떻게 해결할 것 인가에 집중하면 된다." 라고 수정이 필요한 건가 싶어서 질문드립니다! 감사합니다
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요?네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네 안녕하세요, 임베디드 타입에 대해 수강하던 중 별 것 아닐 수도 있는 것에 대해 제가 생각한 것이 맞나 확인 차 여쭤보고 싶어 질문드리게 되었습니다. 임베디드 타입 강의 중간부터 값타입이라는 말이 많이 나오는데, 임베디드 타입 = 값타입으로 이해를 하는게 맞는 것일까요 ?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 배열의 인덱스를 혹시 for(int i = 0; i < n; i++){ for(int i = 0; i < 5; i++){ arr[i][j] = sc.nextInt(); } } 이렇게 하면 안되는 이유가 있을까요?
만약 Car()랑 ECar()를 출력하고 싶으면 ElectricCar tesla = new ElectricCar("Tesla", 2021, 75); 전에 기본생성자를 호출해야 하나요 예를 들면 ElectricCar tesla = new ElectricCar(); ElectricCar tesla = new ElectricCar("Tesla", 2021, 75); 이렇게 해야지 각 class의 기본 생성자를 호출 하는건가요?
질문은 동영상 강의에 들어가서 오른쪽에 커뮤니티 버튼을 통해 해주세요. 그래야 어떤 강좌에서 질문하셨는지 알 수 있습니다. 영상에서 몇 분 몇 초 대를 알려주셔야 제가 한 번에 질문 내용 확인이 가능합니다. 이미 다른 누군가가 질문을 한 이력 이 있을 수 있습니다. 질문 게시판을 한 번 확인 부탁드립니다. 학교의 과제나 타 강사의 코드 등 외부 수업 자료에 대해서는 답변하지 않습니다. 제가 다루는 커리큘럼 외의 이론이나, 너무 디테일한 컴퓨터 이론에 대해서는 답변 드리지 않습니다. 시험에 안 나오는 경우가 많고, 나와 봤자 1문제 나오는데 외워야 할 부분이 많은 것 등 (예시: 서브넷 마스크 계산) 질문을 올릴 때 이 글은 모두 지우고 내용을 입력해주세요. 코드 문제에서 완전수를 구하기 위해 6부터 30까지 확인하는 방법은 일일히 확인하는 방법 밖에 없나요?
안녕하세요 강사님 좋은 강의 매번 잘 듣고 있습니다. 채팅 프로그램 직접 먼저 구현해보라고 하셔서 코드를 짜봤는데요, 이후 강사님이 짜신 채팅 프로그램 코드를 보며 많이 부족하다는 것을 다시 느꼈습니다. 두 코드를 비교하며 제가 짠 클라이언트 코드 중에 잘 이해가 되지 않는 부분이 있는데요,, 우선 코드는 다음과 같습니다. package network.tcp.chat; //... import static util.MyLogger.log; public class ChatClient { private static final int PORT = 12345; public static void main(String[] args) throws IOException, InterruptedException { try (Socket socket = new Socket("localhost", PORT); DataInputStream input = new DataInputStream(socket.getInputStream()); DataOutputStream output = new DataOutputStream(socket.getOutputStream())) { log("채팅 소켓 연결: " + socket); // 채팅 메시지 송.수신 분리 ReadHandler readHandler = new ReadHandler(input); WriterHandler writerHandler = new WriterHandler(output); Thread clientReadThread = new Thread(readHandler, "clientReadHandler"); Thread clientWriteThread = new Thread(writerHandler, "clientWriteHandler"); clientWriteThread.start(); clientReadThread.start(); clientWriteThread.join(); clientReadThread.join(); } } } package network.tcp.chat; //.. import static util.MyLogger.log; public class ReadHandler implements Runnable { private final DataInputStream input; public ReadHandler(DataInputStream input) { this.input = input; } @Override public void run() { while(true) { // 서버로부터 문자 받기 String received = null; try { received = input.readUTF(); } catch (IOException e) { throw new RuntimeException(e); } log("server -> client: " + received); } } } package network.tcp.chat; //.. import static util.MyLogger.log; public class WriterHandler implements Runnable { private final DataOutputStream output; public WriterHandler(DataOutputStream output) { this.output = output; } @Override public void run() { Scanner scanner = new Scanner(System.in); while(true) { System.out.print("전송 문자: "); // 서버에 문자 보내기 String toSend = scanner.nextLine(); try { output.writeUTF(toSend); } catch (IOException e) { throw new RuntimeException(e); } log("client -> server: " + toSend); if (toSend.equals("exit")) { break; } } } } 물론 제 코드를 작동시켜보면 1) EOFException도 발생하고 2) 자원 정리 코드도 따로 없습니다 다만 궁금한 것은 main 에 다음의 두 코드를 넣어야 채팅 프로그램이 동작한다는 것입니다. clientWriteThread.join(); clientReadThread.join(); 앞서 보여주신 간단한 server-client 예제, 강사님이 짜신 채팅 프로그램 코드 모두 Thread.join() 메소드를 전혀 사용하지 않았는데 왜 제 코드에서는 두 코드를 넣어야 채팅 프로그램이 끊기지 않고 동작하는 것인지 자문을 구해도 될까요?ㅠ 감사합니다..!