열렬히.뛰기

코드분석 (3) : 다이어리

Projects > 코드분석 (3) : 다이어리

Domain

  • private으로 선언된 변수들 : DB와 연결되는 변수들.
  • public Diary() : 생성자
  • public Diary update() : contentmodifiedDate를 업데이트
  • public void delete() : 일기를 논리적으로 삭제합니다. 즉, 실제로 데이터를 삭제하지 않고, diaryDeleteYn 값을 'Y'로 설정하여 삭제된 것으로 처리합니다. 이 방식은 소프트 삭제(soft delete)라고 함.
    • 왜 소프트 삭제를 하는가?
  • private LocalDate toLocalDate() : LocalDateTime을 LocalDate로 변환하는 유틸리티 메서드입니다. 서울 시간대를 기준으로 날짜를 변환하여 markedDate에 저장합니다.

repository

Spring Data JPA를 사용하여 데이터베이스와 상호작용

기본 사항

  • @Query : JPA가 기본적으로 제공하지 않는 커스텀 쿼리를 만들어줌.
  • 그 밑의 메소드 : @Query에 작성된 쿼리를 실행하는 메서드

메소드

  • findDiariesByCreatedAtBetweenAndUserId() : 특정 기간 동안 작성된, 삭제되지 않은 일기를 조회
  • countDiariesByDate() : 특정 기간 동안 작성된 일기의 개수를 날짜별로 그룹화하여 반환
  • findByIdAndUserId() : 특정 일기 ID에 해당하는 사용자의 일기를 조회
  • findByCreatedAtAndUserId() : 특정 사용자의 특정 날짜에 작성된 일기를 조회
  • findByUserId() : 사용자의 모든 일기를 조회

service

1. DiaryService 클래스

클래스 어노테이션

•	@Slf4j: Lombok 어노테이션으로, 로그 기록을 쉽게 할 수 있도록 log 객체를 자동으로 생성해줍니다.
•	@RequiredArgsConstructor: Lombok 어노테이션으로, final로 선언된 필드에 대해 생성자를 자동으로 생성합니다. 즉, DiaryRepository와 DailyAiInfoRepository가 의존성 주입됩니다.
•	@Transactional(readOnly = true): 기본적으로 이 클래스의 모든 메서드는 읽기 전용 트랜잭션에서 실행됩니다. 그러나 데이터베이스에 쓰기를 해야 하는 경우에는 메서드별로 트랜잭션 쓰기 모드를 활성화합니다.
•	@Service: 이 클래스가 서비스 계층에서 동작하는 Spring 빈임을 나타냅니다.

private 변수

  • DiaryRepository: 일기 데이터를 처리하는 JPA 리포지토리로, 데이터베이스와 상호작용하여 일기 데이터를 조회, 저장, 수정, 삭제하는 역할을 합니다.
  • DailyAiInfoRepository: AI 분석 결과와 관련된 데이터를 관리하는 리포지토리로, 사용자가 작성한 일기와 관련된 AI 분석 데이터를 조회하는 데 사용됩니다.

메소드 분석

  • findByCreatedDate : 특정 날짜(targetDate)에 해당 사용자가 작성한 일기와 AI 분석 데이터를 조회
  • countDiariesByDate : 특정 사용자가 특정 연도와 월에 작성한 일기의 개수를 날짜별로 카운트
  • save : 사용자가 새로운 일기를 작성할 때 호출
  • update : 사용자가 기존에 작성한 일기를 수정할 때 호출
  • delete : 특정 일기를 삭제할 때 호출

dto

1. DiaryCountResponseDTO

  • 역할: 특정 기간 동안의 일기 개수를 반환하는 DTO.
    • markedDate: 일기 작성 날짜.
    • diaryCount: 해당 날짜에 작성된 일기의 개수.
    • 생성자: targetDatediaryCount를 받아 해당 날짜에 작성된 일기 개수를 저장합니다.

2. DiaryDailyResponseDTO

  • 역할: 특정 날짜에 작성된 일기와 해당 일자의 AI 분석 상태를 반환하는 DTO.
    • sendStatus: AI 분석이 완료되었는지 여부를 나타냅니다.
    • diaries: 해당 날짜에 작성된 일기 리스트.
    • 빌더 패턴: 객체를 생성할 때 유연하게 값을 설정할 수 있도록 @Builder를 사용합니다.

3. DiaryRequestDTO

  • 역할: 클라이언트가 새로운 일기를 작성하거나 기존 일기를 수정할 때 서버로 전송하는 DTO.
    • userId: 일기를 작성하는 사용자의 ID (setter를 통해 설정 가능).
    • content: 일기 내용.
    • createdDate: 일기 작성 시점 (UTC 타임존 기준).
    • modifiedDate: 일기 수정 시점 (UTC 타임존 기준).
  • 메서드
    • toEntity(): 이 DTO를 Diary 엔티티로 변환하는 메서드로, 저장 또는 수정할 데이터를 Diary 엔티티로 변환하여 JPA를 통해 저장.
    • 시간 변환: 입력된 시간이 UTC 기준으로 전달되므로, **서울 시간(Asia/Seoul)**으로 변환하여 저장합니다.

4. DiaryResponseDTO

  • 역할: 서버가 클라이언트에 일기 데이터를 반환할 때 사용하는 DTO.
    • diaryId: 일기의 고유 식별자.
    • userId: 일기를 작성한 사용자 ID.
    • content: 일기의 내용 (암호화된 데이터를 복호화하여 반환).
    • deleteYn: 일기의 삭제 여부.
    • markedDate: 일기 작성 날짜.
    • createdDate, modifiedDate: 일기 작성 및 수정 시점 (UTC 타임존으로 변환하여 반환).
  • 메서드:
    • convertToUTC(): 로컬 시간대를 UTC 시간대로 변환하는 메서드.
    • 암호화 복호화: EncryptionUtil을 사용해 암호화된 일기 내용을 복호화하여 반환합니다.

controller

  • 일기와 관련된 RESTful API를 제공하는 컨트롤러.
  • 클라이언트의 요청에 따라 일기 데이터를 조회, 생성, 수정, 삭제하는 작업을 수행.
  • 비즈니스 로직은 서비스 계층(DiaryService)에 위임하여 처리
  • JWT 인증 서비스(AuthenticationService)를 통해 현재 사용자의 인증 정보를 확인하고, 해당 사용자의 데이터를 처리하는 데 필요한 사용자 ID를 추출.