2022.12.08 (목요일)

yeonicerely·2022년 12월 8일
0

1. 알고리즘: Dynamic Programming (1)

N번째의 값이 N-1번째와 N-2번째의 값으로부터만 영향을 받는다면 N번째 값을 N-1, N-2번째 값으로 표현할 수 있다

an=F(an1)+F(an2)a_n = F(a_{n-1}) + F(a_{n-2})

이러한 관계를 점화식이라고 하는데, 이를 다이나믹 프로그래밍으로 구현할 수 있다.

이전 단계를 메모하기: 수학적인 개념으로는 점화식을 이용하는 것!

A. 피보나치 수열

피보나치 수열은 이전의 두 숫자의 합이 다음 숫자가 되는 수열을 뜻한다
따라서 an=an1+an2a_n = a_{n-1} + a_{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];
    }

또한 an=an1+an2a_n = a_{n-1} + a_{n-2}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];


    }

2. JPA Auditing

A. JavaAditingConfiguration 클래스 생성

Application 클래스에 @EnableJpaAuditing을 추가하면 Auditing 기능이 활성화되지만 기능을 테스트하는 과정에서 오류가 발생할 수 있습니다. 따라서 별도의 Configuration 클래스를 생성하는 곳이 좋습니다.

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {

}

B. BaseEntity 만들기

각 엔티티에 공통으로 들어가는 생성일자, 변경일자, 생성주체 등의 필드를 하나의 클래스로 따로 빼주어 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;

C. 테스트 코드

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
    }

3. CI/CD

A. CI/CD란?

  • CI(Continuous Integration): 여러 사람들이 구현한 코드의 변경사항이 정기적으로 빌드 및 테스트 되어 공유한 리포지토리에 병합되는 것을 말하며 이를 통해 코드들이 충돌하는 문제를 해결할 수 있습니다.
  • CD(Continous Delivery 또는 Continous Deployment)
    • 지속적인 제공( Continous Delivery): 어플리케이션이 버그 테스트를 거쳐서 자동으로 업로드 되는 것 → 실시간으로 프로덕션 환경(코드가 의도한 대로 동작하는 지를 확인할 수 있는 환경)을 배포할 수 있습니다.
    • 지속적인 배포(Continous Deployment): 개발자의 변경 사항을 프로덕션 환경까지 자동으로 릴리즈 하는 것 → 수동으로 배포하면서 발생하는 프로세스의 과부화를 해결할 수 있습니다.

0개의 댓글