N번째의 값이 N-1번째와 N-2번째의 값으로부터만 영향을 받는다면 N번째 값을 N-1, N-2번째 값으로 표현할 수 있다
이러한 관계를 점화식이라고 하는데, 이를 다이나믹 프로그래밍으로 구현할 수 있다.
이전 단계를 메모하기: 수학적인 개념으로는 점화식을 이용하는 것!
피보나치 수열은 이전의 두 숫자의 합이 다음 숫자가 되는 수열을 뜻한다
따라서
따라서 이전의 숫자들을 기록해 둔 다음에 올 숫자를 구할 수 있다.
int fibonacci(int nth, int[] arr){
// int[]는 길이가 nth
// 1번째부터 n번째수까지 모두 기록한다.
if(nth == 1){
arr[0] = 1;
} else if (nth == 2){
arr[0] = 1;
arr[1] = 1;
} else{
arr[0] = 1;
arr[1] = 1;
for (int i = 2; i < nth; i++) {
arr[i] = arr[i-1] + arr[i-2];
}
}
System.out.println(Arrays.toString(arr));
// return arr; -> 수열 전체를 print
return arr[nth-1];
}
또한 는 fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)
이므로 재귀함수를 이용해서 다이나믹 프로그래밍을 구현할 수 있다.
int fibonacciWithDP(int num, int[] arr){
if(num <=2){
arr[num-1] = 1;
return 1;
} else{
if(arr[num-1]==0){
arr[num-1] = fibonacciWithDP(num-1, arr) + fibonacciWithDP(num-2, arr);
}
}
System.out.println(Arrays.toString(arr));
return arr[num-1];
}
Application 클래스에 @EnableJpaAuditing
을 추가하면 Auditing 기능이 활성화되지만 기능을 테스트하는 과정에서 오류가 발생할 수 있습니다. 따라서 별도의 Configuration 클래스를 생성하는 곳이 좋습니다.
@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {
}
각 엔티티에 공통으로 들어가는 생성일자, 변경일자, 생성주체 등의 필드를 하나의 클래스로 따로 빼주어 BaseEntity를 만듭니다. 그리고 이 필드가 필요한 entity들은 BaseEntity를 상속하여(extends BaseEntity
) 필드를 사용합니다.
@Getter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
}
@MappedSuperclass
: 상속받는 자식 클래스에게 (DB와의) 매핑 정보를 전달합니다
@EntityListeners
: 엔티티를 데이터 베이스에 적용하기 전 후로 콜백을 요청할 수 있도록 합니다.
AuditingEntityListener.class
: 엔티티의 Auditing 정보를 주입하는 클래스 입니다.
@CreatedDate
: 데이터 생성 날짜를 자동으로 주입합니다.
@LastModifiedDate
: 데이터 수정 날짜를 자동으로 주입합니다.
상속받는 자식 클래스에는 @ToString(callSuper = true)
, @EqualsAndHashCode(callSuper = true)
를 붙여주면 됩니다.
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Entity
@ToString(callSuper = true) // callSuper는 부모 클래스의 필드를 포함하는 역할을 수행합니다.
@EqualsAndHashCode(callSuper = true)
public class Visit extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "hospital_id")
private Hospital hospital;
Auditing이 제대로 기능하는지 확인하기 위해 테스트 코드를 작성해보았습니다. 제대로 동작함을 확인할 수 있습니다.
@Test
@DisplayName("Auditing이 제대로 작동하는지 테스트")
public void auditingTest(){
Visit visit = new Visit("손목통증", 2000);
Visit visit1 = visitRepository.save(visit);
System.out.println(visit1.getDisease());
// "손목통증"
System.out.println(visit1.getCreatedAt());
// 2022-12-08 11:34:23
}