본문 바로가기

Java & Kotlin100

[SpringBatch] 멀티쓰레드 Step 멀티쓰레드 Step TOCHE 프로젝트를 진행하면서 대용량 배치 처리를 해야하는 일이 생겼다. 기존의 배치는 chunk 기반의 단순한 배치이다. private Step useDeckStatsStep() { return stepBuilderFactory.get("useDeckStatsStep") .chunk(chunkSize) .reader(useDeckStatsReader()) .processor(useDeckStatsProcessor) .writer(useDeckStatsWriter()) .build(); } 위와 같은 Step을 10개의 쓰레드를 이용해 멀티쓰레드 환경으로 실행해야 했다. private final int poolSize = 10; ... private Step useDeckStatsS.. 2022. 7. 2.
[JPA] illegally attempted to associate proxy with two open Sessions 에러 illegally attempted to associate proxy with two open Sessions 에러 SpringBatch와 Jpa를 사용하면서 illegally attempted to associate proxy with two open Sessions에러를 만나게 됐다. 당연하지만 처음 보는 에러는 정말 당황스럽다. illegally attempted to associate proxy with two open Sessions 에러는 두개 session에서 같은 proxy를 다루려 하면서 나타나는 에러다. public MatchInfo process(MatchInfo matchInfo) throws Exception { initializeUnitsAndAugments(matchInfo);.. 2022. 7. 1.
[JPA] Cascade persist와 연관관계 Cascade.persist와 연관관계 JPA를 배우고, 개발을 진행하면서 자주 사용하지 않을거라 생각한 cascade.persist에 대해 정리하려 한다. [JPA]영속성 전이 CASCADE에서 정리했다시피 Cascade.persist 옵션은 부모를 영속화할 때 자식도 영속화하는 옵션이다. 예를 들어 부모 Entity에 oneToMany관계인 자식 Entity를 List로 넣어두고, 부모 Entity를 영속화(persist)한다면 자식 Entity도 연쇄적으로 persist되는 것이다. 주의하고자 하는 부분 하지만 단순히 부모 Entity에 자식 Entity를 넣어주는것 만으로는 정확한 Persist가 이루어지지 않는다. 자세하게 예를 들어보자. 먼저 Home과 Person은 1 : N 관계로 Casc.. 2022. 6. 24.
[QueryDSL] oneToMany 관계에서 여러 개의 fetchJoin 사용하기 oneToMany 관계에서 여러 개의 fetchJoin 사용하기 QueryDSL을 사용하면서 Data Jpa에서 해결하기 복잡한 쿼리를 쉽게 사용하고 있다. 하지만 하나의 엔티티가 두개 이상의 자식 엔티티에 oneToMany 관계로 구성되어있을 때 해당 자식 엔티티를 모두 fetchJoin하려 할 때 문제가 발생했다. 문제 현재 Home 엔티티는 Person과 Dog 엔티티와 OneToMany 연관관계로 구성되어있다. @Test void oneToManyFetchJoinTest() throws Exception { //given Home home1 = Home.builder() .name("home1") .build(); em.persist(home1); Home home2 = Home.builder().. 2022. 6. 24.
[Java] replaceAll, replaceFirst 에서 특수문자 인식하기 replaceAll, replaceFirst 에서 특수문자 인식하기 개발 도중 url 의 가장 첫 . 앞에 특정한 문자를 추가해야하는 상황이 생겼다. @Test void javaReplaceDotTest() throws Exception { String url = "aaa.bbb.ccc.ddd"; String replaceUrl = url.replaceFirst(".", "gg"); Assertions.assertThat(replaceUrl).isEqualTo("aaaggbbb.ccc.ddd"); } 위와 같이 내가 의도한 상황은 aaaggbbb.ccc.ddd이지만 위와 같은 결과가 나타났다. 이는 replace와 replaceAll, replaceFirst의 매개변수 차이로 인해 나타나는 현상이다. r.. 2022. 6. 24.
[Spring] SpringBoot 기본 TimeZone 설정하기 SpringBoot 기본 TimeZone 설정하기 개발을 진행하고, 배포하는 도중 IDE에서는 정상적으로 Asia/Seoul으로 설정되던 TimeZone이 원격 서버에서 정상적으로 설정되지 않음을 알았다. 첫 번째 수정 리눅스 서버 자체의 서버시간과는 별개로 작동하는 것을 확인하였고, Spring 실행 시 argument로 Asia/Seoul으로 설정하도록 했다. java -Duser.timezone=Aisa/Seoul -jar ~~.jar 와 같이 -Duser.timezone을 추가하여 SpringBoot의 기본 TimeZone을 설정하였다. 두 번째 수정 @PostMapping public void setTimeZone() { TimeZone.setDefault(TimeZone.getTimeZone(.. 2022. 6. 13.
[Spring] UnmarshallingFailureException 에러 해결하기 UnmarshallingFailureException 에러 해결하기 Spring Batch 에서 StaxEventItemReader 사용 중 xml 파일을 읽어 객체에 매핑하는 과정에 Staorg.springframework.oxm.UnmarshallingFailureException가 발생했다. org.springframework.oxm.UnmarshallingFailureException: XStream unmarshalling exception; nested exception is com.thoughtworks.xstream.security.ForbiddenClassException: com.heekng.springbatch.Customer 에러가 발생한 이유 oxm와 xstream를 사용하기 위해.. 2022. 6. 6.
[Spring] Validation을 이용해 검증하기 Validation을 이용해 검증하기 일반적인 웹 요청에서 검증은 클라이언트단과 서버단으로 나뉜다. 클라이언트단에서 요청 파라미터를 검증하면 사용자의 사용성에 장점이 있지만, 어떤 요청이 들어올 지 모르기 때문에 서버단에서도 파라미터에 대한 검증이 꼭 필요하다. Spring은 이러한 검증을 지원한다. 이를 알아보자. BindingResult BindingResult는 스프링이 제공하는 검증 오류 처리방법중 하나이다. public String addItem( @ModelAttribute Item item, BindingResult bindingResult, RedirectAttributes redirectAttributes, Model model ) { ... } 위와 같이 @ModelAttribute 어.. 2022. 5. 29.
[Spring Batch] @JobScope와 @StepScope @JobScope와 @StepScope Scope란? 스프링 컨테이너에서 빈이 관리되는 범위 singleton, prototype, request, session, application이 있으며 기본은 singleton으로 생성된다. 스프링 배치 스코프 @JobScope, @StepScope @Bean @JobScope public Step step1(@Value("#{jobParameters['message']}") String message) { return stepBuilderFactory.get("step1") .tasklet(tasklet1(null)) .build(); } @Bean @StepScope public Tasklet tasklet1( @Value("#{jobExecutionCont.. 2022. 5. 28.