EnumMap 열거형 상수를 Key로 사용하는 Map의 구현체. 열거형 상수 값을 키로 사용할 수 있고, 그 상수 마다 고유한 value를 매핑하여 사용한다. EnumMap은 내부적으로 배열로 구현되어 있어, 매우 빠른 성능을 제공 특히 다른 맵보다 메모리 사용량이 적다. static EnumMap<OrderStatus, String> korMap = new EnumMap<>(OrderStatus.class) { { put(PREPARING, "준비중"); put(SHIPPED, "출고완료"); put(DELIVERING, "배송중"); put(DELIVERED, "배송완료"); } }; public static void main(String[] args) { OrderStatus.korMap.forEach((key, value) -> System.out.println(key + " " + value)); } EnumSet 열거형 상수를 사용하여 집합(Set)을 구현체 Set의 특성상 중복된 원소를 허용하지 않음. EnumSet은 내부적으로 비트 벡터로 구현되어 있어 매우 효율적이고 작은 메모리를 사용. 비트연산을 통해 집합 연산을 매우 빠르게 수행 static EnumSet<OrderStatus> allOrderStatus = EnumSet.allOf(OrderStatus.class); public static void main(String[] args) { allOrderStatus.forEach(System.out::println); }
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 강의 내용을 질문할 경우 몇분 몇초의 내용에 대한 것인지 반드시 기재 부탁드립니다. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 이전 XGBoost 혹은 GBM 등에서 경사하강법에 대해서 이야기 되었을 때, 이때의 경사하강법은 확률적 경사하강법이 기반된 것이 맞을까요?
프로필페이지 에서 세로고침을 할때 로그인이 풀리면서 로그인 정보가 사라지면서 에러가 발생하는 현상이 있었습니다 const Profile = () => { const { me } = useSelector((state) => state.user); const dispatch = useDispatch(); useEffect(() => { if (!(me && me.id)) { Router.push("/"); } }, [me && me.id]); useEffect(() => { dispatch(loadFollowers()); dispatch(loadFollowings()); }, []); return ( <> <Head> <title>프로필 | NodeBird</title> </Head> <AppLayout> <NicknameEditForm /> <FollowList header="팔로잉 목록" data={me?.Followings} /> <FollowList header="팔로워 목록" data={me?.Followers} /> </AppLayout> </> ); }; 그런데 이해가 안되는점은 Router.push로 me에 대한 정보가 없으면 루트 페이지로 넘어가게 만들어두었는데도 로그인 정보가 없다고 에러가 발생하고 그래서 로그인 정보를 가져오는 loadMyInfo를 사용해도 계속 에러가 발생한다는 점입니다. 이부분이 일단 첫번째로 이해가 안되는 점이고 아래 질문자님들이 질문하신 내용으로 me?.Foolowings로 일단 해결하고 넘어갔습니다 그런데 또 프로필 페이지에서 세로고침을 해보니까 이번에도 me에 대한 정보가 없다고 나옵니다 me에 대한 정보가 없어서 발생하는 에러인데 팔로워에 대한 정보를 불러오는 리듀서에서 에러가 발생합니다 하지만 사진에 state 정보를 보시면 me에 정보가 들어있습니다. 아마 me 정보를 갱신하기 이전에 발생한 action에 대한 에러인거 같은데 어떻게 해결하면 좋을까요?
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하십니까? 김영한 선생님의 강의를 학습을 하고 있는 학생입니다. 제가 학습을 잘못하여 생긴 오류인지 현재의 저의 상태에서는 이 궁금증을 풀 수가 없고 chatgpt 또한 답변을 해주지 않아서 오히려 더 궁금해졌습니다. 싱글톤에서의 프로토타입 빈 사용에서의 테스트코드를 작성하다 문득 롬복을 사용하면 컴파일 시점에서 생성자가 생성이 되고 생성자가 1개이기 때문에 명시하지 않아도 스프링에 의해 @Autowired가 붙어 진행 되는걸로 이 전 롬북 영상에서 그렇게 이해를 하였습니다. 그래서 아 롬복도 한번 써봐야지를 하고 진행을 했는데? 아니나 다를까 제 생각과는 많이 다르더군요. 그래서 제 학습이 지금 뭔가 잘못된거 같기도 한데 잘 모르겠습니다. 1번째인 아래의 코드는 작동을 하고 2번째 코드에서는 variable prototypeBean not initialized in the default constructor 왜 이러한 에러가 나는지 궁금합니다. 첫번째 코드 두번째 코드 감사합니다.
TypeORM을 이용한 소프트 삭제에서 softRemove와 softDelete를 이용하는 방법 두가지가 있는데, 강의에서는 softDelete를 이용하는 경우에 대해 설명을 해주셨는데요. softRemove를 하는 경우에도 entity에 똑같이 @DeleteDateColumn 으로 deleteAt을 추가해주면 되나요? @RemoveDateColumn은 내장되어 있지 않은것 겉더라구요.. 그리고 softRemove 에서는 .affected 가 안되던데 true 나 false로 리턴받을 수 있는 방법이 있을까요?
안녕하세요, 위 사진처럼 JPAQueryFactory를 별도로 생성해주거나, 아니면 JPAQueryFactory 를 별도로 @Bean 등록해서 생성자 파라미터로 주입받거나 두가지 방식으로 아무거나 해도 되잖아요? 그런데 문득 궁금한데, 습관처럼 사용하던 EntityManager 같은 것들은 Spring이 자동으로 @Bean 으로 등록해서 관리하고 있는 거죠? 그렇다면 JPAQueryFactory는 왜 별도로 스프링이 @Bean 으로 자동 등록해두지 않은 거죠? 감사합니다.
터미널에 npm run start:dev 를 입력하면 자꾸 Error: Cannot find module 라는 에러가 뜹니다;; npm를 지웠다 깔기도 하고, node module 폴더를 삭제하기도하고, lock.json 파일을 삭제해보기도 했는데 여전히 계속 에러가 뜨는데 왜 이런건가요?.....
react - spring 으로 블로그 만들기 프로젝트를 개인적으로 하고있습니다. image를 blob형태로 가져와서 띄우는 것 까진 잘 되는데, 영상 재생이 원활히 되지 않아서 질문을 남깁니다. public ResponseEntity<Resource> getVideo(String videoName) throws IOException { String fileDirectory = "src/main/resources/static/video/"; String fileName = videoName + getExtension(fileDirectory, videoName); Path videoPath = Paths.get(fileDirectory + fileName); Resource videoResource = new UrlResource(videoPath.toUri()); System.out.println("videoResource = " + videoResource); String videoUrl = "http://localhost:4000/videos/" + fileName; System.out.println("videoUrl = " + videoUrl); return ResponseEntity.ok() .contentType(MediaType.valueOf("video/mp4")) // 비디오 타입에 맞게 설정 .body(videoResource); } 서버측에서 다음과 같이 로컬에 저장된 영상을 프론트로 보내줍니다.(임시) 이후 프론트에서 이를 재생하려고 하는데, export const getVideoApi = async (token: string | null, videoName: string | number) => { const url = `http://localhost:4000/api/videos/${videoName}`; try { const response = await axios.get(url, { headers: { Authorization: `Bearer ${token}`, }, responseType : "blob", }); console.log(response.data) const videoUrl = URL.createObjectURL(response.data); console.log(videoUrl) return videoUrl; } catch (error) { console.error("Error fetching board data:", error); return null; } }; video를 다음과 같은 api호출로 가져오고, 저장하였습니다. useEffect(() => { async function fetchProfileImage() { try { if (!boardData) return; // Return early if boardData is not available yet const token = cookies.token; const profileUrl = await getImageApi(token, boardData.boardWriterEmail); setProfileImages({ [boardData.boardNumber]: profileUrl }); const imageUrl = await getImageApi( token, boardData.boardNumber.toString() ); setBoardImages({ [boardData.boardNumber]: imageUrl }); const videoName = boardData.boardNumber.toString(); const videoBlobUrl = await getVideoApi(token, videoName); setVideoUrl(videoBlobUrl || undefined); } catch (error) { console.error("Error fetching profile image:", error); setVideoUrl(undefined); } } fetchProfileImage(); return () => { // Clean up Blob URL when the component unmounts if (videoUrl) { URL.revokeObjectURL(videoUrl); } console.log(videoUrl); }; }, [boardData,cookies.token]); 그리고 다음과 같이, 게시물에 접속할 때, 게시물의 사진과 영상이 보여질 수 있도록 useEffect()를 사용하였고 여기서 받은 링크를 {boardVideo && ( <div> <video width="60%" controls style={{ display: "block", // Center align the video margin: "0 auto", // Center align the video }} > <source src={videoUrl || "default.mp4"} type="video/mp4" /> Your browser does not support the video tag. </video> <p>videoUrl: {videoUrl}</p> </div> )} 이런식으로 보여주려고 하고있습니다. (p,div 태그는 로그를 찍어보기 위함) 브라우저 개발자 도구에서, 영상이 제대로 프론트로 넘어오는 것 까진 확인이 되는데, 생성한 blobUrl로 영상을 불러오는 것이 잡히지 않았고, 또한 bloburl을 2번 생성하는 것을 확인할 수 있었습니다. 리액트에 관한 지식이 많이 부족하고, 공부하지 않은 터라, useEffect를 사용하는데 미숙해서 그런건지, 왜 2번이나 bloburl을 만드는지도 이해가 가지 않고, 영상이 재생되지 않는 부분도 이해가 가지 않습니다. blob으론 영상을 재생할 수 없는 것이라면, 서버에서 url을 string으로 넘겨주는 방식을 사용해야하는건지도 궁금합니다. 아래와 같이 blob 객체가 2번 보이고, url도 두개가 생성됩니다. Blob {size: 34970691, type: 'video/mp4'} fileApis.ts:53 blob: http://localhost:3000/c7bb643e-2d0b-4838-9b8b-dd0863a349d4 fileApis.ts:50 Blob {size: 34970691, type: 'video/mp4'} fileApis.ts:53 blob: http://localhost:3000/dfe61c3b-8faa-4b01-8a3c-1ef7a743ce6a 제 이해가 많이 부족합니다. 혹시 blob방식을 사용하는 것이 옳지 않은 건지, 스프링과 리액트를 같이 사용할 때 (혹은 타 프레임워크를 사용하더라도,) 서버에 저장되어있는 영상을 프론트에서 재생하는데 좋은 방법이 있다면 알려주시면 감사하겠습니다.
@Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Post post)) return false; return id.equals(post.getId()); } 위에 처럼 equals 메서드를 재정의했고 id값만 사용해 객체를 비교했습니다. 예상한걸로는 id값만 사용했기에 객체가 초기화 되지 않는걸 예상했고 하지만 실제로 동작에서는 초기화가 되는것을 확인했습니다. @Override public boolean equals(Object o) { return true; } 그리고 테스트 하기위해 위에 처럼 필드를 사용하지 않게 재정의를 했고 하지만 역시 equals를 사용하면 객체가 초기화 되었습니다. 이유가 무엇인가요? 스택오버플로우 에서는 equals가 재정의되면 프록시 객체에서는 원본객체로 위임한다는 답변이 있습니다. 원본 객체로 위임하면서 초기화가 발생하는것일까요?
로그 추적기의 요구 사항이 public 메서드 호출을 로깅하는 건데, private 메서드 호출까지도 로깅하는 걸로 하고 싶다면 어떻게 해야할까요? private 메소드는 AOP 적용 불가능한대, 디버깅시 어떤 흐름으로 함수가 호출되지 파악하기 위해서 private 메서드 호출도 봐야되는 것 같고, 그러면 어떻게 하는지 궁금해서 여쭤봅니다. 혹시 모니터링 툴로 함수의 전체적인 호출 흐름을 파악할 수 있나요?
안녕하세요. express 에서 rest 방식에서는 API를 생성할 때, get이나 post 등의 메소드 방식을 정하고 주소를 지정하여 프론트엔드에서 fetch 나 axois 함수에 주소를 기입하여 API 요청을 했었습니다. graphQL 방식의 nestjs에서는 프론트엔드에서 API 요청을 보낼 때 어떤 방식으로 하나요? 따로 주소 같은 것을 지정해주지는 않는 것같은데.. 똑같이 fetch 나 axois 함수를 통해 요청을 하는 건가요?