본문 바로가기
반응형

Study/spring30

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.
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.
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.
QueryDSL(1)- QueryDSL과 설정 방법 QueryDSL QueryDSL은 JPA 표준에서 지원하는 Criteria 기술처럼 JPQL 빌더 역할을 해주는 오픈소스 프로젝트이다. 기존의 JPQL처럼 문자로 작성하는 것이 아닌 자바 코드로 JPQL을 작성할 수 있도록 해주어 문법 오류를 컴파일 단계에서 잡을 수 있고 IDE의 자동완성 기능의 도움을 받을 수 있는 등 여러가지 장점이 있다. 또한 Criteria에 비해 복잡성이 낮다. 쿼리를 문자가 아닌 코드로 작성해도 쉽고 간결하며 그 모양도 쿼리와 비슷하게 개발할 수 있게 해준다. QueryDSL 설정 필자는 프로젝트 설정 시 메이븐을 주로 사용하기에 메이븐을 위주로 설정 방법을 다루겠다. 먼저 pom.xml에 다음과 같이 의존성을 추가한다. com.querydsl querydsl-apt ${qu.. 2021. 1. 25.
Spring Data JPA(2) - JpaRepository 쿼리 메소드 기능 해당 포스팅은 [ 자바 ORM 표준 JPA 프로그래밍 - 김영한 저 ]를 학습한 내용을 바탕으로 정리한 글입니다. 쿼리 메소드 기능 쿼리 메소드 기능은 스프링 데이터 JPA가 제공하는 특별한 기능이다. 크게 3가지 기능이 있다. 메소드 이름으로 쿼리 생성 메소드 이름으로 JPA NamedQuery 호출 @Query 어노테이션을 사용하여 레포지토리 인터페이스에 쿼리 직접 정의 이 기능들을 활용하면 인터페이스만으로 필요한 대부분의 쿼리 기능을 개발할 수 있다. 1. 메소드 이름으로 쿼리 생성 예시를 들어보자. 이름과 나이로 회원을 조회하려면 다음과 같이 메소드 이름을 정의하면 된다. List findByUsernameAndAge(String username, int age); 인터페이스에 정의한 findBy.. 2021. 1. 20.
반응형