Yun(Yun)https://github.com/cheese10yun

2021-02-12
Spring Batch를 이용해서 데이터베이스에 저장되어 있는 정보를 CSV file로 저장을 하는 방법에 대해서 작성해보겠습니다. CSV Writer 데이터 흐름 payment csv 데이터의 흐름은 간단합니다. payment table -> payment.csv 으로 변경됩니다. payment table의 불필요한 칼럼 id, created_ay , updated_at은 빼고 amount , order_id 만 CSV에 저장하겠습니다. Batch Code Job (1): 동일한 job parameter으로 여러 번 job을 실행시켜도 문제없게 run.id 를 증가시킵니다. (2): beforeJob payment 100 rows를 insert 합니다....
2020-09-16
해당 코드는 Github 공개되어 있습니다. 용어 명칭 설명 라우트(Route) 라우트는 목적지 URI, 조건자 목록과 필터의 목록을 식별하기 위한 고유 ID로 구성된다. 라우트는 모든 조건자가 충족됐을 때만 매칭된다 조건자(Predicates) 각 요청을 처리하기 전에 실행되는 로직, 헤더와 입력돤값 등 다양한 HTTP 요청이 정의된 기준에 맞는지를 찾는다. 필터(Filters) HTTP 요청 또는 나가는 HTTP 응답을 수정할 수 있게한다. 다운스트림 요청을 보내기전이나 후에 수정할 수 있다. 라우트 필터는 특정 라우트에 한정된다....
2020-08-24
동일한 Bean 내에서 @Transactional 을 사용하는 경우 예상했던 것과 다르게 동작할 수 있습니다. 발생 원인과 해결 방법에 대해서 정리한 포스팅입니다. 위 코드는 Controller 에서 something() -> save() 을 차례대로 호출하는 코드입니다. save() 메서드에서는 특정 경우 RuntimeException 을 발생시키고 있습니다. save() 메서드에 @Transactional 때문에 해당 반복문 전체에 트랜잭션이 묶이게 되고 예외가 발생하면 전체가 Rollback될 것이라고 예상됩니다. 위 와 같이 해당 컨트롤러를 호출하고 결과를 조회하면 아래와 같습니다....
2020-07-08
해당 코드는 Github 에서 확인할 수 있습니다. JPA + Querydsl group_concat 사용법 Querydsl 기반으로 작업하다 보면 sql 함수가 필요한 경우가 있습니다. 대표적으로 sum(), max() 등이 있고 해당 함수는 Querydsl 자체에서 지원해 주고 있습니다. 하지만 group_concat 과 같은 함수를 사용하기 위해서는 별도의 설정이 필요합니다. 본 포스팅의 내용은 Mysql 환경에서 JPA + Querydsl 조합에서 group_concat 을 사용하는 방법을 정리한 것입니다. Mysql 환경에서 group_concat 을 사용하기 위해서 별다른 설정 없이...
2020-04-07
해당 코드는 Github 에서 확인할 수 있습니다. 대부분의 애플리케이션은 외부 인프라스트럭처와 통신하면서 진행됩니다. 대표적인 외부 스트럭처는 외부 API들이 있습니다. 이런 외부 인프라스트럭처는 Mocking 해서 원하는 응답 값을 지정하고 검증하고 싶은 부분을 검증을 진행하는 것이 흔한 패턴입니다. 대표적으로 Mockito 프레임워크가 있으며 Mock 테스트는 Spring Guide - 테스트 전략 : Service 테스트 , RestTemplate Mock 기반 테스트 하기 에서 포스팅한 적 있습니다. 그런데 이런 식의 Mock 테스트 코드는 문제없지만, 실제 구동 환경(Local, Sandbox, Beta)에서는 문제가 있을 수 있습니다....
2020-02-29
최근 JPA를 3년 가까이 사용하면서 개인적인으로 선호하는 패턴들을 한 번 정리하려고 한다. 어디까지 개인적으로 선호하는 패턴으로 굳이 이런 가이드를 따르지 않아도 된다. 컬럼 에노테이션 사용 칼럼 에노테이션과 멤버 필명이 동일한 경우 칼럼에노테이션을 생략하는 경우도 있다. 그래서 일치하지 않은 것들만 작성하는 방법도 있지만 나는 모든 멤버 필드에 칼럼 에노테이션을 작성하는 패턴을 선호한다. 칼럼 에노테이션을 통해 nullable , unique ,...
2020-02-25
스프링 프로젝트에서는 외부 API 모듈을 RestTemplate를 이용해서 호출하는 경우가 많습니다, 이런 경우 RestTemplate을 기반으로 Mock 테스트를 보다 쉽게 진행할 수 있습니다. 왜 Mock 기반 테스트를 진행 해야하나 ? 외부 인프라스트럭처를 테스트 코드를 작성할 때는 mock 기반으로 테스트를 진행해야 합니다. 외부 인프라스트럭처에는 대표적으로 외부 API가 있습니다. 그런데 왜 Mock 기반으로 테스트해야 할까요? 외부 환경이기 때문에 제어권이 우리 밖에 있습니다. 그래서 우리 코드의 테스트를 위해서 Request, Response가 우리가 주어진 값인 경우 정상 동작하는지 테스트하기 위함입니다....
2020-02-04
JPA Bulk 작업을 진행할 때 영속성 컨텍스트의 메커니즘을 이해하지 못한 상태라면 예상하지 못한 문제를 만날 수도 있게 됩니다. 어떤 문제가 있고 이 문제가 왜 발생하는지 정리해 보았습니다. 코드 코드는 간단합니다. team_1 , team_2 ... team_10 을 저장하고 query dsl update를 이용해서 team name 을 none name 으로 변경하는 것입니다. 그리고 변경 제대로 변경이 되었는지 확인하는 확인하는 반복문이 있습니다. 로그를 보면 team name 1 ~ 10까지 제대로 출력되는 것을 확인할 수 있습니다....
2020-01-28
엔티티 객체 엔티티 관계는 위와 같습니다. 테스트 코드 teamA 를 영속화 이후, member1 , member2 를 영속화를 진행합니다. member1 , member2 는 teamA 소속이 됩니다. 그리고 fetch join 통해서 teamA 와 teamA 에 속한 member 를 조회하고 있습니다. 그리고 then 절에서 member1 , member2 가 teamA 에 있는지 검증을 진행합니다. 이 테스트 코드는 실패합니다. 디버깅 모드로 보면 memebers szie가 0인 것을 확인할 수 있습니다. 그렇다면 실제 데이터베이에 member1 , member2 가 영속화가 안 된 것일 까요?...
2019-11-28
해당 코드는 Github 를 확인해주세요. Spring boot 2.2 버전부터는 Junit5 디펜던시를 기본으로 포함하고 있습니다. Junit5 주요 테스트 어노테이션과 Spring boot에서 활용법을 정리해보았습니다. @ValueSource @ValueSource 어노테이션을 사용하면 배열을 값을 테스트 메서드로 손쉽게 전달할 수 있습니다. Int, String 이 이외에도 기본형 데이터 타입을 지원하고 있습니다. EnumSource @EnumSource 어노테이션을 통해서 Enum을 효율적으로 테스트 할 수 있습니다. 각 분기를 뜻하는 Enum을 위와 같이 정리했습니다....
더보기