inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

ExcelFileReader는 왜 존재하지 않는거지 미스터 킬구

미해결

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

킬구형 안녕 FlatFileReader 라는 아주 편안한 기능은 존재하는데 어째서 ExcelFileReader 기능은 존재하지 않는거지? gpt 말로는 공식 확장 모듈은 spring-batch-excel 이 존재한다고는 하는데 이거 믿고 사용해도 되는지 모르겠네 킬구형은 excel 파일 읽고 DB에 쓸 때 아파치 poi 라이브러리로 직접 파싱해?

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
wndgks49 댓글 2 좋아요 1 조회수 118

오타발견

미해결

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

그러나 JdbcCursorItemReader는 기본적으로 커서의 순반향 이동만 지원 순반향->순방향 근데 맨날 오타글만 올리는데 괜찮음?귀찮으면 안하고

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
qwerty jon 댓글 2 좋아요 1 조회수 48

.

미해결

React Native with Expo: 제로초에게 제대로 배우기

.

  • react
  • react-native
  • 하이브리드-앱
  • typescript
  • expo
이영훈 댓글 2 좋아요 0 조회수 179

“외부 API” 호출이 실패한 경우 “내 서비스” DB 데이터의 정합성은 어떻게 되나요?

해결됨

백엔드 6주 실전 미션과 1:1 피드백으로 완성하는 합격 포트폴리오

안녕하세요 딩코딩코님! 수업 감사히 듣고있습니다! 아래 코드에서 트랜잭션 범위를 최소화하기 위해 1. 기존 서비스로 이벤트 참가 처리 메서드에만 @Transactional이 붙여져 있습니다. 이미 커밋이 된 상태이기 때문에, 2. 외부 API 호출이 실패해서 RuntimeException 예외를 던져도 “내 서비스”의 DB에는 “참가자 수 증가”와 “참가자 정보 저장”이 된 상태일 것으로 생각되는데, 이 경우, 아래 두가지 옵션 중 선택하는 것이 좋은 방법인지 트랜잭션 범위를 2. 까지 늘린다. 외부 API 호출 실패 시 “참가자 수 감소”, “참가자 정보 삭제” 로직을 추가한다. 아니면, 더 좋은 옵션이 있는지 궁금하여 질문드리게 됐습니다! public class ImprovedEventJoinWithExternalApiUpdateFacade { private static final String TEST_PHONE_NUMBER = "01012341234"; private final EventExternalUpdateService eventJoinService; private final ExternalEventApi externalEventApi; private final ApplicationEventPublisher eventPublisher; public void joinEvent(Long eventId, Long memberId) { // 1. 기존 서비스로 이벤트 참가 처리 EventWithLockParticipant participant = eventJoinService.joinEventWithTransaction(eventId, memberId); // 2. 외부 API 호출 ExternalEventResponse response = externalEventApi.registerParticipant( eventId, memberId, participant.getEvent().getName() ); if (!response.isSuccess()) { throw new RuntimeException("외부 API 호출 실패: " + response.getErrorMessage()); } // 3. 외부 API 응답으로 참가자 정보 업데이트 eventJoinService.updateExternalId(participant, response.getExternalId()); // 4. 이벤트 발행 (트랜잭션 커밋 후 실행됨) eventPublisher.publishEvent(new EventJoinCompletedEvent( eventId, participant.getEvent().getName(), TEST_PHONE_NUMBER )); } }

  • java
  • spring
  • mysql
  • redis
  • 이력서
이길훈 댓글 2 좋아요 0 조회수 208

강의 섹션 8: 네드워크 -프로그램 3부분 10:45 오타?

미해결

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

교안에서는 p.29 인데 여기서 여러 서버가 접속해도 문제없이 작동하는것을 확인할 수 있다 부분이 헷갈려서요. 여러 클라이언트가 접속해도로 바뀌어야 되는거 아닌가요. 지금 클라이언트 여러대에 서버 한대에 그 서버에서 쓰레드 만들어서 작동하는 걸로 이해했는데 혹시 제가 잘못 이해한걸까요. 감사합니다.

  • java
  • 네트워크
  • 객체지향
swdevelop24 댓글 2 좋아요 0 조회수 119

aws 배포할때 .env 파일에 저장한 환경변수에 관하여 여쭤볼게 있습니다

미해결

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

저는 application.yml 파일에서 mysql username 과 password 를 전부 .env 파일에 넣고 $ {} 를 써서 나타냈습니다. 그래서 .env 파일은 깃허브에 올리면 안돼서 배포해도 제대로 안돌아갈것 같아서 그런데. 혹시 강사님께서는 aws 배포하실때 db username, password 와 같은 민감한 정보들은 어떻게 처리하여 배포하시는걸 추천드리나요?

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
커디널스 댓글 1 좋아요 0 조회수 112

동적페이지 풀라우트 캐시 질문 있습니다.

미해결

한 입 크기로 잘라먹는 Next.js

강의에서 book/4는 동적 페이지인데 첫 접속 후 Full Route Cache에 저장되어 두 번째 접속이 빨라진다고 했습니다. 동적 페이지는 Full Route Cache에 저장되지 않는다고 배웠는데 왜 적용되나요? .next 폴더에 해당 페이지가 남아있는 것을 확인했는데, 이것이 Full Route Cache 적용을 의미하나요? npm run start로 프로덕션 모드에서 테스트했는데 첫 접속과 두 번째 접속 모두 170ms로 동일합니다. 왜 속도 차이가 없나요? import { notFound } from "next/navigation"; import style from "./page.module.css"; import { BookData } from "@/types"; // export const dynamicParams = false; export function generateStaticParams() { return [{ id: "1" }, { id: "2" }, { id: "3" }]; } export default async function Page({ params, }: { params: Promise<{ id: string | string[] }>; }) { const { id } = await params; const response = await fetch( `${process.env.NEXT_PUBLIC_API_SERVER_URL}/book/${id}` ); if (!response.ok) { if (response.status === 404) { notFound(); } return <div>오류가 발생했습니다...</div>; } const book: BookData = await response.json(); const { coverImgUrl, title, subTitle, author, publisher, description } = book; return ( <div className={style.container}> <div className={style.cover_img_container} style={{ backgroundImage: `url('${coverImgUrl}')` }} > <img src={coverImgUrl} /> </div> <div className={style.title}>{title}</div> <div className={style.subTitle}>{subTitle}</div> <div className={style.author}> {author} | {publisher} </div> <div className={style.description}>{description}</div> </div> ); } 🚨 필독) 질문하시기 전에 꼭 읽어주세요 (10초 소요) 제목을 구체적으로 작성해 주세요 ✅ 좋은 예 : 감정일기장 Home 구현중 xx 이슈가 발생합니다. ⛔ ️ 나쁜 예 : 이거 왜 안되나요?, 오류나요 도와주세요 등 비슷한 궁금함을 갖고 계신 분들께 도움이 될 수 있어요! 코드의 이슈는 전체 프로젝트를 "링크 형태"로 올려주셔야 원인을 파악할 수 있습니다. 깃허브, 구글드라이브 등의 수단을 통해 링크 형태로 전달해주세요 직접 실행해보며 원인을 파악해야 하기 때문에 텍스트 형태로 붙여넣는건 삼가해주세요 🥲 답변이 도움이 되셨다면 답글 or 해결완료 버튼을 클릭해주세요 비슷한 궁금함을 갖고 계신 분들께 도움이 될 수 있어요! 제 답변이 여러분께 도움이 되었는지 저도 알고 싶어요 🥲 강의 내용에 궁금한 점이 있다면 몇 챕터의 몇 분 몇 초인지 알려주시면 더 좋아요 더 빠른 답변이 가능합니다!

  • react
  • typescript
  • next.js
  • 카카오공채-개발
hinpuo 댓글 2 좋아요 0 조회수 106

오타?복붙실패

미해결

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

InFearLearn 서버 침입 사건: 해커 패턴 추적 작전 작전 수행을 위한 실전 코드부터 살펴보자. 여기코드에서 @Bean @StepScope public MongoCursorItemReader<SecurityLog> securityLogReader( 이 아이템리더쪽 복붙하고 안다듬어서 들여쓰기 밀림

  • java
  • spring
  • spring-boot
  • spring-batch
  • backend
qwerty jon 댓글 2 좋아요 1 조회수 93

제가 신청한강좌들 무제한으로 변경즘부탁드릴게요

해결됨

[자바스크립트부터 리액트까지] 포기없는 React로 가는 길 [Full vers.]

[자바스크립트부터 리액트까지] 포기없는 React로 가는 길 [Full vers.] 122 / 122강(100%) 2027. 01. 01. 23:59 만료 모던 웹 인터렉티브 CSS3 부트캠프 [Full vers.] 78 / 78강(100%) 2027. 01. 01. 23:59 만료 쌩초보, 비전공자를 위한 [HTML 스타터] 부트캠프 이3강좌가 수강기간이 제한이있어서 무제한으로 변경즘부탁드립니다.

  • javascript
  • react
  • jquery
  • typescript
  • es6
pcdo.omco 댓글 2 좋아요 0 조회수 108

컨슈머 이벤트 중복 처리

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

안녕하세요! 자주 질문드리는데 정성껏 답변해주셔서 감사합니다! 동일한 이벤트가 중복 전송될 가능성이 있기 때문에 article-read 서비스에 이벤트 id를 통한 중복 처리 로직을 추가 하려고합니다. article-read 는 redis를 사용하고 있기 때문에 redis에 이벤트 id를 저장해 해결하려고했습니다. 예를 들어 article-read가 이벤트를 받았을때 redis 에서 이벤트 id 확인 동일한 이벤트 id가 저장돼 있으면 추가 처리 안하고 message ack redis 에서 이벤트 id 확인 동일한 이벤트 저장된게 없으면 서비스 로직 수행 서비스 로직 결과 redis 업데이트 처리 완료한 이벤트 id redis 저장 이런식으로 진행하려 했으나 만약 어떠한 문제로 인해 서비스 로직 결과 redis 업데이트 ( 성공 ) 처리 완료한 이벤트 id redis 저장 ( 실패 ) 하게되면 이벤트 처리는 성공했지만 처리된 이벤트 저장에는 실패해 추후에 중복 처리가 발생할 가능성이 생길 것 같습니다. 이러한 문제 해결을 위해 서비스 로직 결과 redis 업데이트 처리 완료한 이벤트 id redis 저장 두 작업을 하나의 트랜잭션으로 묶어 처리하려고했지만 rdb 와 동작이 다르기 때문에 (롤백 기능 제공 안함 등) 적절한 방법인지 판단이 안서는 상태네요 혹시 article-read에 이벤트 중복 처리를 한다고 하면 어떻게 구현이 가능할지 여쭤보고싶습니다

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
jhkim593 댓글 2 좋아요 0 조회수 75

퀴즈 질문 풀이 오류

미해결

Next.js 완벽 마스터 (v15): 노션 기반 개발자 블로그 만들기 (with 커서AI)

저는 아무래도 정답이 C 같은데.. 질문에서 /docs 도 포함되어야 한다고 했으므로, 옵셔널 캐치올만이 루트 경로( /docs )까지 모두 처리할 수 있는거 아닌가요? 다 학습하고 혼란이 오네요..

  • react
  • 블로그
  • next.js
  • cursor
  • cursorai
Junho 댓글 2 좋아요 0 조회수 119

4-9 낙관적 락, 비관적 락

해결됨

백엔드 6주 실전 미션과 1:1 피드백으로 완성하는 합격 포트폴리오

해당 강의 수강 중 Facade 패턴에 대해 알게 되었습니다 그런데 테스트 코드에만 Facade가 적용되어 있고 Controller에는 바로 서비스 코드를 호출하게 되어 있는데요. 학습용 예시 코드여서 이런 것인지 다른 의도가 있는것인지 궁금합니다!

  • java
  • spring
  • mysql
  • redis
  • 이력서
goldrex123 댓글 2 좋아요 0 조회수 73

제대로 이해한게 맞나 궁금합니다

미해결

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

close() 메서드에서 synchronized와 if(closed){ return; } 조건문을 해준 이유가 해당 세션 종료시 close() 메서드 호출과 서버 종료시 SessionManager의 closeAll()을 통한 close() 메서드 호출이 동시에 되고 중복으로 호출 되는걸 막기 위해서 해준거라고 이해하면 될까요?

  • java
  • 네트워크
  • 객체지향
jkyjong 댓글 1 좋아요 0 조회수 110

팔로우 추천 목록이 빈 배열로 들어옵니다.

해결됨

Next + React Query로 SNS 서비스 만들기

안녕하세요. 팔로우 추천 API는 팔로워 수가 많은 순으로 최대 3명을 가져오도록 되어 있는 것으로 알고 있습니다. 현재 발생하는 현상으로는 회원가입한 유저가 없는 경우에 기존 유저에게 추천 목록이 빈 배열로 나타납니다. 그런데 회원가입 후 로그인하면 추천 목록에 로그인한 본인 아이디가 뜨고, 로그아웃 후 기존 유저 A로 로그인하면 이전에 회원가입한 유저 아이디가 추천 목록에 나타납니다. 기존 유저 A가 그 회원가입 한 유저를 팔로우한 상태에서, 다른 기존 유저 B로 로그인하면 A가 팔로우했던 아이디가 추천 목록에서 사라져 있습니다. 팔로우나 언팔로우 기능을 사용할 때 데이터는 정상적으로 들어오는 것으로 확인되고, 팔로워가 있는 아이디가 추천 목록에 나타나야 하는데 빈 배열로 표시됩니다. 어느 부분을 점검해야 문제를 정확히 파악할 수 있을지 감이 잡히지 않아 질문 남겨봅니다..! import { MouseEventHandler } from "react"; import { User } from "@/model/User"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { useSession } from "next-auth/react"; type Props = { user: User; }; export default function FollowRecommend({ user }: Props) { const queryClient = useQueryClient(); const { data: session } = useSession(); const followed = !!user.Followers?.find((v) => v.id === session?.user?.id); // 팔로우 const follow = useMutation({ // 호출 시마다 userId를 전달 mutationFn: (userId: string) => { return fetch( `${process.env.NEXT_PUBLIC_BASE_URL}/api/users/${userId}/follow`, { method: "POST", credentials: "include", }, ); }, onMutate: (userId: string) => { const data: User[] | undefined = queryClient.getQueryData([ "users", "followRecommends", ]); if (data) { // 내가 팔로우 하는 대상 // User 배열 중에 팔로우 버튼을 누른 대상의 userId를 찾아서 그 유저의 Followers 수정 const index = data.findIndex((users) => users.id === userId); const shallow = [...data]; shallow[index] = { ...shallow[index], Followers: [{ id: session?.user?.id as string }], _count: { ...shallow[index]._count, Followers: shallow[index]._count.Followers + 1, }, }; queryClient.setQueryData(["users", "followRecommends"], shallow); } }, onError: (error, userId: string) => { console.error("팔로우/언팔로우 에러:", error); console.log("실패한 userId:", userId); const data: User[] | undefined = queryClient.getQueryData([ "users", "followRecommends", ]); if (data) { const index = data.findIndex((users) => users.id === userId); const shallow = [...data]; shallow[index] = { ...shallow[index], // 내 아이디가 대상 유저의 팔로워 목록에서 빠져야함 Followers: shallow[index].Followers.filter( (f) => f.id !== (session?.user?.id as string), ), _count: { ...shallow[index]._count, Followers: shallow[index]._count.Followers - 1, }, }; queryClient.setQueryData(["users", "followRecommends"], shallow); } }, }); // 팔로우 끊기 const unfollow = useMutation({ mutationFn: (userId: string) => { return fetch( `${process.env.NEXT_PUBLIC_BASE_URL}/api/users/${userId}/follow`, { method: "DELETE", credentials: "include", }, ); }, onMutate: (userId: string) => { const data: User[] | undefined = queryClient.getQueryData([ "users", "followRecommends", ]); if (data) { const index = data.findIndex((users) => users.id === userId); const shallow = [...data]; shallow[index] = { ...shallow[index], Followers: shallow[index].Followers.filter( (f) => f.id !== (session?.user?.id as string), ), _count: { ...shallow[index]._count, Followers: shallow[index]._count.Followers - 1, }, }; queryClient.setQueryData(["users", "followRecommends"], shallow); } }, onError: (error, userId: string) => { const data: User[] | undefined = queryClient.getQueryData([ "users", "followRecommends", ]); if (data) { const index = data.findIndex((users) => users.id === userId); const shallow = [...data]; shallow[index] = { ...shallow[index], Followers: [{ id: session?.user?.id as string }], _count: { ...shallow[index]._count, Followers: shallow[index]._count.Followers + 1, }, }; queryClient.setQueryData(["users", "followRecommends"], shallow); } }, }); const onFollow: MouseEventHandler<HTMLButtonElement> = (e) => { e.stopPropagation(); e.preventDefault(); if (followed) { console.log("언팔로우"); unfollow.mutate(user.id); } else { console.log("팔로우"); follow.mutate(user.id); } };

  • react
  • next.js
  • react-query
  • next-auth
  • msw
개미 댓글 1 좋아요 0 조회수 163

messagerelayconfig클래스에서

해결됨

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

bootstrapServers의 value값은 어디에 가져오는건가요? yml이나 properties파일은 없는 거 같은데..

  • java
  • mysql
  • spring-boot
  • kafka
  • redis
leettletree 댓글 1 좋아요 0 조회수 54

강의자료 관련 질문

미해결

[React / VanillaJS] UI 요소 직접 만들기 Part 1

안녕하세요 오늘 강의를 구매했는데, 깃헙클론 부터 초기셋팅 하는법이 어딨는지 몰라서... 혹시 캡처로 첨부드린 내용이 어딨는지 알 수 있을까요?? 감사합니다

  • react
  • typescript
  • dom
  • ui
  • vanilla-js
댓글 2 좋아요 0 조회수 105

Circuit Breaker 질문

해결됨

멀티 모듈 아키텍처로 구현하는 은행 서버 핵심 기능 [ Kotlin & Spring ]

안녕하세요. circuit breaker 코드를 봤을 때 간략하게 circuit breaker가 이런거다 라고 설명해주셨지만, 추가로 궁금한 점이 있어 질문 드립니다. 만약 인스턴스가 여러개인 상황에서는 로컬 상황만 보는게 아니라 전체 인스턴스 상황을 봐야할 것 같은데 이럴 떄는 circuit breaker를 어떻게 사용해야 하는지 궁금합니다. 감사합니다.

  • java
  • spring
  • kotlin
  • mysql
  • spring-boot
HAHA 댓글 2 좋아요 0 조회수 98

filter함수, map함수 등 중괄호를 썼을때의 문제점

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

이런식으로 함수 표시 방식인 ()=>{} 이렇게 사용을 하면 삭제 버튼을 눌렀을 때 모든 리스트가 사라집니다. 또한 앞에서 사용했던 map함수 같은 경우에도 강의와는 다르게 중괄호를 쓰면 문제가 생겼어서 소괄호로 바꿨더니 정상적으로 돌아갔었습니다. 현재 위 함수들에는 중괄호를 쓰면 안되는걸까요?? 참고로 map함수는 한 줄이 아니라 여러줄이었는데도 중괄호를 쓰면 에러, 소괄호를 써야 정상작동했었습니다. 정환님 책에는 별다른 말이 없고 강의에도 별다른 얘기가 없어서 미치겠습니다ㅜㅜㅜㅜㅜ

  • javascript
  • react
  • node.js
  • 카카오공채-개발
gogomini 댓글 2 좋아요 0 조회수 101

투두 수정하기에서 onUpdate함수에 id를 넘겨줄때 왜 이벤트 핸들러로 하는게 아닐까요?

해결됨

한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지

onUpdate함수를 TodoItem에도 넣어줘야한다는꺼까지 알겠습니다. input의 onChange일때 onChangeCheckbox를 넣어줘야한다는 것도 알겠습니다. 하지만 왜 onChangeCheckbox 함수 내용이 그냥 onUpdate에 id만 넣어주는걸까요?? 이런식으로 id를 반환해주려면 해당 이벤트가 일어났을때 target의 id를 반환해줘야 하는거 아닐까요???? 왜 e를 매개변수로 넣지도 않고 그냥 id만 넣어도 되는걸까요? 강의 내용에 궁금한 점이 있다면 몇 챕터의 몇 분 몇 초인지 알려주시면 더 좋아요 8.6 챕터의 5분 20초입니다!

  • javascript
  • react
  • node.js
  • 카카오공채-개발
gogomini 댓글 2 좋아요 0 조회수 79

이미지 생성오류 (코드업데이트가 너무 필요해보입니다..)

미해결

나도! 스프링으로 인공지능을 할 수 있다(인프1탄)

안녕하세요. 강의를 듣고있는 사람입니다. 버전이 변경되다보니 강의 내용을 그대로 수행한다면 정상적으로 작동하는 Project들이 몇 없네요.. DALL-E 2 모델로 이미지를 생성하는 경우 오류 발생 DALL-E 2 모델에서는 withQuality("hd")와 같은 옵션을 지원하지 않는다고합니다. 해당 라인을 제거해주시면 정상작동합니다. DALL-E 3 의 경우 withQuality를 지원하는데, 지정하지 앟는다면 standard 값이 기본으로 들어가며 hd를 원하시는 경우 따로 if ("dall-e-3".equals(model)) { optionsBuilder.withQuality("hd"); } 위와같이 옵션을 주입하여 사용하시면 될것같습니다.

  • java
  • spring
  • spring-boot
  • 인공지능(ai)
  • spring-ai
skyjoon2 댓글 1 좋아요 0 조회수 151

인기 태그

인프런 TOP Writers

주간 인기글