@Transactional
@Transactional
public void createUser(User user) {
userRepository.save(user);
emailService.sendWelcomeEmail(user);
}
- 해당 범위 내의 DB 작업을 하나의 트랜잭션으로 묶어 처리한다.
- 모두 성공하면 커밋, 하나라도 실패하면 모두 롤백한다.
- 적용 위치에 따라 다르게 작동한다:
- 클래스에 선언 → 해당 클래스의 모든 public 메서드에 적용
- 메서드에 선언 → 해당 메서드에만 적용
- 주의: private, protected, default 접근자 메서드에는 적용되지 않다.
- 옵션:
- @Transactional(rollbackFor = Exception.class)
@Valid
@PostMapping("/user")
public ResponseEntity<?> createUser(@RequestBody @Valid UserRequestDto dto) {
...
}
- DTO의 필드 유효성 검사에 사용한다
- DTO 클래스에 @NotNull, @Size, @Pattern 등의 제약 조건과 함께 사용한다
- Spring은 @Valid가 붙은 파라미터를 자동으로 검사하고, 실패 시 400 Bad Request 반환
롬복 어노테이션
| @NoArgsConstructor | 기본 생성자 생성 |
| @AllArgsConstructor | 모든 필드를 파라미터로 받는 생성자 생성 |
| @RequiredArgsConstructor | final 혹은 @NonNull 필드만 생성자에 포함 |
| @SuperBuilder | 부모/자식 클래스 간 builder 패턴을 지원 (상속 시 builder 문제 해결) |
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {
private String name;
private String email;
}
MapStruct 관련 어노테이션
@Mapper
- DTO ↔ Entity 간 매핑을 자동으로 처리해주는 인터페이스 정의
- 컴파일 타임에 실제 구현체가 생성된다
@Mapper(componentModel = "spring")
public interface UserMapper {
UserDto toDto(User entity);
}
@Mapping + @MappingTarget
@Mapping(source = "type", target = "userType", qualifiedByName = "userTypeToString")
UserDto toDto(User user);
- source → 원본 필드
- target → 대상 필드
- qualifiedByName → 커스텀 변환 메서드를 지정할 때 사용
void updateEntity(@MappingTarget User user, UserDto dto);
- @MappingTarget 이 붙은 객체는 새로 생성하지 않고, 기존 객체를 수정한다
@ColumnDefault("0")
@ColumnDefault("0")
@Column(nullable = false)
private Integer count;
- DDL 생성 시 DB 컬럼의 기본값을 0으로 설정
- int, boolean과 같은 기본형 타입에 자주 사용한다
- Hibernate가 사용하는 DB Dialect와 JDBC 드라이버가 이를 자동으로 처리한다
전역 AttributeConverter
@Converter(autoApply = true)
public class BooleanToIntegerConverter implements AttributeConverter<Boolean, Integer> {
...
}
- 예: true → 1, false → 0 으로 DB 저장
- 전역 설정 시, @Convert 없이도 적용됨
- Hibernate + JDBC 드라이버가 자동으로 변환 처리한다
반응형
'IT > Spring' 카테고리의 다른 글
| Spring Data JPA 페이지네이션(Pagination) 처리 (1) | 2025.07.30 |
|---|---|
| JPA에서 deleteAll() vs deleteAllInBatch()의 차이와 주의할 점 (0) | 2025.07.19 |
| HikariCP (1) | 2025.07.12 |
| RestTemplate WebClient RestClient (2) | 2025.01.23 |
| React 프로젝트 Spring으로 가져오기 (0) | 2024.12.31 |