본래 객체의 생성 및 생성주기는 개발자가 제어합니다. Ioc Container는 이러한 개발자의 제어권을 역전시켜 Ioc Container가 객체의 생성과 생명주기를 관리합니다. Ioc Container에게 관리되는 자바 객체는 Bean이라고 명칭합니다. Bean은 Ioc Container에게 생성되고 관리되며, 필요한 곳이 있으면 DI방식으로 사용됩니다.
이로 인해 객체 생성의 중복 제거, 메모리 효율성 증가 등 여러 이점이 생깁니다.
@OneToOne // 1:1 관계
@JoinColumn(name = "profile_id")
private Profile profile;
@OneToMany(mappedBy = "user") // 1:N 관계 (주인 아님)
private List<Post> posts;
@ManyToOne // N:1 관계
@JoinColumn(name = "user_id")
private User user;
@ManyToMany // N:N 관계
@JoinTable(name = "user_roles")
private Set<Role> roles;
// 영속성 전이 & 고아 객체 제거
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<Comment> comments;
// Fetch 전략
@ManyToOne(fetch = FetchType.LAZY) // 지연 로딩
private User user;
@ManyToOne(fetch = FetchType.EAGER) // 즉시 로딩
private Category category;
import jakarta.validation.constraints.*;
public class CreateUserRequest {
@NotNull // null 불가
private String name;
@NotEmpty // null, 빈 문자열 불가
private String username;
@NotBlank // null, 빈 문자열, 공백만 있는 문자열 불가
private String password;
@Size(min = 2, max = 30) // 길이 제한
private String name;
@Min(18) // 최소값
@Max(100) // 최대값
private int age;
@Email // 이메일 형식 검증
private String email;
@Pattern(regexp = "^010-\\d{4}-\\d{4}$") // 정규식 검증
private String phone;
@Positive // 양수만
private int price;
@PositiveOrZero // 0 또는 양수
private int stock;
@Future // 미래 날짜만
private LocalDate eventDate;
@Past // 과거 날짜만
private LocalDate birthDate;
}
// Controller에서 사용
@PostMapping("/users")
public User create(@Valid @RequestBody CreateUserRequest request) { }
@RestControllerAdvice // 전역 예외 처리
public class GlobalExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class) // 특정 예외 처리
public ResponseEntity<ErrorResponse> handleIllegal(IllegalArgumentException e) {
return ResponseEntity.badRequest().body(new ErrorResponse(e.getMessage()));
}
@Getter // getter 메서드 자동 생성
@Setter // setter 메서드 자동 생성
@ToString // toString() 메서드 자동 생성
@EqualsAndHashCode // equals(), hashCode() 자동 생성
@NoArgsConstructor // 기본 생성자
@AllArgsConstructor // 모든 필드 생성자
@RequiredArgsConstructor // final 필드 생성자
@Data // @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor
@Builder // 빌더 패턴
@Slf4j // Logger 자동 생성
public class MyService {
public void method() {
log.info("Log message");
log.error("Error", exception);
}
}
@JsonProperty("user_name") // JSON 필드명 지정
private String name;
@JsonIgnore // JSON 직렬화/역직렬화 제외
private String password;
@JsonInclude(JsonInclude.Include.NON_NULL) // null 제외
private String optionalField;
@JsonPropertyOrder({"id", "name", "email"}) // JSON 순서 지정
public class User { }
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 날짜 포맷
private LocalDateTime createdAt;
@JsonAlias({"userName", "user_name"}) // 역직렬화 시 여러 이름 허용
private String name;
@JsonCreator // 역직렬화 시 사용할 생성자/팩토리 메서드
public User(@JsonProperty("id") Long id) { }