묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 C++
맥북 visual studio code 에서 헤더파일은 어떻게 만드나요?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. visual studio code에서는 헤더파일을 어떻게 만드나요?
-
미해결홍정모의 따라하며 배우는 C++
맥북 visual studio code 링킹
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 말씀해주신대로 g++ add.cpp main.cppclang++ add.cpp main.cpp 2가지 다 해도 안됩니다.... 어떻게 해야할까요?윈도우 노트북을 사야할까요?공부하고 싶은데 맥북 visual studio code로는 따라가기가 너무 힘드네요....
-
미해결김영한의 실전 자바 - 기본편
여러 생성자가 있을 때, this()의 역할
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요! 영한님 강의 너무 잘 보고 있습니다!생성자 강의를 듣고 있다가 this()에 관한 걸 배웠을 때, 이런 질문이 떠 올랐습니다. this()는 어떤 클래스의 생성자를 사용하고 싶을 때 사용하는 것이라고 했는데, 만약 오버로딩으로 만든 생성자가 3개 이상일 때, this()는 그 생성자들 중에서 어떤 것을 가리키는 걸까? 에 대한 의문이 생겼습니다. 제가 직접 IDE에서 실험을 했을 땐, this()에 어떤 파라미터를 사용하느냐에 따라, 해당 파라미터와 같은 생성자가 사용되는 것 같은 결과가 나왔습니다.그렇다면 this()에 대해, this() 안에 파라미터와 같은 생성자가 호출된다고 생각해도 되는 걸까요?
-
해결됨처음 만난 리액트(React)
useRef가 잘 이해되지 않습니다.
useRef() Hook의 다음 코드에서 질문이 있습니다.useRef는 DOM에 접근하기 위해 사용하는 Hook으로 이해하면 될까요?예시 코드에서 <input type="text" ref={inputElem} />inputElem을 해당 input태그에 접근하기 위해 useRef를 사용하는 것이 맞나요?useRef() Hook이 데이터 변경을 감지하지 못해서 HTML 코드에 있는 ref의 변경을 감지할 수 있는 useCallback() Hook을 대신 사용하는게 맞나요?그럼 useCallback을 useRef를 대체하여 사용가능한 건가요?
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
이 풀이는 어떤가요?
package hash; import java.util.HashMap; import java.util.Scanner; public class Anagram { public static String solution(String str, String str2) { String result = "YES"; HashMap<Character, Integer> map = new HashMap<>(); for(char ch : str.toCharArray()) { map.put(ch, map.getOrDefault(ch, 0)+1); } for(char ch : str2.toCharArray()) { map.put(ch, map.getOrDefault(ch, 0)-1); } for(char ch : map.keySet()) { if(map.get(ch) != 0) { result = "NO"; break; } } return result; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); String str2 = sc.next(); System.out.println(Anagram.solution(str, str2)); } }str, str2 둘다 같은 Map을 써서 str에 +1, str2에 -1 해주어서 0이 아닐시 NO를 반환하게 코딩하였습니다. 답은 맞게 나오는데 허점? 이 있나 궁금하여 글 남깁니다.
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
회원 저장인데 201 Created가 아닌 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]아래 사진의 경우 회원 저장을 하는 상황인데응답 메시지가 201 Created가 아닌 이유가 뭔가요? 201 Created를 하기에 적절하지 않는 경우인지,아니면 201 Created를 해도 되는 상황이 맞지만, 그냥 200 OK로 한 건지 궁금합니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
MemberServiceTest 중 MemberService NullpointException
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.MemberServiceTest 중 하기 에러가 발생합니다. java.lang.NullPointerException: Cannot invoke "jpabook.jpashop.service.MemberService.join(jpabook.jpashop.domain.Member)" because "this.memberService" is null at jpabook.jpashop.service.MemberServiceTest.join(MemberServiceTest.java:27) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at org.junit.runner.JUnitCore.run(JUnitCore.java:115) at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:42) at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80) at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:72) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:119) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:94) at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:89) at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:62) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94) at jdk.proxy1/jdk.proxy1.$Proxy2.stop(Unknown Source) at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:193) at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:129) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:100) at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:60) at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:113) at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:65) at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) MemberServicepackage jpabook.jpashop.service; import java.util.List; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; /** * 회원 가입 */ public Long join(Member member) { validateDuplicateMember(member); // 중복 회원 검증 memberRepository.save(member); return member.getId(); } private void validateDuplicateMember(Member member) { List<Member> findMembers = memberRepository.findByName(member.getName()); if (!findMembers.isEmpty()) { throw new IllegalStateException("이미 존재하는 회원입니다."); } } // 회원 전체 조회 public List<Member> findMembers() { return memberRepository.findAll(); } public Member findOne(Long memberId) { return memberRepository.fineOne(memberId); } } MemberServiceTestpackage jpabook.jpashop.service; import static org.junit.jupiter.api.Assertions.*; import jpabook.jpashop.domain.Member; import jpabook.jpashop.repository.MemberRepository; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; @SpringBootTest @Transactional public class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void join() { Member memberTestName = new Member(); memberTestName.setName("kimjimin"); Long savedId = memberService.join(memberTestName); assertEquals(memberTestName, memberRepository.fineOne(savedId)); } }
-
해결됨실무에서 사용하는 클라우드 보안 프로그래밍 (AWS, Python, Terraform)
3.2. 왜 리소스 기반 정책은 Deny로 해야되나요? 부분이 잘 이해되지 않습니다.
3.2. 왜 리소스 기반 정책은 Deny로 해야되나요?에서 동일계정에서 권한을 부여한다는 말씀이 정확히 어떤 말씀이신건가요? 계정이 다른 경우에는 b라는 리소스를 사용하기 위해서는 사용자 a와 b리소스 모두 서로 권한을 allow해야 한다는 것까지는 이해했습니다.(c계정은 b리소스를 사용할 수 없음, 그림은 다 a계정으로 되어있어서 이 부분도 약간 혼란스러웠네요. 제가 이해한게 맞을까요?) 그런데 동일 계정'에서' 권한을 부여하는 경우 문제가 생긴다는 게 정확하게 어떤 뜻인지 이해가 가지 않습니다.예를 들어 a 계정이 b 리소스에 s3:GetObject라는 권한을 허용하면 a가 b에게 권한 설정을 했으므로, a 자체가 해당 리소스에 대한 권한이 없더라도 b리소스에 대한 접근이 가능하다는 건가요? (만일 b계정이 권한을 부여한다면 a는 접근이 불가능한거구요) '여기에 밑에 설명에 a라는 사용자에게 권한이 있으면 무용지물이 됨'이라고 되어있어서 어떤 말씀을 하시는지 잘 이해가 되지 않습니다! 초보자인 저에게 좀 더 친절한 설명을 주시면 감사하겠습니다! (혼자서 이해해보고자 chatGPT에게도 문의해보았습니다 ㅎㅎ)
-
미해결자바 코딩테스트 - it 대기업 유제
혼자서 푼 문제 확인 부탁드립니다.
package com.company.대기업유제.너비우선탐색; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.List; import java.util.Queue; class 숲속의기사 { static class Pos { int x; int y; public Pos(int x, int y) { this.x = x; this.y = y; } } public int solution(int[][] board) { int answer = Integer.MAX_VALUE; /** * 영희는 궁전에서 기사가 지키는 숲을 통과해서 나가야함 * 안전하게 가기위해 기사에게 산딸기를 줘야함 * 최대한 빨리 기사에게 산딸기를 줘야함 * 숲의 지도: R * C 판 형태 * 영희 시작위치, 기사 위치, 산딸기 위치가 표시, 영희가 가지 못하는 위치 * 영희는 산딸기 없이 기사를 지나쳐갈수없음 * 동서남북 하루에 한칸씩 이동 * 영희가 산딸기를 기사에게 가져다주는 가장 짧은 날의 수 * 0 : 영희가 움직일수 있는곳 * 1: 영희가 움직일수 없는곳 * 2. 영희의 시작위치 * 3: 숲속기사의 위치 * 4: 산딸기 위치 * * */ //산딸기 위치 저장 List<Pos> strawberryList = new ArrayList<>(); for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[i].length; j++) { if (board[i][j] == 4) { strawberryList.add(new Pos(j, i)); } } } for (Pos pos : strawberryList) { //* 2. 영희의 시작위치 int count1 = BFS(pos.y, pos.x, board, 2); //* 3: 숲속기사의 위치 int count2 = BFS(pos.y, pos.x, board, 3); answer = Math.min(count1 + count2, answer); } return answer; } private static int BFS(int y, int x, int[][] board, int posType) { //산딸기 위치들로부터 영희의 최소거리, 기사의 최소거리 BFS 각각 한번씩 돌기 Queue<Pos> queue = new ArrayDeque<>(); //BFS를 위한 queue queue.add(new Pos(x, y)); int[] dx = new int[]{-1, 0, 1, 0}; int[] dy = new int[]{0, -1, 0, 1}; boolean[][] ch = new boolean[board.length][board[0].length]; int day = 0; while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { Pos pos = queue.poll(); //현재위치로부터 if(board[pos.y][pos.x] == posType) return day; for (int j = 0; j < 4; j++) { //동서남북 이동 int moveX = pos.x + dx[j]; int moveY = pos.y + dy[j]; if (moveY < 0 || moveX < 0 || moveX >= board[0].length || moveY >= board.length) continue; if(ch[moveY][moveX]) continue; if (board[moveY][moveX] == 1) continue;//1: 영희가 움직일수 없는곳 ch[moveY][moveX] = true; queue.add(new Pos(moveX, moveY)); } } day++; } return -1; } public static void main(String[] args) { 숲속의기사 T = new 숲속의기사(); System.out.println(T.solution(new int[][]{{4, 1, 0, 0, 0, 0, 1, 0}, {0, 0, 0, 1, 0, 1, 0, 0}, {0, 2, 1, 1, 3, 0, 4, 0}, {0, 0, 0, 4, 1, 1, 1, 0}})); System.out.println(T.solution(new int[][]{{3, 0, 0, 0, 1, 4, 4, 4}, {0, 1, 1, 0, 0, 0, 1, 0}, {0, 1, 4, 0, 1, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0, 0}, {1, 0, 1, 0, 0, 1, 1, 0}, {4, 0, 0, 0, 1, 0, 0, 0}, {4, 1, 0, 0, 1, 0, 0, 0}, {4, 0, 0, 0, 0, 0, 1, 2}})); System.out.println(T.solution(new int[][]{{4, 1, 0, 1, 0}, {0, 1, 0, 1, 0}, {0, 0, 2, 3, 4}, {0, 1, 0, 1, 0}})); } }딸기위치를 기준으로 영희와 숲속의 기사의 최단거리를 각각 따로 BFS로 구하였는데 괜찮은 방법인가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
@InitBinder의 검증기 생성에 대해서
안녕하세요 해당 컨트롤러 안에 init()메서드가 있는경우 애노테이션Validated가 있는 메서드가 호출되는 경우만 init()가 호출 되는 건가요? 또 init가 호출될 떄마다 검증기도 새로 생성된다고 했는데 검증기도 객체인데 그 객체를 호출마다 새로 생성하고 리퀘스트 스코프 끝나면 검증기 객체가 자동 삭제되고 다른 호출일 때 또 새로운 검증기 객체가 생성되는 인식이 맞을까요?
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
좋은 강의 입니다. 강의자료좀 부탁드립니다.
강의 자료좀 부탁드려도 될까요 kmdadoo@naver.com
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
@PathVariable 관련 에러가 왜 발생했는지 궁금합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]제가 "상품 상세" 강의를 들으면서 BasicItemController 안에 있는 @GetMapping("/{itemId}") public String item(@PathVariable Long itemId, Model model) { log.info("BasicItemController.item"); Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/item"; }강의를 따라 위의 부분처럼 작성했을 땐java.lang.IllegalArgumentException: Name for argument of type [java.lang.Long] not specified, and parameter name information not found in class file either.라는 에러가 발생하고 @GetMapping("/{itemId}") public String item(@PathVariable(name = "itemId") Long itemId, Model model) { log.info("BasicItemController.item"); Item item = itemRepository.findById(itemId); model.addAttribute("item", item); return "basic/item"; }이렇게 작성하니 에러가 해결되었습니다. 위 코드는 왜 에러가 났는 지 궁금합니다!
-
해결됨Next + React Query로 SNS 서비스 만들기
패러랠 라우트 질문(로그인 모달 관련)
로그인모달을 패러랠 라우트 방식으로 구현하는 과정에서default.tsx 강의 타임라인 0:34에서app/(beforeLogin)/@modal 폴더에 있던 page.tsx와 login.module.css파일을 복사해서app/(beforeLogin)/i/flow/login로 디렉터리를 만들어서 거기에다가 page.tsx와 login.module.css파일로 넣으셨는데요.URL이 http://localhost:3000/i/flow/login이면@modal 하위에도 그 url 경로대로 폴더 구조를 맞춰서 넣어줘야 하는 것이죠? 패러랠방식에 대해서 아직 감이 안잡힙니다. (beforeLogin)폴더 자식으로 @modal폴더와 layout.tsx에 가 있고 laytout.tsx에서 modal을 props로 가져옵니다.그럼 그 modal이라고 이름지은 것은 같은 뎁스에 있는 "@자기이름"인 @modal을 탐색해서 가져오는건가요? import { ReactNode } from "react"; import styles from "@/app/page.module.css"; type Props = { children: ReactNode; modal: ReactNode; }; export default async function BeforeLoginLayout({ children, modal }: Props) { return ( <div> <div className={styles.container}> {children} {modal} </div> </div> ); }
-
미해결대세는 쿠버네티스 (초급~중급편)
Recreate 배포 시 다운타임 없음
다음 스크립트를 실행시켜놓고 Recreate 배포 테스트를 진행하면 다운 타임 없이 교체가 진행되는 것 같습니다.앱이 워낙 가벼워서 1초 이내에 교체가 진행될 수 있는걸까요?while true curl ..; sleep 1;
-
해결됨김영한의 실전 자바 - 기본편
매서드 캡슐화와 테스트 코드
선생님, 안녕하세요.내부에서만 사용하는 매서드는 private으로 캡슐화 해두는 것이 좋은 구현이라고 알고 있고, 이번 수업에서도 그런 내용을 확인할 수 있었는데요, private 매서드들도 테스트 코드를 작성해서 테스트 해보고싶은 경우가 자주 발생합니다... 이런 경우 고민을 하다가 몇 가지 방법이 있겠으나 ... 그냥 public 으로 열어버리고 테스트 코드를 두곤 했는데요, 이런 경우에 선생님은 실무에서 어떻게 하셨는지, 가장 좋은 practice가 무엇인지 알고 싶습니다. 항상 감사합니다..^^
-
해결됨자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]
notifyAll 이 더 선호되는 이유에 대한 조금 더 detail 한 설명 요청드립니다.
안녕하세요 선생님, 질문이 있어서 글 올립니다.[스레드 간 협력 - wait() & notify() 강의 - 6:23 ] 즈음에"notifyAll 이 더 선호된다"... 라고 했는데, 제가 뭘 놓친 걸 수도 있지만, 잘 이해가 안됩니다. 왜 notfiyAll 이 선호되는지에 대한 핵심적인 이유를 알려주실 수 있을까요?
-
해결됨스프링 핵심 원리 - 기본편
의존관계 자동주입 - 조회 빈이 2개 이상일 경우에 궁금증이 있습니다.
@Autowired 필드 명, @Qualifier, @Primary 강의 부분에서 궁금한 점이 생겼습니다.결국에 조회 빈이 2개 이상인 경우엔 위의 어노테이션을 활용해서 우선순위를 지정해준다고 되어있는데,필드명을 수정해주거나, Qualifier의 이름을 변경해야하는 상황이 생긴다면( ex) OrderServiceImpl의 discountPolicy를 fixDiscountPolicy 에서 rateDiscountPolicy 로 할인 정책을 변경하고 싶다면)직접 구현체들(클라이언트 코드)을 수정해줘야하는데( ex) Autowired 된 DiscountPolicy의 변수명을 수정하거나, @Qualifier의 이름을 수정해서)이는 OCP 원칙에서 위배되는 것은 아닌지 궁금합니다. 나아가 이런식으로 실제 구현체를 수정해줘야하는 것이라면 discountPolicy 의 타입명만 DiscountPolicy일 뿐이지, 타입명 자체를 FixDiscountPolicy 로 지정하거나 RateDiscountPolicy로 지정해서 사용하는 DIP 위반하는 코드들과 무슨 차이인지 잘 모르겠습니다. 순수 자바 코드 자체는 해당 원칙들을 지키고 있는 것이니까 상관없는것인가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
model 및 BindingResult을 사용할 때
model이랑 BindingReulst로 오류처리 하는 부분을 뷰로 넘겨주는 로직에 관해서 질문입니다. 지금은 타임리프를 사용해서 model 등을 값을 받아서 화면에 출력하는데 사용을 하지만 나중에 프론트 프레임워크를 사용하는 경우 해당 검증 방법을 그대로 쓸 수 있나요?? 보통 json형태로 값을 보내주는 걸로 알고 있는데 그 경우 검증 로직은 프론트 단에서 하게 되는지 궁금합니다.
-
해결됨CUDA 프로그래밍 (4) - C/C++/GPU 병렬 컴퓨팅 - 행렬 matrix 곱하기
kernelMatCpy에서는 __syncthreads가 필요없지 않나요
제목 그대로 kernelMatCpy에서는 각 스레드 작업이 다른 스레드에 영향을 주지 않기 때문에 필요없을 것 같은데요. 실제로 __stncthreads()를 제거하고 돌려봐도 정상적으로 결과가 나오구요.혹시 이런 경우라도 내부적으로 꼬일 수 있어서 사용하신 것인지 아니면 대부분의 shared memory로 복사해서 쓰는 경우에 필요하기 때문에 습관(?)차원에서 사용하신 것인지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
질문있습니다
package hello.core.beanfind; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; public class ApplicationContextExtendsFindTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); @Test @DisplayName("부모 타입으로 조회 시, 자식이 둘 이상 있으면, 중복 오류가 발생한다.") void findBeanByParentTypeDuplicate(){ assertThrows(NoUniqueBeanDefinitionException.class,()->ac.getBean(DiscountPolicy.class)); } @Test @DisplayName("부모 타입으로 조회 시, 자식이 둘 이상 있으면, 빈 이름 지정하면 된다.") void findBeanByParentTypeBeanName(){ DiscountPolicy rateDiscountPolicy=ac.getBean("rateDiscountPolicy",DiscountPolicy.class); assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class); } @Test @DisplayName("특정 하위 타입으로 조회") void findBeanBySubType(){ RateDiscountPolicy bean=ac.getBean(RateDiscountPolicy.class); assertThat(bean).isInstanceOf(RateDiscountPolicy.class); } @Test @DisplayName("부모 타입으로 모두 조회하기") void findAllBeanByParentType(){ Map<String,DiscountPolicy> beansOfType=ac.getBeansOfType(DiscountPolicy.class); assertThat(beansOfType).isEqualTo(2); for (String key : beansOfType.keySet()) { System.out.println("key= "+key+"value="+beansOfType.get(key)); } } @Test @DisplayName("부모 타입으로 모두 조회하기-Object") void findAllBeanByObjectType(){ Map<String,Object> beansOfType=ac.getBeansOfType(Object.class); for(String key:beansOfType.keySet()){ System.out.println("key = "+key +"value="+beansOfType.get(key)); } } @Configuration static class TestConfig{ @Bean public DiscountPolicy rateDiscountPolicy(){ return new RateDiscountPolicy(); } @Bean public DiscountPolicy fixDiscountPolicy(){ return new FixDiscountPolicy(); } } }여기서assertThrows(NoUniqueBeanDefinitionException.class,()->ac.getBean(DiscountPolicy.class)); 이 부분이 왜 부모 타입으로 조회하는 건지 이해가 안갑니다. 상속을 한 적도 없고 그냥 타입을 넣어줬을 뿐인데 말이죠..ㅠ