묻고 답해요
167만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
클래스 로딩 순서에 관해 질문이 있습니다.
10분 24초에 클래스를 로딩하기에 앞서서 검사, 준비, 해결과정을 거친다고 하셨는데 로딩을 한 후 링킹(검사,준비, 해결)과정을 수행하는 것이 아닌가요? 로딩전 링킹과정 후 로딩을 하는 것인가요? 제가 잘못이해하고 있는 것인지 궁금합니다
-
미해결TS/JS 디자인 패턴 with Canvas: 제로초에게 제대로 배우기
리스코프 치환원칙은 반,공변성과 같은 원리인가요?
class Parents { // 좁은 파라미터 method(name: string, test: string) { // 넓은 반환 타입 return { key: "" }; } } class Child extends Parents { // 넓은 파라미터 override method(name: string) { // 좁은 반환 타입 return { key: "", name: "" }; } } 안녕하세요,리스코프 치환원칙을 보니 반,공변성의 원칙과 같이매개변수는 반공변성을 리턴은 공변성을 가지는 것 같은데, T<child> -> T<parents> 개념이 되는 타입의 정의 원칙을 리스코프 치환 원칙이라 하는 것일까요?
-
미해결Readable Code: 읽기 좋은 코드를 작성하는 사고법
DTO 생성과 관련해서 궁금한 게 있습니다!
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!먼저 유사한 질문이 있었는지 검색해 보세요.서로 예의를 지키며 존중하는 문화를 만들어가요. @Transactional public ShelterResponse.FindShelterListDTO findActiveShelterList() { List<Shelter> shelters = shelterRepository.findAllWithAnimalAndLatitude(); List<ShelterResponse.ShelterDTO> shelterDTOS = shelters.stream() .map(shelter -> new ShelterResponse.ShelterDTO( shelter.getId(), shelter.getName(), shelter.getLatitude(), shelter.getLongitude(), shelter.getCareAddr(), shelter.getCareTel())) .collect(Collectors.toList()); return new ShelterResponse.FindShelterListDTO(shelterDTOS); } @Transactional(readOnly = true) public ShelterResponse.FindShelterInfoByIdDTO findShelterInfoById(Long shelterId) { Shelter shelter = shelterRepository.findById(shelterId).orElseThrow( () -> new CustomException(ExceptionCode.SHELTER_NOT_FOUND) ); return new ShelterResponse.FindShelterInfoByIdDTO( shelter.getId(), shelter.getName(), shelter.getLatitude(), shelter.getLongitude(), shelter.getCareAddr(), shelter.getCareTel(), shelter.getAnimalCnt() ); } 위 코드는 유기 동물 보호소 서비스에서 보호소 목록을 가져오고, 보호소의 상세 정보를 가져오는 코드입니다.서비스 레이어에서 컨트룰러 레이어로 응답을 내보낼 때 DTO로 변환해서 보내는데, 데이터양이 많은 엔티티의 경우 위 코드처럼 DTO 빌드 코드가 길어지더라구요.. 그래서, 정보량이 많은 엔티티에 관한 데이터를 DTO로 리턴할 때는 아래와 같이 서비스 레이어에 private 메서드로 추출해서 사용합니다.private ShelterResponse.AnimalDTO createAnimalDTO(Animal animal, List<Long> userLikedAnimalIds) { return new ShelterResponse.AnimalDTO( animal.getId(), animal.getName(), animal.getAge(), animal.getGender(), animal.getSpecialMark(), animal.getKind(), animal.getWeight(), animal.getNeuter(), animal.getProcessState(), animal.getRegion(), animal.getInquiryNum(), getCachedLikeNum(animal.getId()), userLikedAnimalIds.contains(animal.getId()), animal.getProfileURL()); } 여기서 고민이 시작 됐는데, 응답으로 보낼 DTO를 빌드하는 로직을 서비스 레이어에 private 메서드로 추출하는 게 서비스 레이어의 역할 상 괜찮을지 의문이 들더라구요.현업에서는 정보량이 많은 DTO 코드를 빌드하는 부분을 메서드로 따로 추출하는지, 추출한다면 어떻게 처리하는지 궁금합니다!이거를 메서드로 추출하지 않을까도 생각해봤는데, 그러면 메서드의 코드 길이가 너무 길어져서 가독성을 해치는 느낌도 있더라구요.. 또 DTO만 처리하는 클래스를 만들어볼까도 생각했는데 이게 맞나 싶기도 하구요
-
미해결김영한의 실전 자바 - 중급 1편
toString()
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]debug("xx ={} ", str); 에도 내부적으로 toString()이 적용되어서 출력되나요?
-
해결됨김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
존재하지 않는 ip와 서버가 사용하지 않는 ip의 차이
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]ai야 999.999.999.999 라는 ip를 사용해서 UnknownHostException 을 받는 경우와 192.168.1.250를 사용해서 ConnectException 을 받는 경우의 차이를 설명해줘
-
미해결김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
실무 코드스타일 질문
FileReader(FILE_NAME)이렇게 생성하면 시스템의 기본 디폴드 캐릭터셋을 사용한다고했습니다. 그런데 실제로 실무에서 애플리케이션을 만들고 배포하면 어떤 환경에서 실행될지모르기때문에 코드안에 캐릭터셋을 지정해주는 편인가요? FileReader(FILE_NAME, UTF-8)이렇게요개발하는입장에선 당장은 캐릭터셋을 지정안해도되지만 추후에 이 애플리케이션이 실행될 환경을 고려해서 적어주는게 바람직할까요.?
-
해결됨기초 탄탄! 독하게 시작하는 Java - Part 2 : OOP와 JVM
메타데이터의 위치에 대한 질문입니다.
널널한 개발자님. 항상 잘 듣고 있습니다! 좋은 강의 감사합니다. 복습을 하던 도중 잘 이해가 안되는 부분이 있어 질문드립니다.인스턴스의 메타데이터라 함은 강의 내용 중 해시코드, 오브젝트 나이, 락플래그를 말하는 것 같습니다.강의 4분경에서 이런 메타데이터가 Klass word에서 참조하는 Metaspace에 저장되어 있다고 하셨습니다.그리고 강의 6분경 핫스팟 VM 객체 Lock flag슬라이드 보거나, 실제 예제를 실행시켜 나온 결과(23:35)를 보면 Markword에도 해쉬파일과 락플래그가 있는 것으로 보입니다.Metaspace, Markword 둘 다 같은 인스턴스의 해시코드값(+락플래그)을 가지는 건가요? 그러면 Metaspace는 생성된 인스턴스 모두의 메타데이터를 가지는건가요? 새벽에 보느라 머리가 잘 안돌아가네요..긴 글 읽어주셔서 감사합니다!
-
미해결스프링 핵심 원리 - 기본편
MemberApp 코드 실행 오류 문제.
강의 그대로 따라하며 모든 코드를 입력했으나, 강의에서처럼 System.out.println("new member = " + member.getName()); System.out.println("find Member = " + findMember.getName());이를 출력했을 때 값이 정상적으로 안나옵니다.찾아보니 gradle 파일 내부 문제가 있는듯 한데, 뭐가 문제인지 모르겠습니다. 코드 전부를 첨부합니다.. 도와주세요...!plugins { id 'java' id 'org.springframework.boot' version '3.4.0' id 'io.spring.dependency-management' version '1.1.6' } group = 'hello' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation ('org.springframework.boot:spring-boot-starter-test'){ exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { useJUnitPlatform() } package hello.core; import hello.core.member.Grade; import hello.core.member.Member; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; public class MemberApp { public static void main(String[] args) { MemberService memberService = new MemberServiceImpl(); Member member = new Member(1L, "memberA", Grade.VIP); memberService.join(member); Member findMember = memberService.findMember(1L); System.out.println("new member = " + member.getName()); System.out.println("find Member = " + findMember.getName()); } }
-
해결됨스프링 핵심 원리 - 기본편
@Configuration
[질문 내용]컴포넌트 스캔을 사용하면 @Configuration이 붙은 설정 정보도 자동으로 등록된다 하였는데 AutoAppConfig 클래스에 있는 @Configuration은 왜 설정해 두신건지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
destroyMethod="" 빈공백을 사용하면?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]8장 빈 생명주기 콜백 의 빈 등록 초기화, 소멸 메서드 관련 질문입니다.마지막 종료 메서드 추론 부분에서 "추론 기능을 사용하기 싫으면 destroyMethod="" 처럼 빈 공백을 지정하면 된다"라고 말씀 하셨습니다.그런데 추론 기능을 사용하기 싫으면 destroyMethod에 close나 shutdown이 아닌 내가 지정한 메소드 이름을 입력해야 하는 거 아닌가요?빈 공백을 지정하면 소멸 메서드를 아예 지정하지 않아서 실행도 되지 않는 것 같은데 저게 무슨 말인지 이해가 안갑니다.답변 미리 감사합니다.(destroyMethod의 디폴트 값이 close와 shutdown이어서 @Bean에 destroyMethod를 적지 않으면 자동으로 close와 shutdown 메소드를 실행하는 것까진 이해했습니다.)
-
미해결스프링 핵심 원리 - 기본편
@ComponentScan(basePackages = "hello.core.order")
[질문 내용]탐색할 패키지의 시작 위치를 지정할 때 basePackages의 위치를 "hello.core.order 로 하였을 때 OrderServiceImpl에 @Component 와 @Autowired 어노테이션이 있으니 로그에 분명 orderServiceImpl이 나올 것으로 예상하는데 테스트 실패가 나오는 이유가 뭔지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
@Component, @Autowired
[질문 내용]컴포넌트 스캔과 의존관계 자동 주입 시작하기 영상에서 김영한 강사님께서 @Componenet 어노테이션을 등록한 클래스 MemberServiceImpl 가 자동으로 스프링 빈에 등록이 되는데 의존성 주입이 안되어 있으니 같이 해주기 위해 생성자 코드 상단에 @Autowired를 붙인다는 것 까지는 이해하였습니다. 그런데 10분 2초 쯤에 @Autowired를 붙인 MemberServiceImpl 생성자 파라미터에 MemberRepository 타입에 맞는 MemoryMemberRepository가 올거라고 어떻게 예상 하는거죠? 혹시 MemoryMemberRepository 클래스에도 @Component를 붙였으니 MemoryMemberRepository 가 올거라고 확신하는거죠?
-
미해결김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션
volatile closed 적용해도 동시성 처리를 막을 수 없을까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문 전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.아래의 메서드는 결국 if(closed) 를 검증하기 위한 코드인데 synchronized가 아닌 volatile 키워드로 가시성만 보장해도 동시성 처리를 막을 수 있을 것 같다는 생각에 질문 드립니다!아직까지 해당 부분이 미흡해서 다시 공부해보겠습니다!public synchronized void close() { if (closed) { return; } closeAll(socket, input, output); // shutdown closed = true; log("연결 종료: " + socket); }
-
미해결스프링 핵심 원리 - 기본편
AppConfig@CGLIB
[질문 내용]@Configuration과 바이트코드 조작의 마법 강의영상에서 8분 19분쯤에 김영한 강사님께서 부모타입으로 조회하면 모든 자식이 끌려 나온다 했는데, 부모타입으로 된 변수명에 자식 인스턴스를 초기화할 때 기능을 호출하면 부모 타입에 없을 때 자식타입에서 못가져오는 것으로 알고있습니다. 상속 관계는 부모 방향으로 찾아 올라갈 수는 있지만 자식 방향으로 찾아 내려갈 수는 없기 때문이죠. 그래서 강사님께서 말한 "부모 타입으로 조회하면 자식들이 다 끌려 나온다"라는 말은 틀린 말 아닌가요?
-
미해결스프링 핵심 원리 - 기본편
@Configuration
[질문 내용]AppConfig 같은 클래스를 만들고 바로 상단에 @Configuration 어노테이션을 설정하면 그 클래스는 스프링 컨테이너라고 봐도 된다는 거죠?
-
미해결김영한의 실전 자바 - 중급 1편
데이터베이스 로드맵 출시
선생님 혹시 데이터베이스 로드맵은 출시가 취소된걸까요? 중급 1편 다음으로에서 데이터베이스 로드맵에 대해 말씀주셨는데, 선생님 페이지에 안보여서요
-
해결됨오브젝트 - 기초편
설명중에 "그렇다면 설계를 변경하는 이유는 무엇이었나요?" 질문입니다.
설명하신 내용중에 "그렇다면 설계를 변경하는 이유는 무엇이었나요?" 라고 하시면서 "프로세스와 데이터가 하나의 모듈안에 모여 있으면 코드를 수정하기 어렵기 때문이였죠." 라고 하시던데...앞에 내용으로는 '프로세스와 데이터가 서로 다른 모듈안에 배치되어서 수정이 어려우니 프로세스를 구현한 코드를 데이터를 구현한 코드로 옮기는..' 뭐 이런거 아니였나요??제가 잘못 이해하고 있는건가요?
-
미해결스프링 핵심 원리 - 기본편
팩토리 빈, 스프링 컨테이너
[질문 내용]팩토리 빈 과 스프링 컨테이너를 같은 의미로 봐도 될까요? 차이가 있다면 뭐가 다른건지 알려주세요.
-
해결됨김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
스레드 질문 있습니다
안녕하십니까 영한님 영한님 덕분에 비전공자로서 백엔드 개발자의 꿈을 꾸고있는 사람중 1인입니다다름이 아니라 영한님께서 여러 스레드를 실행하면 main 스레드의 경우 다른 스레드의 종료까지 기다리지 않아 join이라는 메서드로 적절하게 대처하는 것이 중요하다고 들었습니다. 하지만 아래 코드를 보면 main 스레드가 종료라는 문구가 항상 맨 마지막에 나와 헷갈려서 여쭈어봅니다. 이경우도 main이 먼저 종료되어 thread가 실행되지 않을 수 있는 건가요? public static void main(String[] args) { MyTask task = new MyTask(); Thread thread = new Thread(task,"work"); log("runFlag = " + task.runFlag); thread.start();; sleep(1000); log("runFlag를 false로 변경 시도"); task.runFlag = false; log("runFlag = " + task.runFlag); log("main 종료"); } static class MyTask implements Runnable { volatile boolean runFlag=true; @Override public void run() { log("task 시작"); while (runFlag) { } log("task 종료"); } } }
-
해결됨진짜! 자바스크립트(Javascript) - 기초부터 고급까지
for 문에서 var 키워드 변수를 사용할 때와 let 키워드 변수를 사용할 때 차이점
안녕하세요 좋은 강의 감사드립니다.아래에서 for 반복문 내에서 var 키워드를 사용했을 때의 경우에는 var 키워드는 함수 스코프를 가지므로 setTimeout 의 콜백 함수가 실행되는 시점에 i 변수의 값은 이미 3인 상태이므로 3 3 3이 출력되는 것은 이해를 했습니다. 그런데 let 키워드로 선언한 변수는 블록 스코프를 가지는데 언뜻 이해하기로는 for 블록 내부에 i 변수가 선언되었다고 생각하면 var 키워드와 마찬가지로 setTimeout 의 콜백 함수가 호출되는 시점에 i 변수는 3이어야 하는게 아닐까라는 생각이 듭니다. 근데 0 1 2 가 출력되는 것을 보면 혹시 for 반복이 한번 실행될 때마다 i 변수가 생성되어서 서로 다른 블록 스코프를 가지는 것인지 아니면 제가 이해하지 못한 다른 내용이 있는 것인지 궁금합니다! 그리고 마지막으로 블록 스코프란 { } 이렇게 중괄호 내에 선언되는 경우를 말하는 것 같은데 for 문의 let i 변수의 경우에는 정확히 말하면 블록 내부에 선언되어 있지는 않은데 이 경우에도 블록 스코프라고 봐야 하는 건가요?? 감사합니다!function timer() { for (var i = 0; i < 3; i++) { setTimeout(function () { console.log(i); } , 1000); } }function timer() { for (let i = 0; i < 3; i++) { setTimeout(function () { console.log(i); } , 1000); } }