[Spring Boot] Spring AOP
·
Back-End/Spring Boot
들어가기 전에 InConcert 프로젝트를 진행하면서 스크래핑 시간을 측정할 때, 메소드 안에서 실행 시간을 측정하는 것이 과연 올바른지 생각하게 되었다. 비즈니스 로직과 공통 로직을 분리하고 싶었고, 이를 AOP를 적용해서 코드를 수정하기로 하였다. 이전의 코드는 이 게시물에서 확인할 수 있다.  AOP? AOP(Aspect Oriented Programming)는 관점 지향 프로그래밍으로, 기존의 OOP(객체 지향 프로그래밍)을 보완하는 확장 형태로 사용하고 있다. '관심의 분리'를 통해 핵심 관점(비즈니스 로직)과 횡단 관점(트랜잭션, 로그 등)을 분리하고자 하는 목적을 가지고 있다. AOP의 용어는 다음과 같다.📌 AOP 용어JoinPoint: 어플리케이션을 실행할 때 특정 작업이 실행되는 시점..
[Spring Boot] 스크래핑 비동기 처리
·
Back-End/Spring Boot
들어가며 2024년 7월 말부터 10월 초까지 약 3개월 간 진행했던 프로젝트에 대해 정리할 만한 내용을 블로그에 기재하기로 했다. 프로젝트명은 InConcert로, 공연 소식을 확인하고 동행을 구하는 서비스이다. 크게 정리할 내용은 다음과 같다.쿼리 최적화공연 정보 스크래핑 (비동기 처리) ➡️ 이번 게시글 주제!인기 공연 순위 알고리즘이 글에서는 스크래핑 비동기 처리 과정에 대해 설명하려고 한다.  페이지 구성메인 페이지를 보면 '오늘의 인기 공연'란을 확인할 수 있다. Play DB에서 Selenium을 통해 공연 정보를 스크래핑한 것이다. 문제 상황스크래핑 과정에서 발생했던 문제는 동기 처리로 스크래핑을 진행하다 보니 시간이 오래 걸린다는 점이었다. 동기 처리로 실행한 코드를 살펴보자. 스크래..
[Spring Boot] N+1 문제
·
Back-End/Spring Boot
들어가기 전에 엔티티를 작성할 때 연관된 다른 테이블을 필드에 작성하는 경우가 있다. 한 테이블이 외래키를 갖는 경우 @ManyToOne을 통해 매핑하게 되는데, 여기서 우리는 FetchType을 설정하게 된다. 로딩 방식에는 Lazy Loading과 Eager Loading이 있다. 이 둘에 대해 알아보고 관련해서 나타나는 N+1 문제를 살펴보자.  Lazy Loading & Eager LoadingLazy Loading Lazy Loading은 지연 로딩이라고 하며, 연관된 엔티티를 실제로 접근할 때 불러오는 방식이다. 데이터베이스에서 엔티티를 가져올 때 로드하지 않고 해당 필드에 처음 접근할 때 쿼리가 발생한다. 초기 로드 시 필요한 데이터만 가져오므로 메모리 사용량이 줄어드는 이점이 있다. 하지만..
[Spring Boot] JPA 쿼리 최적화
·
Back-End/Spring Boot
들어가며 2024년 7월 말부터 10월 초까지 약 3개월 간 진행했던 프로젝트에 대해 정리할 만한 내용을 블로그에 기재하기로 했다. 프로젝트명은 InConcert로, 공연 소식을 확인하고 동행을 구하는 서비스이다. 크게 정리할 내용은 다음과 같다.쿼리 최적화 ➡️ 이번 게시글 주제!공연 정보 스크래핑 (비동기 처리)인기 공연 순위 알고리즘이 글에서는 쿼리 최적화 과정에 대해 설명하려고 한다. 페이지 구성우선 메인 페이지를 살펴보면 카테고리 별로 게시물을 출력하고, 상단에는 인기 공연을 보여주고 있다.  문제 상황메인 페이지를 조회했을 때 글을 불러오면서 화면상에 보이는 게시물뿐만 아니라 전체 게시물을 불러오는 문제가 있어 html의 코드를 수정하였다.공연 정보를 스크래핑하는 경우를 고려한다면 게시물이 ..
[Spring Boot] Setter vs Builder
·
Back-End/Spring Boot
프로젝트를 진행하다 보면, CRUD 작업을 하는 경우가 많다. 특히 Update 작업을 하는 경우, 개발하는 과정에서 Setter의 사용을 지양하라고는 하는데, 도대체 왜일까? 객체의 불변성이 깨질 수 있다.Setter를 사용하는 경우, 객체의 상태가 변할 수 있기 때문에 객체지향 설계 원칙인 개방-폐쇄의 원칙(OCP)에 어긋나게 된다. OCP는 확장에 대해서 개방되어야 하나 수정에 대해서는 폐쇄적이어야 한다는 것으로, Setter를 사용하게 되면 수정에 대해 문제가 발생할 수 있다는 점을 알아야 한다. 예시 코드를 함께 보자.public class PersonService { private PersonRepository personRepository; public PersonService(P..