6. 상품 등록 및 조회하기

khs·2022년 8월 5일
0

modelmapper

  • 상품을 등록할 때는 화면으로부터 전달받은 DTO객체를 엔티티 객체로 변환하는 작업을 해야하고, 상품을 조회할 때는 엔티티 객체를 DTO 객체로 바꿔주는 작업을 해야한다.
  • 이를 도와주는 라이브러리가 modelmapper 이다. 이 라이브러리는 서로 다른 클래스의 값을 필드의 이름과 자료형이 같으면 getter, setter를 통해 값을 복사해서 객체를 반환해준다.
  • ItemImg 엔티티 객체를 파라미터로 받아서 ItemImg객체의 자료형과 멤버변수의 이름이 같을 때 ItemImgDto로 값을 복사해서 반환한다. static 메소드로 선언해 ItemImgDto객체를 생성하지 않아도 호출할 수 있도록 하였다.

Querydsl

  • Spring Data JPA가 기본적으로 제공해주는 CRUD 메서드 및 쿼리 메서드 기능을 사용하더라도, 원하는 조건의 데이터를 수집하기 위해서는 필연적으로 JPQL을 작성하게 된다. 간단한 로직을 작성하는데 큰 문제는 없으나, 복잡한 로직의 경우 개행이 포함된 쿼리 문자열이 상당히 길어진다. JPQL 문자열에 오타 혹은 문법적인 오류가 존재하는 경우, 정적 쿼리라면 어플리케이션 로딩 시점에 이를 발견할 수 있으나 그 외는 런타임 시점에서 에러가 발생하는데 이러한 문제를 어느 정도 해소하는데 기여하는 프레임워크가 바로 Querydsl이다.

  • 장점

    • 문자가 아닌 자바 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 확인할 수 있다.
    • 자동 완성, 문법 오류 등 IDE의 도움을 받을 수 있다.
    • 조회 조건이 복잡한 화면은 Querydsl을 이용해 조건에 맞는 쿼리를 동적으로 쉽게 생성할 수 있다.
    • 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다.
  • Querydsl을 Spring Data Jpa과 함께 사용하기 위해서는 사용자 정의 리포지토리를 정의해야 한다. 총 3단계의 과정으로 구현하면 된다.

      1. 사용자 정의 인터페이스 작성
      1. 사용자 정의 인터페이스 구현
      1. Spring Data Jpa 리포지토리에서 사용자 정의 인터페이스 상속

Page

  • Pagable 이라는 객체는 페이징 하는 방법을 기술해놓은 클래스(인터페이스) 라고 보면되고, Page 객체는 실제로 페이징으로 잘려진 객체들을 담고있는 객체라고 생각하면 된다. Spring Data JPA 에서는, 페이징을 위해서 기본적으로 Page 라는 객체와, Pageable 이라는 객체를 가지고 있다.

  • 유저의 숫자도 적고, 데이터의 양이 10개, 100개 처럼 양이 적은 경우에는 굳이 페이징을 안하고 한꺼번에 로딩해서 보여줘도 된다. 하지만, 유저수가 많아지고, 불러와야 하는 데이터의 양도 많아지고, 처리해야되는 로직이 복잡해진다면 이는 크나큰 성능 병목으로 이어지게 된다.


QueryProjection

  • Projections을 이용해서 projection 하는 방법은 크게 3가지가 있다.
    • Projections.bean을 이용하는 방법
    • Projections.constructor를 이용하는 방법
    • @QueryProjection를 사용하는 방법
  • 이해가 잘 되지 않아 추후에 더 공부해야겠다. (여기 참고)

어노테이션 정리

@Value

  • Spring Boot 프로젝트가 커지면 공통으로 사용되는 글로벌 값을 별도로 관리할 필요가 생긴다. @Value 어노테이션은 properties 파일에 세팅한 내용을 Spring 변수에 주입하는 역할을 한다.
  • @Value("${...}") : application.properties 에 정의한 내용, List등을 가져와서 사용할 수 있다.

@Builder

Builder는 오브젝트 생성을 위한 디자인 패턴이다. Builder 패턴을 사용하는 것은 생성자를 이용해 오브젝트를 생성하는 것과 비슷하다. 생성자를 이용하는 것과 비교해 장점이 있다면 생성자 매개변수의 순서를기억할 필요가 없다.


@NoArgsConstructor

@NoArgsConstructor 어노테이션은 매개변수가 없는 생성자를 구현해준다.


@AllArgsConstructor

@AllArgsConstructor 어노테이션은 클래스의 모든 멤버 변수를 매개변수로 받는 생성자를 구현해준다.


@RequireArgsConstructor

@RequiredArgsConstructor 어노테이션은 final이나 @NotNull인 필드 값만 파라미터로 받는 생성자를 만들어준다.


@Data

  • @Data 어노테이션은 클래스 멤버 변수의 Getter/Setter 메서드를 구현해준다.
  • @Data / @Getter @Setter 와의 차이 : @Data를 사용하면, 안에 들어가있는 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor 도 같이 사용되는 것이기에 발생하는 문제들이 존재한다.

@Transactional

  • 트랜잭션

    • 데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미
    • begin, commit 을 자동으로 수행해준다.
    • 예외 발생 시 rollback 처리를 자동으로 수행해준다.
  • 트랜잭션 처리 방법
    스프링에서는 간단하게 어노테이션 방식으로 @Transactional을 메소드, 클래스, 인터페이스 위에 추가하여 사용하는 방식이 일반적이다. 이 방식을 선언적 트랜잭션이라 부르며, 적용된 범위에서는 트랜잭션 기능이 포함된 프록시 객체가 생성되어 자동으로 commit 혹은 rollback을 진행해준다.

  • 더 자세한 부분은 여기에 잘 정리되어있으니 확인하면 좋을 것 같다.

@Valid

  • 빈 검증기(Bean Validator)를 이용해 객체의 제약 조건을 검증하도록 지시하는 어노테이션
profile
권혁상입니다. 행복코딩^_^

0개의 댓글