이노베이션 캠프

[TIL] 27일차

hjkim0502 2022. 8. 28. 02:05

언젠가부터 너무 적당히만 공부하는 것 같다. Git 공부, TDD, 코테 문제 등 할게 많은데도 사리면서 하는게 많이 느껴지는데, 좀 반전시키고자 오늘은 코테문제 하나 풀고 마무리하려고한다 ㅎ..

또 다른 분위기 반전으로 김영한님의 JPA 기본 강의를 구매해서 다음주부터 들을 예정이기 때문에 또 열심히 달리게 되는 계기가 되지 않을까 싶다.

 

1. Spring

  • 과제에 스케줄러를 구현해보았다
  • 매일 오전 1시에 댓글 갯수가 0개인 게시글을 모두 삭제해주는 로직을 만들어야 했다
  • 먼저 애플리케이션에 @EnableScheduling으로 인식하게 해주고
@EnableScheduling
@EnableJpaAuditing
@SpringBootApplication
public class IntermediateApplication {

  public static void main(String[] args) {
    SpringApplication.run(IntermediateApplication.class, args);
  }

}
  • @Component를 달은 스케줄러 클래스를 생성했다
@RequiredArgsConstructor
@Component
public class PostScheduler {

    private final PostRepository postRepository;

    // 초, 분, 시, 일, 월, 주 순서
    @Scheduled(cron = "0 0 1 * * *")
    public void deletePost() {
        System.out.println("게시물 삭제 실행");

        // 모든 게시글에 대해서
        List<Post> postList = postRepository.findAll();
        for (Post post : postList) {
            if (post.getCommentNum() == 0) { // 해당 게시글의 댓글 갯수가 0이라면
                postRepository.deleteById(post.getId()); // DB에서 삭제
            }
        }
    }
}
  • @Scheduled가 붙은 메소드를 찾아 스프링이 설정한 시간에 맞게 해당 메소드를 실행해주는 것 같다
  • Post 클래스에 commentNum 필드를 추가하고 CommentService 클래스에서 댓글을 생성, 삭제할 때마다 이 필드에 반영하도록 해서 스케줄러가 모든 게시글의 댓글 갯수를 확인하여 삭제 처리하도록 구현했다
    • CommentService의 댓글 생성, 삭제 메소드에 각각 @Transitional이 있었기 때문에 게시글을 DB에서 불러와서 상황에 맞게 commentNum 값을 업데이트만 해주면 자동으로 DB에 반영해준 것 같다
  • 댓글 갯수를 게시글마다 직접 세는 것은 매우 비효율적이라 commentNum 필드를 따로 생성해서 관리하도록 했다
  • 마침 글 쓰던 중 서버가 돌아가고 있었는데 1시라서 DB를 새로고침했더니 댓글이 없는 게시글이 없어져서 뿌듯했다

2. Leetcode DFS

 

2331번

* 풀이 못함

class Solution:
    def evaluateTree(self, root: Optional[TreeNode]) -> bool:
        if not root.left: # leaf node
            return root.val
        
        # non-leaf node
        elif root.val == 2: # OR
            if self.evaluateTree(root.left) or self.evaluateTree(root.right): # 자식끼리 or 연산
                return True
            return False
        
        elif root.val == 3: # AND
            if self.evaluateTree(root.left) and self.evaluateTree(root.right): # 자식끼리 and 연산
                return True
            return False
  • 솔루션 메소드를 그대로 재귀로 돌렸고, 조건문을 정말 적절히 잘 활용해서 연산을 진행한 코드라고 생각한다.