inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

partitionStep의 itemReader에 관하여

미해결

스프링 배치

안녕하세요.! 대용량 배치를 개발하기 위해 파티션스텝을 이용하여 개발중입니다. 파티션 메인스텝에 워커 스텝을 지정하고 실행하였는데요. Thread1의 itemReader가 1만건의 데이터를 fetch하는 동안 Thread2의 itemReader는 Thread1의 itemReader의 fetch가 끝날때까지 기다리는건가요?? 제가 기대한 로그는 Thread1 : result set row 100 Thread2 : result set row 100 Thread1 : result set row 200 Thread2 : result set row 200 동시에 스레드가 실행되어 위와 같이 병렬적으로 itemreader가 수행되어야 한다고 생각하는데 실제 로그는 Thread1 : result set row 100 Thread1 : result set row 200 Thread2 : result set row 100 Thread2 : result set row 200 위와 같이 Thread1의 itemreader가 끝이 나야 Thread2의 itemreader가 동작하는것 같습니다... 제 생각이 맞을까요? 맞다면 왜 실제로그는 동기적인 방식으로 되는지 궁금합니다.

  • spring-boot
  • spring-batch
do 댓글 1 좋아요 0 조회수 367

배치데이터가 쌓였을 때 속도 문제

미해결

스프링 배치

안녕하세요 선생님 강의 듣고 프로그램 배포해서 잘 운영하고 있습니다. 다름이 아니라 운영중에 데이터가 점차 쌓이면서 데이터가 많아지니 배치 속도가 조금씩 느려지더라고요. 아직 운영에 큰 이슈는 없지만 나중에는 문제가 될 수도 있겠다 싶어 질문드립니다. 보통 이런 경우에는 어떤 방법으로 속도를 개선 하는지 궁금합니다. 당장 생각 나는 방법이 오래된 날짜의 데이터는 지우는 방법인데 BATCH_JOB_EXECUTION 의 CREATE_TIME을 기준으로 지우려고 합니다. 메모리에 JOB_INSTANCE_ID를 저장하지 않고 처리 하려면 데이터 삭제 순서가 BATCH_JOB_INSTANCE 테이블이 먼저가 되는 상황이 되는데 외래키를 지우고 배치 프로그램을 운영해도 문제가 되지 않을지 궁금합니다. 쿼리 DELETE FROM BATCH_JOB_INSTANCE WHERE JOB_INSTANCE_ID IN ( SELECT DISTINCT JOB_INSTANCE_ID FROM BATCH_JOB_EXECUTION) 진행중인 프로젝트에 바로 사용한다고 시간이 없어 급하게 띄엄띄엄 들어서 못들은 강의가 많습니다. 혹시나 강의에 언급하신 내용이라면 죄송합니다. 훌륭한 강의 덕분에 프로젝트 무사히 완료 할 수 있었습니다. 감사합니다.

  • spring-boot
  • spring-batch
권순형 댓글 1 좋아요 0 조회수 677

6분28 초 카테고리 부모와 자식

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

@ManyToOne @JoinColumn(name = "parent_id") private Category parent; @OneToMany(mappedBy = "parent") private List<Category> child = new ArrayList<>(); 부모와 자식을 이렇게 설정해준다는데, 부모를 Many To One 자식을 One To Many 로 해주는게 이해가 안갑니다. 왜 이렇게 연관관계를 설정해 줘야 하는건가요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
김지수 댓글 1 좋아요 1 조회수 831

BatchStatus 와 ExitStatus 의 차이점이 뭔지 모르겠습니다.

미해결

스프링 배치

안녕하세요 선생님, 제가 강의를 계속 듣다가 너무 헷갈려서 질문 올립니다. 섹션 6 Transition - 배치상태 유형 (BatchStatus / ExitStatus / FlowExecutionStatus) 를 듣고 계속 머릿속으로 BatchStatus 와 ExitStatus 둘 간의 차이점을 이해하려고 해도 도통 이해가 되지 않아서 질문드립니다. PPT 에서는 BatchStatus, ExitStatus 를 다음과 같이 정의합니다. - BatchStatus : JobExecution 과 StepExecution 속성으로 Job 과 Step 의 종료 후 최종 결과 상태가 무엇인지 정의 - ExitStatus : JobExecution 과 StepExecution 의 속성으로 Job 과 Step 의 실행 후 어떤 상태로 종료되었는지 정의 ... 라고 작성되어 있는데요. BatchStatus 에서 설명하는 "종료 후 최종 결과 상태" 라는 게 결국은 ExitStatus 에서 말하는 "실행 후 어떤 상태로 종료되었는지" 와 똑같은 말로 보입니다. 혹시 이 둘간의 "차이"와 "용도"가 뭔지 조금만 이해하기 쉽게 알려주실 수 없을까요?

  • spring-boot
  • spring-batch
식빵 댓글 1 좋아요 2 조회수 764

flow 위에 jobparameters를 사용하기 위해서는 어떤 scope를 정의해줘야 하나요?

미해결

스프링 배치

안녕하세요, 강사님! job > flow > step으로 구성되어 있는데 flow위에 jobparameters를 사용하기 위해서는 어떤 scope를 정의해줘야 하나요? step scope is not active라고 자꾸 오류가 나네요. 강의를 봐도 잘 이해가 안 가서요. 아직 제가 개념이 덜 잡혔나봅니다. ㅠㅠ 답변 감사드립니다! 코드입니다! @Slf4j @Getter @NoArgsConstructor public class CreateDateJobParameter { private String startDate; private String endDate; @Value("#{jobParameters[startDate]}") public void setStartDate(String startDate) { this.startDate = startDate; } @Value("#{jobParameters[endDate]}") public void setEndDate(String endDate) { this.endDate = endDate; } } @Slf4j @RequiredArgsConstructor @Configuration public class OrderProcessingJobConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; private final CreateDateJobParameter jobParameterCreator; @JobScope @Bean public CreateDateJobParameter jobParameterCreator() { return new CreateDateJobParameter(); } @Bean public Job orderProcessingJob() { return jobBuilderFactory.get("orderProcessingJob") .incrementer(new UniqueRunIdIncrementer()) .start(fetchOrderDataFlow()) .next(getOrderListFlow()) .split(taskExecutor()) .add() .end() .build(); } @Bean @StepScope public Flow fetchOrderDataFlow() { log.debug(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>fetchOrderDataFlow"); Flow flow1 = new FlowBuilder<Flow>("flow1") .start(fetchOrderDataStep1()) .build(); Flow flow2 = new FlowBuilder<Flow>("flow2") .start(fetchOrderDataStep2()) .build(); Flow flow3 = new FlowBuilder<Flow>("flow3") .start(fetchOrderDataStep3()) .build(); Flow flow4 = new FlowBuilder<Flow>("flow4") .start(fetchOrderDataStep4()) .build(); Flow flow5 = new FlowBuilder<Flow>("flow5") .start(fetchOrderDataStep5()) .build(); FlowBuilder<SimpleFlow> flowBuilder = new FlowBuilder<>("fetchOrderDataFlow"); flowBuilder.split(taskExecutor()) .add(flow1, flow2, flow3, flow4, flow5); return flowBuilder.build(); } @Bean public Step fetchOrderDataStep1() { return createFetchOrderDataStep("fetchOrderDataStep1", "store1", jobParameterCreator.getStartDate(), jobParameterCreator.getEndDate()); } ... }

  • spring-boot
  • spring-batch
1hany number 댓글 1 좋아요 0 조회수 719

프로퍼티와 메서드의 초기화 질문입니다.

미해결

자바 ORM 표준 JPA 프로그래밍 - 기본편

public class student { public int score; public int getScore() { return this.score; } } 위와 같은 코드가 있고 연관관계 매핑이 되어있어 현재 프록시 상태라고 가정했을 때 점수를 얻기 위해 student.score를 사용 하면 영속성 컨텍스트로부터 초기화를 받지 못하고, student.getScoret()를 하면 초기화를 받는 건가요 ? 만약 프로퍼티 접근을 사용했을 때 초기화를 받지 모한다면 studnet.score 안에는 무슨 값이 들어있게 되는 건가요 ?

  • java
  • jpa
댓글 1 좋아요 0 조회수 344

fetch join 과 EAGER

미해결

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예 [질문 내용] 제가 이해한게 맞을까요? 일단 기본적으로 type을 LAZY 로 하는 이유는 조회할때 한 방에 다른 엔티티까지 쿼리가 나가고 그거에 연관된 엔티티까지 쿼리가 나가면 비효율 적이다. 그래서 LAZY 를 쓰는데 조회할때 다른 Entity 의 값도 가져오려면 LAZY 타입이니 쿼리가 많이 나가서 fetch JOIN 으로 한 쿼리로 연결 시킨다. 그러면 EAGER 바꾸면 될 것같지만, EAGER 는 예측할 수 없는 문제도 있고, 다른곳에서 조회할때는 또 다른 엔티티의 값이 필요가 없을 수도 있기 때문에 기본은 LAZY로 해두고 다른 엔티티의 값이 필요한 특수한 경우에만 fetch JOIN 을 한다.

  • java
  • spring
  • spring-boot
  • jpa
dionisos198 댓글 1 좋아요 1 조회수 430

와 진짜 대박이네요 디폴트 파라미터 하나로 이렇게 편해질수가 ㅜ

미해결

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 자바 스프링에서는 테스트용 생성자 메서드가 있어도, 매번 일일히 null을 넣어준다거나 하는 문제점들이 있어서 결국 Builder를 사용했었는데 코틀린에서는 롬복 Builder가 지원되지 않는다고 해서 엄청 고민 중이였습니다 근데 이번 강의 보니까 그냥 온전한 객체 만들어주는 팩터리 메서드 하나 만들어놓고 테스트용으로 필요한 인자 값들만 설정해주면 되는 거였군요 진짜 미쳤다.. 갓틀린.. 잘 배워갑니다..

  • java
  • spring
  • kotlin
  • spring-boot
  • 리팩토링
euni 댓글 1 좋아요 1 조회수 343

springbatch partition vs pararell 질문드립니다.

미해결

스프링 배치

안녕하세요. 정수원 강사님 스프링 배치 강의 잘 보고 있습니다. 많은 도움 받고 있어요. 정말 감사드립니다. 토이 프로젝트를 진행하고 있는데 막상 구현하려니 쉽지 않네요. 어떤식으로 설계하면 좋을지 조언 구합니다. 구현하려는 부분은 아래와 같습니다. rest api로 가맹점 5곳에 각각 api를 호출하여 주문id의 총 개수와 주문id 목록( total number of orderId and orderIds) 을 가져와서 DB에 저장합니다. 가맹점 5곳에서 받아온 total number of orderId and orderIds 를 DB에서 조회해와서 해당 목록을 chunk 사이즈로 나누어서 각각 rest api로 가맹점 5곳에 호출하여 목록을 가져와서 DB에 저장합니다. partiton과 pararell step을 이용해서 구성하려고 하는데 설계부터가 만만치 않네요. 1은 pararell step을 이용하여 병렬로 각각 수행하도록 구현하려고 하고, 2는 총 개수와 grid 개수를 가지고 pagination 혹은 partiton을 이용해서 구현하려고 하는데 어떻게 해야할지 감이 잘 안 잡힙니다. 혹은 혼합하여 사용할 수도 있을까요? 강사님께서 부연설명 덧붙여 주신다면 큰 도움이 될 것 같습니다. 감사드립니다.

  • spring-boot
  • spring-batch
1hany number 댓글 1 좋아요 0 조회수 416

연관관계 메서드의 위치는 핵심적으로 컨트롤 하는 쪽이 무슨 말일까요?

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

24분 30초부터 연관관계 메서드에 관련해서 설명해주시는데 연관관계 메서드의 위치는 핵심적으로 컨트롤 하는 쪽에 있는 것이 좋다 이게 무슨 말인지 잘 이해가 되지 않습니다 ㅠㅠ

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 361

updateItem질문입니다.

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

@PostMapping("/items/{id}/edit") public String updateItem(@PathVariable Long id, @ModelAttribute Item item) { Item findItem = itemService.findById(item.getId()); //더티 체킹 findItem.setId(item.getId()); findItem.setName(item.getName()); findItem.setPrice(item.getPrice()); findItem.setStockQuantity(item.getStockQuantity()); findItem.setAuthor(item.getAuthor()); findItem.setIsbn(item.getIsbn()); return "redirect:/items"; } 강의를 보지 않고 스스로 코드를 짜보고 있는데 이렇게 하니까 수정내역이 반영 되지 않더라구요 스스로 생각해봤을 때는 다음 2가지 이유 중 하나일 것 같은데 이유가 이유가 무엇인가요 ㅠㅠ? findItem은 영속성 컨텍스트가 관리하지 않는 객체가 된 것이다. 따라서 더티체킹이 되지 않는다. 영속성 컨텍스트가 관리하는 엔티티는 맞지만 Controller에는 트랜잭션이 없어서 반영이 안되는 것이다.

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 658

@Param의 존재 이유>?

미해결

실전! 스프링 데이터 JPA

@EntityGraph(attributePaths = "team") List<Member> findEntityGraphByUsername(@Param("username")String username); 이번 강의를 복습하다 보니까 강사님께서 @Param을 사용하셨더라구요.(강의 20:59) findByAge(), findOptionalByUsername()과 같은 메소드는 @Param 애노테이션 없이도 잘 동작 했는데 따로 특별한 이유가 있는 것일까요?

  • java
  • spring
  • spring-boot
  • jpa
댓글 1 좋아요 1 조회수 536

fetchResult() deprecated

미해결

실전! Querydsl

됐던데 앞으로는 강의의 searchPageComplex와 같은 방법 (content따로, total따로)으로만 구현하고 사용하면 되는 건가요 ? searchPageSimple 부분은 필요가 없는 건가요?

  • java
  • jpa
댓글 1 좋아요 0 조회수 1368

tuple자료구조가 어떻게 되어 있는 건가요 ?

미해결

실전! Querydsl

@Test public void tupleProjection() throws Exception { List<Tuple> result = queryFactory .select(member.username, member.age) .from(member) .fetch(); System.out.println("result = " + result); for (Tuple tuple : result) { String username = tuple.get(member.username); Integer age = tuple.get(member.age); System.out.println("username = " + username); System.out.println("age = " + age); } } result = [[member1, 10], [member2, 20], [member3, 30], [member4, 40]] username = member1 age = 10 username = member2 age = 20 username = member3 age = 30 username = member4 age = 40 출력값이 위와 같은데 .get()메소드로 꺼내는 걸로 보면 Map과 같은 자료구조인건가 싶기도 하면서, 통째로 출력하면 List<List<>>와 같은 자료구조의 모습이더라구요 tuple은 어떤 자료구조인가요?

  • java
  • jpa
댓글 1 좋아요 0 조회수 1237

join메서드 궁금증입니다 ..

미해결

실전! Querydsl

List<Member> result = queryFactory .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); 위의 QueryDSL문을 sql문으로 번역하면 select * from member as m join team as t on m.team _id = t.team _id where t.name ='teamA' 가 맞나요? 관계형DB를 객체 다루듯이 사용하기 위해 Member안에는 Team 클래스가 있고, Team 클래스 안에는 Member 클래스가 있지만 실제로는 .join(member.team, team) 와 같은 코드를 작성하면 내부적으론 DB의 테이블에 가서 외래키와 기본키를 비교해서 값을 가져오는 건가요 ?

  • java
  • jpa
댓글 1 좋아요 0 조회수 496

제공되는 html 파일을 사용해도 될까요?

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

QueryDSL까지 강의를 다 듣고 난 이후에 게시판이나 쇼핑몰 같은 포트폴리오를 만들기전에 자그맣게 배운걸 써보고 싶은데 html,css,js를 모르다보니 view쪽을 처리할 수가 없더라구요. 그래서 혹시 활용1편에 제공되는 HelloShop view단 파일을 사용해도 될지 궁금합니다. 깃허브에 올리려고 하고 백엔드단 코드는 전부 스스로 짤 생각입니다.!

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 337

지연로딩과 fetchJoin 성능 차이

미해결

실전! 스프링 데이터 JPA

즉시로딩을 사용하면 Member 객체를 불러 올 때 1+N문제가 발생하고 Lazy로딩을 사용하면 Team 객체를 사용할 때 쿼리문이 나가서 즉시로딩이든 지연로딩이든 결국 1+N 문제가 생기는 게 맞나요 ? 이 1+N 문제의 해결방법으로 fetchJoin이 나온 것 같은데 지연 로딩, 즉시 로딩보다 무조건 fetchJoin이 이점이 있는 것 아닌가요? 왜 디폴트값으로 지연로딩으로 설정하고 fetchJoin을 선택해서 사용하는지 궁금합니다. 기본적으로 fetchJoin을 사용하고 연관관계에 있는 객체를 사용하지 않을 것 같은 경우에만 지연로딩을 선택적으로 사용하는게 더 편하지 않나요? 사용하지 않는 객체를 가져오는 fetchJoin의 쿼리문 몇 줄이 성능에 그렇게 큰 영향을 미치나요?

  • java
  • spring
  • spring-boot
  • jpa
댓글 2 좋아요 1 조회수 652

2분 정도에 이 코드는 안되는 이유가 있나요?

미해결

실전! 스프링 데이터 JPA

Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepository.save(teamB); memberRepository.save(new Member("member1", 10, teamA)); memberRepository.save(new Member("member2", 10, teamB)); 강의에서 이렇게 한번에 하려다가 Member를 생성해주고 따로 save를 해주던데 한번에 하면 안되는 이유가 있을까요 ?

  • java
  • spring
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 331

Page 자료구조에 관해 질문입니다.

미해결

실전! 스프링 데이터 JPA

PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Direction.DESC, "username")); int age = 10; //when Page<Member> page = memberRepository.findByAge(age, pageRequest); PageRequest.of 코드에서 첫 번째 파라미터가 무엇을 의미하는지 헷갈립니다. PageRequest.of 의 2번째 파라미터는 한 페이지의 element 개수이고(limit), 3번째 파라미터는 정렬 조건이 맞나요? List<Member> content = page.getContent(); assertThat(content.size()).isEqualTo(3); assertThat(page.getTotalElements()).isEqualTo(5); assertThat(page.getNumber()).isEqualTo(0); assertThat(page.getTotalPages()).isEqualTo(2); assertThat(page.isFirst()).isTrue(); assertThat(page.hasNext()).isTrue(); page.getContent()는 현재 페이지의 데이터를 가져오는 메소드인가요? page.getNumber()는 현재 페이지를 가져오는 메소드인가요? Page는 책처럼 0,1,2,3 ... 이렇게 페이지가 있는 거고 Content는 그 Page안에 있는 데이터를 의미하는 건가요? List<List<data>> 와 같은 구조로 되어 있는 것일까요? Page와 Content의 자료 구조가 어떻게 되어있는지가 궁금합니다.

  • java
  • spring
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 665

@Transactional 에 따른 변경감지 작동여부 질문

해결됨

자바 ORM 표준 JPA 프로그래밍 - 기본편

안녕하세요! 먼저 좋은 강의 감사하다는 말씀 드립니닷! 개인 프로젝트 수행 중에, 변경 감지와 관련한 이슈를 발견해서 질문드립니다. 물론 개인 프로젝트 관련한 질문은 안 받아주시는 것을 충분히 숙지하고 있지만, 개념적인(?) 내용이라 혹시 도움 받을 수 있을까 싶어 질문드립니다. (사실 아무리 생각해봐도 모르겠습니다..ㅠㅠ) 상황 한 트랜잭션 안에서, 엔티티 객체를 만들고 이를 영속성 컨텍스트에 올려 id 값을 받아와 이 id 값을 가지고 해시값을 만들어 해당 해시값을 다시 엔티티 객체에 할당하려 합니다. 문제 문제는 위 작업을 수행하는 메소드의 @Transactional 위치에 따라 변경감지가 될 때가 있고 안 될 때가 있다는 점입니다. 위 쪽의 create(ShortUrlCreateRequest request) 메서드를 호출하여 아래에 오버로딩된 create(String originUrl, Period expirationPeriod) 를 통해 위에 서술한 작업을 하려합니다. (Repository 객체는 Data Jpa Repository를 사용하고 있습니다.) create(ShortUrlCreateRequest request) 를 호출하면, 아래의 create(String originUrl, Period expirationPeriod) 메서드에 @Transactional 을 붙였음에도 아래와 같이 insert 문만 호출됩니다. 이번에는 위의 create() 에 @Transactionl 붙였을 때 입니다. insert 문과 update 문 모두 의도한 대로 호출되는 것을 확인할 수가 있습니다. 트랜잭션 진입 시점이 다른 것인데 왜 이에 따라 변경감지 가 일어나고/ 안 일어나는 지 감을 잡지 못하겠습니다. 일말의 힌트를 주실 수 있을까요? 항상 영한님과 서포터님들께 감사드립니닷!!

  • java
  • jpa
동해물과백두산이마르고닳도록 댓글 1 좋아요 1 조회수 987

인기 태그

인프런 TOP Writers

주간 인기글