본문 바로가기
반응형

Java6

Spring Cloud Gateway가 netty 기반 reactive web application으로 구동되는 이유 개요 Spring Cloud Gateway 애플리케이션을 구동하게 되면 기존의 임베디드 톰켓 기반의 Spring Boot Web 애플리케이션과는 다르게 Netty 기반의 비동기 통신을 지원하는 형태의 웹 애플리케이션으로 실행됩니다. 이 문서에서는 왜 이러한 현상이 발생하는지 알아봅니다. WebApplicationType 먼저 SpringBoot에서는 웹 애플리케이션 구동시 org.springframework.boot.WebApplicationType을 정하게 됩니다. WebApplicationType에는 세가지 타입이 존재합니다. WebApplicationType.SERVLET → 애플리케이션을 서블릿 기반의 웹 애플리케이션으로 실행하며 임베디드 서블릿 웹서버(기본적으로 tomcat 기반)로 실행한다. .. 2022. 4. 21.
JPA 엔티티 복합키(Composite Primary Keys) 매핑 개요 JPA를 사용하여 1:m, n:1 관계 테이블을 엔티티 매핑할 때 복합 키(Composite Primary Keys)를 가진 테이블을 엔티티 매핑 시, 제가 겪은 문제점과 해결방안을 정리해보겠습니다. 문제 문제는 아래의 [USR_TERMS_AGRMT] 테이블을 엔티티 매핑하던 중 발생했습니다. 아래와 같이 1:m, n:1 관계 테이블은 참조하는 테이블들의 PK를 PFK로 사용하여 구성되는 경우가 종종 있습니다. 저는 처음에 아래와 같이 [USR_TERMS_AGRMT] 객체 연관관계에 @Id 어노테이션을 붙여 엔티티 매핑을 시도하였습니다. @Entity @Table(name = "USR_TERMS_AGRMT") @NoArgsConstructor(access = AccessLevel.PROTECTED).. 2021. 9. 13.
Spring - 컨트롤러 메소드 파라미터에 대한 공통 처리 로직을 한 번에! HandlerMethodArgumentResolver 기본 정리 개요 @GetMapping("order") public ApiResult findAll( ... @RequestParam("offset") int offset, @RequestParam("limit") int limit) { ... } 가령 Spring MVC로 구현된 API에서 offset과 limit를 활용한 페이징을 지원한다고 한다면 페이징 처리가 필요한 메소드마다 위와 같이 offset과 limit 파라미터를 받는 코드를 작성해야 한다. 위와 같이 @RequestParam을 사용해 중복적으로 파라미터를 받아야 되는 것도 문제이나, offset 혹은 limit에 값의 범위를 지정하여 범위를 벗어나면 기본값을 넣는다거나 하는등 파라미터에 대한 추가적인 처리가 필요하다고 가정해보자. 그렇다면 페이징 파.. 2021. 3. 27.
반복적인 DTO 변환 작업을 한 번에 정의! MapStruct 기본 정리 MapStruct 1.4.2.Final Reference Guide를 기준으로 작성되었습니다. Introduction MapStruct는 객체의 타입 변환 시에 유용하게 사용할 수 있는 라이브러리이다. 어노테이션 기반으로 작성되며 Bean으로 등록할 수 있어 여러 프레임워크의 DI를 활용하여 사용할 수도 있다. 타입 세이프하게 객체의 타입 변환 시에 데이터 매핑을 도와주는 어노테이션 프로세서 서버 어플리케이션을 개발할 때 작업하는 DTO 변환 작업은 대부분이 반복적인 작업이 대부분 도메인 객체를 풍부하게 사용하면서, 반환 데이터가 달라지게 될 경우 이를 적절하고 큰 힘을 들이지 않고 매핑할 수 있도록 도와주는 것이 바로 MapStruct 리플렉션이 아닌 직접 메소드를 호출하는 방식으로 동작하여 속도가 빠.. 2021. 3. 7.
Java Stream(2) - 가공하기 및 결과 만들기 가공하기 전체 요소 중에서 다음과 같은 API를 이용해 내가 원하는 것만 뽑아낼 수 있다. 이러한 가공 단계를 중간 작업(intermediate operation)이라 한다. 이 작업은 스트림을 리턴하기 때문에 여러 작업을 이어 붙여(chaining) 작성할 수 있다. List names = Arrays.asList("Eric", "Elana", "Java"); 위의 예제에 적힌 List를 대상으로 예제를 살펴보자. Filtering 필터(filter)는 스트림 내 요소들을 하나씩 평가해 걸러내는 작업이다. 인자로 받는 Predicate는 Boolean을 리턴하는 함수형 인터페이스로 평가식이 들어간다. Stream filter(Predicate 2020. 7. 26.
Java Stream(1) - 기본 개념 및 생성하기 Java 8의 스트림(Stream)을 살펴본다. 스트림 Streams Java 8에서 추가한 스트림(Streams)은 람다를 활용할 수 있는 기술 중 하나이다. Java 8 이전에선 배열 혹은 컬렉션 인스턴스를 다루는 방법은 반복문(for, foreach etc..)을 활용하여 각 요소를 하나씩 꺼내서 다루는 방법(Outer Iteration; 외부 반복)이었다. 이는 간단한 로직이면 크게 문제가 되지 않으나, 로직이 복잡해지면 복잡해질수록 코드가 복잡해져 여러 로직이 섞이게 되는 경우나 중첩 되는 경우가 많았고 이를 위한 별도의 메소드를 작성해야 하는데, 이 과정은 직관적이지 않고 버그를 유발하기 쉽다. 스트림은 외부 반복을 하지 않고 각 개별 요소에 대한 처리 로직을 수행할 수 있는 여러 함수를 제공.. 2020. 7. 22.
반응형