반응형 분류 전체보기49 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. Spring Web MVC - Multipart 요청 다루기 지금 진행중인 토이 프로젝트에서 게시글 등록 시 게시글 내용 + 이미지 파일 업로드를 받는 로직을 구현하는데. 이에 대해서 간단히 정리하도록 하겠다. 일반적으로 Multipart 요청에 경우 Spring Web MVC에선 다음과 같은 방식을 제안한다. @Controller public class FileUploadController { @PostMapping("/form") public String handleFormUpload(@RequestParam("name") String name, @RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { byte[] bytes = file.getBytes(); // store the bytes som.. 2021. 2. 23. Spring Cache Abstraction 정리 캐시 추상화(Cache Abstraction) 스프링 캐싱 추상화는 스프링 어플리케이션에 캐싱을 투명하게 적용할 수 있게 도와주는 기술이다. 최소한의 코드 작성으로 일관된 다양한 캐싱 솔루션을 제공한다. 캐시(Cache)의 특징 캐시 적용의 목적은 성능 향상에 있다. 반복적인 동일한 작업에 적용할 수 있다. 매번 다른 결과를 돌려줘야 하는 작업에 적용하면 오히려 캐시 로직 때문에 성능이 저하된다. 캐시 저장소에 저장해둔 내용이 변경되는 상황에 잘 대처해야한다. 데이터의 일관성을 유지하여야함. 항상 올바른 값을 반환하도록 대처해야함. → 예) 캐시 데이터의 원본 데이터가 변경된다면 변경된 데이터를 반환하도록 대체 여러 위치에 적용이 가능하다. DB 조회와 관련된 캐시라면 데이터 액세스 기술에 적용 JPA나.. 2021. 2. 9. 람다 표현식(Lambda Experessions) 정리 람다 표현식(Lambda Experessions) 함수형 인터페이스의 인스턴스를 만드는 방법으로 쓰일 수 있는 자바8에서 제공하는 강력한 문법 개선 기능입니다. 람다 표현식이 있기 이전에는 하나의 함수만 사용하고 싶어도 클래스를 생성하는 코드를 짰어야 했습니다. 람다 표현식을 사용하면 일급 객체로써 다루어지는 익명 함수를 간단한 코드로 생성할 수 있습니다. 람다식이 평가(evaluation)되면 그 결과 Functional Interface의 인스턴스를 생성합니다. 람다식의 처리 결과는 표현식 몸통을 실행하는 것이 아닙니다. 대신 나중에 이 Functional Interface의 적절한 메서드가 실제 호출(invoke)될 때 표현식 몸통의 실행이 일어게 됩니다. *일급 객체란? 일급 객체(영어: firs.. 2021. 2. 8. 함수형 인터페이스(Functional Interface) 정리 함수형 인터페이스(Functional Interface) 함수형 인터페이스는 Object 클래스의 메서드를 제외하고 추상 메소드를 하나만 가지고 있는 인터페이스이다. 다른 말로 SAM(Single Abstract Method) 인터페이스라고도 한다. 함수형 인터페이스 예시 @FunctionalInterface public interface RunSomething { void doIt(); static void printName() { System.out.println("Kyeongho"); } default void printAge() { System.out.println("40"); } } @FunctionalInterface 어노테이션을 붙이면 함수형 인터페이스라 간주하고 추상 메소드가 두 개 이상되.. 2021. 2. 8. Spring REST Docs 개념 및 간단한 예제 Introduction Spring REST Docs는 정확하고 가독성 좋은 REST 문서를 제공하는 것을 목표로 한 Spring 프로젝트 중 하나이다. Asciidoctor를 활용하여 테스트코드를 adoc으로 변환한 후 HTML로 변환시켜 주는데, 대안으로 Spring REST Docs는 Markdown을 사용할 수도 있다. 참고! adoc(Asciidoc)은 Markdown과 마찬가지로 문서 작성을 위한 경량형 마크업 언어입니다. 문서 자체는 .adoc 확장자의 text문서에 불과하고, Asciidoctor(https://asciidoctor.org/) 를 이용해 html이나 pdf등으로 변환하여 활용할 수 있다. 기본적으로 Spring MVC의 test freamwork에서 제공하는 MockMvc로.. 2021. 2. 2. QueryDSL(3) - 프로젝션, distinct, 동적 쿼리, 벌크 연산 프로젝션 프로젝션과 기본 결과 반환 프로젝션 대상이 하나인 경우 @Test public void simpleProjection() { List result = queryFactory .select(member.username) .from(member) .fetch(); } 타입을 명확하게 지정할 수 있음. 프로젝션 대상이 둘 이상이면 Tuple이나 DTO로 조회해야함 프로젝션 대상이 둘 이상일 경우 Tuple로 조회 @Test public void tupleProjection() { List result = queryFactory .select(member.username, member.age) .from(member) .fetch(); for (Tuple tuple : result) { String u.. 2021. 1. 26. QueryDSL(2) - 쿼리 생성 방법, 기본 문법 기본 Q-Type 활용 쿼리 타입(Q)은 사용하기 편리하도록 기본 인스턴스를 보관하고 있다. 하지만 같은 엔티티를 조인하거나 같은 엔티티를 서브쿼리에 사용할 때 사용하면 별칭이 겹치기 때문에 따로 별칭을 주입하여 생성해줘야 한다. 쿼리 타입(Q) 사용 예제 QMember qMember = new QMemeber("m"); // 직접 지정 QMember qMember = new Qmember.member; // 기본 인스턴스 사용 아래와 같이 쿼리 타입의 기본 인스턴스를 import static을 활용해서 사용하면 코드를 더 간결하게 작성할 수 있다. import static ...Qmember.member; // 기본 인스턴스 static import ... public void qtype() { Ent.. 2021. 1. 25. 이전 1 2 3 4 5 6 다음 반응형