작업하면서 배우는 것들 17

ReactiveMongoRepository 를 위한 작업

필요의존 일단, Reactive 한 MongoRepository 를 만드려면, Spring-data-Mongo-Reactive 의존이 필요 Spring-Data-Mongo-Reactive 의존이 없다면 de.flapdoodle.embed.mongo 가 모조리 터져버림 리엑티브 스트림 기반으로 만들어진 io.projectreactor:reactor-test 의존도 필요함. testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } testImplementation 'io.projectreactor:reactor-..

MapStruct

Compile 사이클에 인터페이스에 선언 된 어노테이션을 기반으로 매핑 클래스를 Spring Bean 으로 만든다. 사용하는 이유는 Model 클래스 사이의 맵핑을 간단하게 구현하기 위함이다. Spring Bean 의 SingleTon 스코프로 자원 사용을 줄인다. 간단한 어노테이션으로도 매핑 구현클래스를 생성해낸다. 싱글톤이라는 점, 자동 주입이 가능하다는 점이 강점으로 보인다. 필요의존 org.mapstruct:mapstruct:${version} org.mapstruct:mapstruct-processor:${version} test,compile 시점에 어노테이션 프로세서를 사용해야 함 ext{ mapstructVersion="1.4.1.Final" } implementation "org.maps..

SpringFox:Swagger3 사용

스웨거 사양이 3 버전으로 올라감에 따라 변경 점을 찾은 부분과 과정을 기술 필요의존 버전이 올라감에 따라 필요의존은 단 하나이다. # swagger2 , swagger-ui, swagger, web, webflux 등이 모두 포함 implementation 'io.springfox:springfox-boot-starter:3.0.0' @EnableSwagger2 어노테이션은 불필요 스프링부트의 자동설정에 의해 자동으로 설정이 마쳐진다. 해본 예로는 @Value 어노테이션에 SpEl 을 사용하여 기술하였다. Api Info 는 공통적으로 기술될 문서의 버전과 설명을 의미한다. apiVersion : 문서의 버전 apiTitle : 문서의 이름 apiDescription : 문서에 대한 설명 termOfS..

QueryDsl Left Outer Join, Tuple, Projections

삽질한 기록은 아래! Left outer Join , on() 으로 추가 조건을 내새울 수도 있다. @Override public List findMyPostByIdWithReplies(Long id) { JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager); List fetch = queryFactory.select(post) .from(post) .leftJoin(post.replies, reply).fetchJoin().fetch(); return fetch; } 테스트 코드 @Test @Transactional @Rollback(value = false) public void joinTest(){ Post post = postRepo..

QueryDsl 과 커스텀 리포지토리를 이용한 쿼리문 사용

실무에서는 커스텀 리포지토리를 구축하고나서 QueryDsl 을 사용한다는 이야기를 접했다. 조금이나마 흉내라도 내보고, 한자라도 쳐보기위해서 했던 작업을 기록한다. 첫번째로는 재정의할 메서드를 놓은 인터페이스를 정의한다. public interface PostCustomRepository { List findMyPost(); } 두번째로는 인터페이스의 구현체를 만든다. @EnableJpaRepository 에 속성에 suffix 를 바꾸는 속성이 있으니 참고한다. QueryFactory 를 이용해서 원하는 쿼리문을 직관적으로 짜낸다. @Repository @Transactional public class PostCustomRepositoryImpl implements PostCustomRepository..

JPA Projection FindAll

JPA 에서 제공하는 Projection 은 FindAll() 메서드 정의시 리턴타입 오류가 난다. 이는 SimpleJpaRepository 에 정의된 내용 때문인 것 같다. 이를 회피하기위해서 FindAll~By() 로 메서드를 작성하여 사용한다. 이를 찾아본 이유는 Pagable , QueryDSL 과 연계하고 싶어서 이다. //프로젝션 public interface PostSummary { Long getId(); String getSubject(); Long getAccountId(); String getAuthor(); LocalDateTime getRegisterDate(); LocalDateTime getUpdateDate(); } //리포지토리 public interface PostRepo..

Vue Router 와 Href 속성

Bootstrap-Vue 사용시 주어지던 href 속성에서 일어나는 Vuex 관련 문제이다. 앞으로 더 공부해야할 부분이다. Vuex 사용시 Store 에 들어간 자원은 공통 데이터인데 이는 Actions -> Mutations -> State 에 의해 변화되는 단방향 데이터 흐름을 가진다. BootStrap-Vue 에서 주어지는 href 속성을 사용할 시에 페이지가 새로고침 되어 기존에 있던 Store 정보가 모두 날아간다. 날아가던 코드, href 속성으로 경로지정시 페이지가 새로고침된다. Dev SPA 에서는 Router 를 이용한 페이지 이동이 전제 되므로 , 이 경우 Vuex 에 들어간 Store 정보가 날아간다. 밑은 이를 어찌저찌 해결해보려고 집어넣은 router-link 태그 사용 이다. ..

Axios 사용 시 Zipkin 로그 트레이싱을 위한 wrapAxios

Spring Cloud Sleuth + Zipkin 사용 시 postman 등의 확장 프로그램 에서는 로그 기록이 Zipkin 으로 보내지지만, Axios 사용 시 로그 기록이 Zipkin 으로 보내지지 않는 점에 대한 해결을 기술 Axios 를 하나의 서비스로 Wrapping 시키는 방법을 제공하는데, 이 의존이 zipkin-axios 이다. 더이상 관리되지 않아 github.com/uschmann/zipkin-instrumentation-axios 에 zipkin-instrumentation-axios 로 버전 업이 됬다는데, 사용법은 동일해서 다행이다. zipkin-instrumentation-axios 를 사용해본 결과 zipkin 이랑 충돌이 나서, 이 부분은 공부를 해봐야겠다. 일단 과정으로 ..

Uncaught ReferenceError: regeneratorRuntime is not defined

비동기 처리 방식내용을 babel 이 webpack 을 load 할때 regeneratorRuntime 으로 변환해서 생기는 문제라고 한다. 필요한 모듈이 있는데 이는 babel-polyfill 이다. npm i --save babel-polyfill main.js 를 babel-polyfill 을 이용해서 번들링 하게 해주면 되겠다. // webpack.js module.exports = { // entry: './src/main.js', entry: { app: ['babel-polyfill','./src/main.js'] }, ... }