08302021
@RequestHeader
를 이용해 헤더 값을 꺼내오는 것과 HttpServletRequest를 이용해서 가져오는 것과는 성능상 차이는 크게 없지만 @RequestHeader를 쓰는게 코드가 더 간결함preHandle()
: 컨트롤러 호출 이전에 실행postHandle()
: 컨트롤러 호출 이후, 리스폰스를 내보내기 전에 실행supportsParameter()
resolveArgument()
Create BaseEntity
abstract class with @Getter
, @MappedSuperclass
(멤버변수를 모두 컬럼으로 인식), @EntityListeners(AuditingEntityListeners.class)
(값을 자동으로 매핑시킨다) 어노테이션
보통 공통으로 들어가는 멤버변수로 createdTime이랑 lastModified가 있는데 Spring Data JPA를 이용한다면 변수에 @CreatedDate
, @LastModifiedDate
를 넣어주면 생성/수정시에 자동으로 값이 세팅된다. 순수 JPA를 이용한다면 다음 예시와 같이 @PrePersist
와 @PreUpdate
를 이용해 메서드에 값 세팅을 구현해주면 된다.
public abstract class BaseEntity {
private LocalDateTime createdAt;
private LocalDateTime lastModifiedAt;
@PrePersist
public void prePersist() {
LocalDateTime now = LocalDateTime.now();
createdAt = now;
lastModifiedAt = now;
}
@PreUpdate
public void preUpdate() {
lastModifiedAt = LocalDateTime.now();
}
}
실행되는 Application에 @EnableJpaAuditing
어노테이션 추가
매핑의 전과 후에 실행시키는 메서드
예시에는 DTO -> Entity 매핑 후 @AfterMapping에서 String 타입의 멤버변수를 대문자로 저장하고 싶을 때 아래와 같이 적용한다. 이 때 맵되어 나오는 결과물에는 꼭 @MappingTarget을 붙여야 한다.
@BeforeMapping
public void validateUserDto(
User UserDtoToUser(UserDto userDto);
@AfterMapping
public void convertNameToUpperCase(@MappingTarget User user) {
user.setName(user.getName.toUpperCase());
}
빌더를 사용하고 있다면 @매핑타겟에 클래스가 빌더를 넣어줘야 한다. 빌더를 쓸 때에는 매퍼에서 빌더를 불러와 리턴타입의 객체를 생성하는데 afterMapping에 빌더를 불러와야 빌드될 객체를 수정할 수 있단다.. 빌더는 afterMapping이 끝나면 호출되는데 MapStruct will not call the @AfterMapping
annotated method if the real target is used as @MappingTarget
annotated parameter. (이거먼말인지; 빌더 안 쓰고 타입 그대로 쓰면 호출 안된단 뜻인가?) 참고링크
@OneToMany
와 비슷하지만 엔티티가 아닌 타입, embeddable의 컬렉션 객체를 저장하는데 사용된다. 컬럼처럼 사용된다고 볼 수 있다.