묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결토비의 스프링 6 - 이해와 원리
jackson(3.0.2 버전) ObjectMapper.readValue 에러타입
3.0.2 버전의 경우 readValue가 JacksonException을 throw하는 것으로 타입이 선언되어 있는데요. (unchecked Exception 타입) public <T> T readValue(String content, Class<T> valueType) throws JacksonException Unchecked Exception(상위 에러 타입이 RuntimeException)이지만 강의처럼 try catch 이용하여 JacksonException을 catch 하면 될까요?아님 RuntimeException 이니 별도로 catch 없이 코드를 작성하는게 좋을까요?
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
내부 트랜잭션 커밋은 필수인가요?
log.info("내부 트랜잭션 커밋"); txManager.commit(inner); log.info("외부 트랜잭션 커밋"); txManager.commit(outer);전체 커밋하는 상황에서 내부, 외부 모두 커밋이 되어야 실제 물리 커밋이 이루어진다고 앞서 개념을 설명하실 때도 그렇고 이번 강의에서도 설명하셨습니다. 그런데 내부 커밋을 진행하면 아무 일도 발생하지 않고 외부 트랜잭션에서 커밋을 진행해야 실제 물리 커밋이 되는데그렇다면 이때 내부 커밋을 진행하지 않아도 되나요? 아니면 모두 커밋돼야 커밋된다는 원칙에 따라 내부 커밋도 필수적으로 진행하여야하고 외부 커밋도 진행하여야하는 것인가요?제 생각에는 정말 내부 커밋이 필요하다면 호출이 반드시 필요하다라고 설명하셨을 것 같은데 내부 커밋을 해도 아무것도 안한다고 하시니 내부 커밋 코드를 호출에 의문점이 생깁니다. 실제 물리 커밋은 외부 커밋에서 진행되기 때문에 내부 커밋 코드를 강의 설명 차원에서 작성하신 것인지 아니면 정말 원칙에 따라 필요해서 호출한 것인지 궁금합니다.
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
jdbc 커서, 페이징에서 일대다 관계 데이터 뻥튀기 조회 처리 방법 질문
강의 섹션4. 데이터베이스를 지배하라. 챕터에서 아래는 JPA 방식으로 일대다 관계를 가진 데이터를 페치 조인으로 가져오는 예제 코드야.returnnewJpaCursorItemReaderBuilder<Post>().name("postBlockReader").entityManagerFactory(entityManagerFactory).queryString(""" SELECT p FROM Post p JOIN FETCH p.reports r WHERE r.reportedAt >= :startDateTime AND r.reportedAt < :endDateTime """).parameterValues(Map.of( "startDateTime", startDateTime, "endDateTime", endDateTime )) .build();근데 jdbc 커서 예제에서는 킬구형이 아래처럼 단일 테이블만 조회하는 예제를 사용했어.@Bean publicJdbcCursorItemReader<Victim> terminatedVictimReader() {returnnew JdbcCursorItemReaderBuilder<Victim>().name("terminatedVictimReader").dataSource(dataSource).sql("SELECT * FROM victims WHERE status = ? AND terminated_at <= ?") .queryArguments(List.of("TERMINATED", LocalDateTime.now())) .beanRowMapper(Victim.class) .build();}근데 내가 지금 하려고 하는 건 jdbc 커서 방식에서 일대다 관계 테이블 데이터를 조회해서 일일정산 데이터 만드는 기능으로 복습해보려고 하는데, 데이터가 뻥튀기 되서 강의 예제에서 해당 케이스를 찾아보려고 하는데, 못 찾아서 질문글 작성했어. jdbc 방식으로 일대다 관계 데이터를 Reader로 읽어와서 위에 jpa 구조로 매핑하려면 어떻게 해야하는지 알려줄 수 있어?@Bean @StepScope public JdbcCursorItemReader<OrderBatchJoinDto> jdbcCursorReader( @Value("#{jobParameters['orderDate']}") LocalDate orderDate) { LocalDateTime startOrderDate = orderDate.atStartOfDay(); LocalDateTime endOrderDate = orderDate.atTime(23, 59, 59); return new JdbcCursorItemReaderBuilder<OrderBatchJoinDto>() .name("jdbcCursorReader") .dataSource(dataSource) .sql(""" SELECT ob.ORDERS_BATCH_ID, ob.USER_ID, ob.STATUS, ob.ORDER_DATE_TIME, oib.ORDERS_ITEM_BATCH_ID, oib.ORDERS_BATCH_ID, oib.PRODUCT_BATCH_ID, oib.PRODUCT_NAME, oib.PRICE, oib.QUANTITY FROM orders_batch ob LEFT JOIN orders_item_batch oib ON ob.ORDERS_BATCH_ID = oib.ORDERS_BATCH_ID WHERE ob.ORDER_DATE_TIME BETWEEN ? AND ? ORDER BY ob.ORDERS_BATCH_ID, oib.ORDERS_ITEM_BATCH_ID """) .queryArguments(List.of(startOrderDate, endOrderDate)) .beanRowMapper(OrderBatchJoinDto.class) }public class OrderItemBatchDto { private Long id; private Long ordersBatchId; private Long productBatchId; private String productName; private int price; private int quantity; }public class OrderItemBatchDto { private Long id; private Long ordersBatchId; private Long productBatchId; private String productName; private int price; private int quantity; }
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.
[질문 내용]h2 DB 연결할 때 처음 입력하는 urljdbc:h2:~/jpashop과 이후 db 파일 생성후 입력하는 url인jdbc:h2:tcp://localhost/~/jpashop의 차이가 무엇이며 왜 이후에는 이렇게 변경해서 연결하는 건가요?
-
미해결스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
ApiExceptionController 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용] 스프링 웹 mvc 2편 중 'API 예외 처리' 수강 후 복습하는 중에 이해가 되지 않는 부분이 있어서 질문드립니다.질문은 "/api/members/ex 요청 시 왜 json이 아니라 html 이 반환되고, 상태코드는 왜 200인가" 입니다. 현재 코드에 RuntimeException을 처리하는 예외리졸버나 컨트롤러어드바이스가 없어서 스프링이 제공하는 기본 예외 처리 과정을 거쳐야 되는 상황입니다. 제가 강의를 듣고 이해한 바로는 RuntimeException 발생 시 예외가 WAS까지 전달되고 WAS는 예외 처리를 위한 내부 요청을 하게됩니다. 이 때 BasicErrorController가 호출되고, 클라이언트가 보낸 요청의 Accept 에 따라 내부 요청을 처리할 메서드를 결정하는 것으로 알고 있습니다. 저는 포스트맨에서 accept를 application/json 으로 설정했기 때문에 BasicErrorController의 error() 메서드가 실행되어 json 형식으로 응답이 될 줄 알았는데, 결과는 templates/error/500.html 이 응답되고 상태 코드도 200으로 되어 있습니다.gpt 검색을 했을 때는 templates/error/500.html이 있어서 json 응답이 무시되고 html로 응답을 했을 가능성이 있다고 했는데, 강의에서도 templates/error/500.html 이 있었는데 강의에서는 정상적으로 json 응답이 보내지고 500 으로 상태 코드가 전달되었습니다. 저는 왜 이런 응답을 받은건지 이해가 되지 않습니다.
-
해결됨카카오 면접관(개발자)이 알려주는 MSA 관점에서의 분산 트랜잭션 패턴
Orchestration 방식의 모듈 구성에 관한 질문
안녕하세요!강의를 모두 학습하고, 실습도 진행하면서 오케스트레이션 방식을 적용해보고 있는데 궁금한 점이 있어 질문드립니다. 현재 실습 환경에서는 service_1이 단일 진입점 역할을 하면서 Account 관련 로직까지 함께 처리하고 있습니다.그런데 실무에서는 이 두 역할을 분리하는 것이 맞는지 고민되고 있습니다. 제가 생각하기로는, 명확한 Orchestrator 서비스가 존재하지 않으면 각 서비스가 상황에 따라 오케스트레이션 역할을 맡게 되고, 시간이 지나면서 구조가 복잡해지고 유지보수에 많이 불리할 것 같습니다. 그래서 실제 운영 환경에서는 다음과 같은 구조가 더 적절한지 여쭙고 싶습니다.orchestration-service → account-service → ... 즉, 오케스트레이션만 담당하는 서비스를 별도로 두고, 각 도메인 서비스는 자신의 책임만 수행하도록 설계하는 것이 맞을까요? 좋은 강의 감사합니다! 많이 배우고 있습니다!
-
미해결토비의 클린 스프링 - 도메인 모델 패턴과 헥사고날 아키텍처 Part 1
초기 어플리케이션 구동 시 compose.yml 파싱 오류
spring-boot 버전 4.0.0 으로 프로젝트를 생성하면 어플리케이션 구동 시 아래와 같은 오류가 발생합니다. (현재 2025-12-08)3.x 버전으로 내리면 발생하지 않으니 참고해주세요.2025-12-08T18:40:05.881+09:00 INFO 2496 --- [splearn] [ main] .s.b.d.c.l.DockerComposeLifecycleManager : Using Docker Compose file /Users/coffeenjava/work/study/splearn/compose.yaml2025-12-08T18:40:06.285+09:00 ERROR 2496 --- [splearn] [ main] o.s.boot.SpringApplication : Application run failedtools.jackson.core.exc.StreamReadException: Unexpected character ('\' (code 92)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')at [Source: REDACTED StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION disabled); byte offset: #UNKNOWN]at tools.jackson.core.JsonParser._constructReadException(JsonParser.java:1800) ~[jackson-core-3.0.2.jar:3.0.2]
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
@Bean으로 AuthenticationProvider를 등록 시 http.authenticationProvider 함수를 이용해서 추가해줘야되나요?
AuthenticationProvider 객체를 추가하는 방법 중에 @Bean 어노테이션을 이욯하여 컨테이너에 등록하는 경우에 AuthentcationManager 객체를 가져와서 .authenticationProvider( customAuthenticationProvider() ); 이렇게 또 메서드를 호출시키도록 로직이 구현되어있는데 bean으로 올라간 customAuthenticationProvider 객체를 주입받아서 객체를 넣어주면 안되나요? @Beanpublic AuthenticationProvider customAuthenticationProvider() { return new CunstomAuthenticationProvider();} 위 메서드가 두번 호출되는거 아닌가 싶어서요
-
미해결스프링 DB 2편 - 데이터 접근 활용 기술
프록시 커넥션 객체를 반환할 때 생성하는건가요?
히카리 프록시 커넥션 객체를 커넥션을 반환할 때 생성해서 반환하는건가요?4분 5초와 5분 30초 설명부터 커넥션을 반환할 때 히카리 프록시 커넥션 객체를 생성해서 커넥션을 내부에 감싸서 반환하는 것으로 이해됩니다.이 객체가 조회할 때 생성되는 것이 아니라 반환할 때만 생성해서 반환해 주는 것인가요?즉 커넥션을 조회할 때는 그냥 커넥션을 그대로 조회하고 반환할 때만 프록시 객체를 생성해서 감싸 반환하는 것인가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
테스트 실행 시 에러 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 10분00초에서 클래스레벨에서 테스트, save와 findByName을 각각 테스트 하는 것을 보여주셨는데 저는 클래스를 테스트 할 때는 둘다 정상적으로 완료가 되는데, 이상하게 하나씩 테스트를 하면 아래의 에러가 납니다 Exception in thread "main" java.lang.NoSuchMethodError: 'java.lang.String org.junit.platform.engine.discovery.MethodSelector.getMethodParameterTypes()' at com.intellij.junit5.JUnit5TestRunnerUtil.loadMethodByReflection(JUnit5TestRunnerUtil.java:127) at com.intellij.junit5.JUnit5TestRunnerUtil.buildRequest(JUnit5TestRunnerUtil.java:102) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:43) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
-
해결됨카카오 면접관(개발자)이 알려주는 MSA 관점에서의 분산 트랜잭션 패턴
Orchestration 패턴시 트랜잭션 분리
안녕하세요 강의 열심히 보고 분산트랜잭션에 대해 배워가고 있습니다. 우선 좋은 강의 만들어주셔서 감사합니다. 강의를 보다가 OrchestrationService 소스 코드 설명해주시는 부분에서 궁금증이 생겨 질문드렸습니다. 현재 하나의 트랜잭션 내에서 출금처리에 대한 로컬 트랜잭션 처리 + 입금 서비스 REST 호출 + 입금 서비스 응답이후 SAGA 상태 업데이트 까지 처리하고 있는 것으로 보입니다. 이 경우에 입금 서비스에서 응답이 지연된다면 출금계좌에 대한 락은 지연시간만큼 대기를 하게 되고 트래픽이 몰리는 상황에서는 처리 성능이 떨어질것 같다고 판단했습니다. 그래서 제 생각에는 입금 서비스 호출 이전, 입급 서비스 호출 후 응답값에 대한 saga 업데이트, 출금 서비스 보상 처리 이렇게 3개의 로직을 각각 별개의 트랜잭션으로 선언해야 하지 않나 싶은데, 강사님의 의견이 궁금합니다!
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
SkipPolicy는 여러번 불릴 수 있는가?
skip policy 에 대한 질문Firebase message를 writer 쪽에서 사용하고,override fun shouldSkip(throwable: Throwable, skipCount: Long): Boolean { if (throwable !is BatchUnregisteredException) return true if (throwable.errorCode == FCM_UNREGISTERED_TOKEN || throwable.errorCode == FCM_MULTIPLE_TOKEN_ERROR) { throwable.tokens.forEach { fcmToken -> checkUnregisterToken(fcmToken) } } return true }skipPolicy에서 위와 같이 unregister token들을 제거해주려고 했어. 그리고, 테스트코드에서 제거 로직이 한번만 불렸는지 체크했는데, 총 3번이 불렸다고 테스트가 실패하더라구(실제 데이터는 1개라는 가정하에)GPT는 여러번 불릴 수 있다고, SkipListener 에서 onSkipWrite 에서 unregister 된 토큰을 제거하라고 하는데1. 실제로 skipPolicy는 여러번 불리는게 맞는지1-1. Skip 여부 체크1-2 Skip 처리 중에서도 체크1-3 Chunk 완료 처리 시에도 확인 이라는데 맞아 ,,?2. 보통 이러한 토큰 제거 작업이 있다면 어디서 수행하는게 맞는지 알려줘 ~
-
미해결스프링 핵심 원리 - 기본편
run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.이전까지 괜찮다가 이번에 프로젝트 생성하고 처음 run 했을때 이렇게 나오네요결과는 볼 수 있긴한데 영상처럼 나오게 다시 할 수 있나요?
-
미해결죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.
형 실무에서 배치 시스템은 어떤 식으로 HA를 구성해??
형! 퇴근도 못하고 일하다가 이제야 형 강의보면서 주말을 맞이하고 있어! 스프링 배치를 써서 분 단위, 하루 단위 KPI를 산출하는 배치 프로그램을 만드려고 하는데, 실무에서는 어떻게 HA를 구성하는 지 궁금해졌어. 가령, k8s에서 같은 배치를 돌리는 pod가 여러 개이면 배치가 동시에 돌 것 같고, pod가 한 개이면 하나의 배치 시스템이라서 위험할 것 같은데, 어떤 식으로 실무에서 하는 지 궁금해!
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
셀렉박스 챕터에서 option value에 ==배송 방식 선택== 이것을 넣은 이유가 궁금함, 이렇게 구상해도 되는지?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)(근데 잘 썻는지 모름 )[질문 내용]안녕하세요 궁금증이 생겨서 질문을 드립니다. 질문1select 박스 버튼에서<option value="">==배송 방식 선택==</option>이렇게 코드를 작성 하셨습니다.근데 저가 보기에는 이게 선택에 포함 되어야 한다는 생각 및 예전에 "배송방식 선택"을 선택optgroup 못하게 했던 것이 떠올라 찾아봐서 optgroup 이라는 키워드를 찾을 수 있었고 적용할 수 있었습니다.그래서 질문은 왜 optgroup 이라는 태그? 를 안쓰고 value로 하셨는지 궁금합니다.이렇게요. (사진 수정 적용된 부분이 안보여서)질문2하다 보니까, 상품을 판매하는 관리자 및 상품을 사는 사용자가 같이 있는 것 같다는 생각이 듭니다.전체적으로 한 곳에 만들어 놓고, 사용자 및 관리자 에 따라서 어떤것 들은을 안보여 주고 어떤것은 보여지게 처리할수 있을것 같다는 생각이 드는데요.사용자일 경우 배송방식 만 남겨 주고, 상품 수정을 - 구매 버튼으로 수정판매하는 관리자일 경우 그대로 놔둠방법 -> th:if 로 관리자일 경우 이것을 출력 아니면 미출력 이런식으로 생각해 보았는데 이게 맞는 방법 인가요?+ 질문2처럼 적용하지는 않았고, 그냥 물어 봤는데요 이렇게 질문해도 되는것인가요? 답변 부탁 드립니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
save() 메서드 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]private static final Map store = new HashMap<>();Item items = store.put(item.getId(), item);return items;이렇게 하면 항상 반환값이 기존값 반환, 없으면 null이 나올 가능성이 있나요?그래서store.put(item.getId(), item);return item; 이런식으로 코드를 작성하는건가요?영한님강의를 다 샀는데 혹시 해당 하는 내용이 어떤 강의 어디쯤 나오는지 알수 있을까요? 그부분 다시 보충 해서 공부를 해야 할거 같아서요
-
해결됨카카오 면접관(개발자)이 알려주는 MSA 관점에서의 분산 트랜잭션 패턴
common 모듈의 필요성과 다른 방법에 대한 문의
안녕하세요! 궁금증이 생겨 문의 드립니다.common 공통 모듈은 서비스간 통신 데이터 구조를 표준화해서 통일성 있게 사용하기 위해서 사용한다고 이해하였습니다. 현재, 멀티모듈로 작성된 프로젝트라서 common 모듈을 작성된 것 같은데, 각각 독립적인 repository 로 운영된다면 이를 극복하기 위해 Nexus 같은 repository 에 관리하여 공통 dto 를 관리하는 방법은 어떤지 문의 드립니다. 적다 보니, 분산 환경에 대한 질문은 아니라서 죄송합니다...
-
미해결스프링 핵심 원리 - 기본편
도메인의 정의?
[질문 템플릿][질문 내용]수업 시간에 도메인:비즈니스 도메인 객체라고 설명해주셨는데 , 그러면 주문 도메인이면 주문 영역에 대한 객체들을 명시하는걸까요. 강의 내에서 보면 단순 객체뿐만아니라 그냥 주문과 관련된 모든 것을 말하는 것 같아서요. 이 도메인 이란 개념이 너무 헷갈립니다;;
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
정상이체와 이체중 예외발생 차이
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 영한님.트랜잭션 AOP를 적용하려면 스프링 빈에 등록해야 한다고 하셨는데"이체중 예외발생" 테스트에만 @Transactional이 적용이 안되고"정상이체" 는 잘 통과하는건가요?? 정상 로직은 스프링 빈에 등록이 안되어도 트랜잭션 AOP가 적용이 되는건가요??
-
미해결실전! 스프링 데이터 JPA
@PrePersist, @PreUpdate 호출 시점 질문드립니다.
@PrePersist가 있는 메서드는 영속성 컨텍스트에 엔티티를 저장할때 즉, save()나 persist() 호출 시점에 호출되는것인가요? 아니면 flush()이후에 INSERT쿼리가 실행되기 직전에 호출되는것인가요?@PreUpdate가 있는 메서드는 엔티티의 변경 감지가 일어나고 트랜잭션 커밋 또는 em.flush()시점에 UPDATE쿼리가 실행되는데, 이 UPDATE쿼리가 실행되기 직전에 호출되는것이 맞을까요?