분류 전체보기

    Spring consumes와 produces

    Spring consumes와 produces API의 URI를 Mapping할 때 서버에서 수신하는 데이터와 송신하는 데이터 타입을 강제함으로써 오류 상황을 줄일 수 있다. @RequestMapping의 produces 속성을 이용하여 Response의 Content-Type을 제어할 수 있다. @GetMapping, @PostMapping, @PutMapping, @DeleteMapping 등도 지원한다. @Consumes : 수신 하고자하는 데이터 포맷을 정의한다. - 수신 데이터 제한 Cosumes는 클라이언트가 서버에게 보내는 데이터 타입을 명시 @Produces : 응답(출력)하고자 하는 데이터 포맷을 정의한다. - 응답 데이터 제한 Produces는 서버가 클라이언트에게 반환하는 데이터 타입..

    MockMvc 테스트시 201 created URI를 검증하는 방법

    현재 ItemController에서는 Resource 생성 시 201 created 응답과 함께 생성된 자원의 URI를 리턴해주고있다. @RequestMapping("/api/v1/items") @RestController @RequiredArgsConstructor public class ItemController { ​ private final ItemFacadeService itemService; ​ @PostMapping(consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) public ResponseEntity createItem(@RequestBody @Valid ItemCreateRequest itemCreateReque..

    MockMvc 테스트 body가 '<no character encoding set>' 인경우

    @WebMvc 테스트 중 Request Body 데이터가 나오지 않는 상황이 발생. MockHttpServletRequest: HTTP Method = POST Request URI = /api/v1/items Parameters = {_csrf=[89d3f355-ea84-4108-b910-eebcb6795735]} Headers = [Content-Type:"application/json", Accept:"application/json", Content-Length:"505"] Body = // Session Attrs = {} Handler: Type = com.prgrms.bdbks.domain.item.api.ItemController Method = com.prgrms.bdbks.domain.i..

    TransientPropertyValueException: object references an unsaved transient instance 에러

    TransientPropertyValueException: object references an unsaved transient instance 에러 org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : 연관관계가 있는 엔티티끼리 영속성을 관리할때(영속성 전이) 생기는 오류이다. FK로 지정하는 엔티티가 아직 영속상태(Persist) 가 되지 않거나, 부모객체에서 자식객체를 한번에 저장하려고할때 발생한다. 해결 영속성 전이를 위해 cascade type을 지정한다. @OneToMany, @ManyToOne..

    QueryDSL 에러 - Execution failed for task ':compileQuerydsl', ClassNotFoundException: org.gradle.wrapper.GradleWrapperMain

    테스트코드 에러 - Execution failed for task ':compileQuerydsl'. Task :compileQuerydsl FAILED error: cannot find symbol Execution failed for task ':compileQuerydsl'. 같은 에러 발생시에는 Preference -> Build.Execution, Deployment -> Build Tools -> gradle build and run using : Intellij IDEA Run tests using : Intellij IDEA 로 설정하고 다시 테스트하면 테스트가 통과한다. 오류: 기본 클래스 org.gradle.wrapper.GradleWrapperMain을(를) 찾거나 로드할 수 없습니다..

    QueryDSL 설정 - SpringBoot 2.7.X & SpringBoot 3.x 버전

    SpringBoot 2.x대와 SpringBoot 3.x대의 버전 설정 방법이 다르므로 둘에 나눠서 정리 하도록 한다. SpringBoot 2.x버전대 설정 방법 1. Querydsl 버전을 plugins 위에 추가하고 plugins에 querydsl 플러그인을 추가한다. buildscript { ext { queryDslVersion = "5.0.0" } } plugins { id 'java' id 'org.springframework.boot' version '2.7.7' id 'io.spring.dependency-management' version '1.1.0' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" // querydsl } builds..

    Jpa Insert, update delete 시 select query를 통한 먼저 조회하지 않는 방법.md

    Spring Data Jpa에서는 대부분 JpaRepository interface를 상속받는데, 이 때 기본 구현체로 SimpleJpaRepository.class가 사용된다. 다음은 SimpleJpaRepository의 save method 코드이다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } } JpaRepository.save 동작방식은 persist 하거나 m..

    Jpa Id 생성전략에 따른 동작 방식

    JpaRepository.save 동작방식은 persist 하거나 merge를 한다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } } 엔티티에 Id 값이 있으면 DB를 조회 (select)한 후에 insert 하게 된다. 생성전략이 존재하지 않을 경우 merge 로 동작. merge 는 입력받은 entity 를 복사한 후 진행하기에 리소스 소모가 있다. 생성전략이 존재하..

    JPA Hibernate Id 생성 전략과 UUID 전략

    JPA 및 Hibernate 내에서 엔티티에 대한 식별자(Id)를 생성하는 다양한 옵션에 대해 정리한다. 식별자는 엔티티 기본 키를 모델링하고 특정 엔터티를 고유하게 식별하는 데 사용된다. 기본 키는 데이터베이스 내의 행을 고유하게 식별한다. 이론적으로 식별자는 기본 키와 일치할 필요가 없다. 식별자는 각 행을 고유하게 식별하는 열에 매핑되기만 하면 되기 때문이다. 여기서는 기본 키와 식별자(Id) 는 일부로 같은 의미로 사용한다. 기본키와(pk) 식별자(Id)는 다음 제약조건이 제한된다 UNIQUE- 값은 각 행을 고유하게 식별해야 한다. NOT NULL- 값은 null일 수 없다. 복합 ID (복합 키)의 경우 어떤 부분도 null이 될 수 없다. IMMUTABLE- 한 번 삽입된 값은 절대 변경할 ..

    Jpa Hibernate Custom Id Generator

    custom ID를 생성하기 위해 Custom Generator 를 생성하기 위해서는 IdentifierGenerator 인터페이스를 이용해서 generate() 메서드를 구현해야 한다. IdentifierGenerator 인터페이스구현 클래스는 반드시 public 으로 선언된 기본 생성자가 있어야한다 package org.hibernate.id; public interface IdentifierGenerator extends Configurable, ExportableProducer { ... Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException; } Identifier..