Spring Boot 20

인기 게시글 조회 속도 개선 (Botanify Project)

Project Link: https://github.com/sparta-Sounganization/Botanify GitHub - sparta-Sounganization/Botanify: 내일배움캠프2024 Spring__3기 최종 프로젝트 5조 - 반려 식물 성장 기내일배움캠프2024 Spring__3기 최종 프로젝트 5조 - 반려 식물 성장 기록 및 공유 커뮤니티 서비스 Spring BE - sparta-Sounganization/Botanifygithub.com 인기 게시글 조회 성능 test 결과 (Postman test scripts) 1. No Cache test 결과 (Redis Cache 적용 전) 2. Redis Cache 적용 후 test 결과 3. 성능 test 결과 설명Redis 캐..

Spring Boot 2025.01.16

대댓글(Nested comments) 기능 구현 방식

Single Table자기 참조 관계(Self-Referential Relationship)@Entitypublic class Comment { @Id @GeneratedValue private Long id; private String content; @ManyToOne private Comment parentComment; @OneToMany(mappedBy = "parentComment") private List childComments;}장점:구현이 간단함직관적인 객체 지향 설계댓글 트리를 쉽게 탐색 가능중간 깊이의 중첩에 적합한계:매우 깊은 댓글 트리에서는 비효율적재귀 쿼리가 까다로울 수 있음깊게 중첩된 댓글에서 성능 저하N+1 쿼..

Spring Boot 2024.12.05

JPA Query DSL 및 N+1 문제 Troubleshooting

Project's Github link: https://github.com/gbognon25/spring-plus GitHub - gbognon25/spring-plus: spring-plusspring-plus. Contribute to gbognon25/spring-plus development by creating an account on GitHub.github.com 배경(Background)Schedule('Todo') 관리 애플리케이션의 데이터 조회 성능을 개선하기 위해 코드 리팩토링을 진행하던 중, JPQL로 작성된 'findByIdWithUser' 메서드에서 N+1 문제가 발생할 가능성을 발견했습니다. 이 문제는 애플리케이션의 성능 저하로 이어질 수 있었습니다.Project에서 구현한 '..

Spring Boot 2024.11.20

JPA "N+1" 문제와 해결법

JPA N+1 문제는 JPA나 Hibernate를 사용하여 데이터베이스에서 관련된 엔티티를 가져올 때 발생하는 일반적인 성능 문제입니다. 1. JPA N+1 문제란?시나리오:User와 Post라는 두 개의 엔티티가 있다고 가정합니다. 여기서 User는 여러 개의 Post를 가질 수 있는 One-to-Many(1:N) 관계를 가지고 있습니다.모든 User와 각 User의 관련된 Post 데이터를 함께 조회하려고 합니다.어떻게 발생할까요?모든 User를 가져오기 위해 JPA는 1개의 쿼리를 실행합니다.조회된 각 User에 대해 JPA는 해당 User의 관련된 Post를 가져오기 위해 추가 쿼리를 실행합니다.만약 N명의 User가 있다면, 추가로 N개의 쿼리가 실행되어 총 N+1개의 쿼리가 실행됩니다.영향:이..

Spring Boot 2024.11.18

JPA QueryDSL

QueryDSL은 Java에서 타입 안전한 쿼리를 작성할 수 있도록 도와주는 프레임워크로, 주로 JPA와 함께 데이터베이스 쿼리에 사용됩니다. QueryDSL을 사용하면 네이티브 SQL이나 JPQL 문자열 대신 Java 코드를 통해 SQL과 유사한 쿼리를 생성할 수 있습니다. 이를 통해 타입 안전성, 컴파일 시점 검사, 자동 완성 기능을 제공하여 런타임 오류를 줄일 수 있습니다. JPA 환경에서 QueryDSL을 시작하는 방법은 다음과 같습니다. 1. QueryDSL 설정QueryDSL을 JPA와 함께 사용하려면 프로젝트에 depedencies(의존성)을 추가해야 돼요.- 'build.gradle' file에 다음 depedencies 있어야 됩니다.dependencies { //QueryDSL ..

Spring Boot 2024.11.12

Spring Boot - Live Template 생성 및 사용(IntelliJ IDE)

IntelliJ IDE에서 더 빨리 coding 작업을 하기 위해 Live template을 미리 생성하여 저장하고 사용할 수 있습니다. Entity template 예제:/** * 컬럼 - 연관관계 컬럼을 제외한 컬럼을 정의합니다. */ /** * 생성자 - 약속된 형태로만 생성가능하도록 합니다. */ /** * 연관관계 - Foreign Key 값을 따로 컬럼으로 정의하지 않고 연관 관계로 정의합니다. */ /** * 연관관계 편의 메소드 - 반대쪽에는 연관관계 편의 메소드가 없도록 주의합니다. */ /** * 서비스 메소드 - 외부에서 엔티티를 수정할 메소드를 정의합니다. (단일 책임을 가지도록 주의합니다.) */ 위 내용은 IntelliJ IDE에서 'Entity Live Template'으로 ..

Spring Boot 2024.11.11

Entity 관계 - JPA Cascade, Orphan Removal, Fetch

1- Cascade"cascade" 속성은 부모 엔티티에서 관련 엔티티로 작업(예: persist, merge, remove 등)이 어떻게 전파될지 정의합니다. 이 설정은 관계를 자동으로 관리하는 데 유용하며, 연쇄가 없으면 각 관련 엔티티의 생명주기를 개별적으로 처리해야 합니다. 주요 Cascade 유형일반적으로 사용되는 cascade 유형은 다음과 같습니다: CascadeType.PERSIST: 부모 엔티티가 영속화(persist)될 때 모든 관련 엔티티도 함께 영속화됩니다.CascadeType.MERGE: 부모 엔티티가 병합(merge)될 때 관련 엔티티도 병합됩니다.CascadeType.REMOVE: 부모 엔티티가 삭제될 때 관련 엔티티도 함께 삭제됩니다.CascadeType.REFRESH: 부모..

Spring Boot 2024.11.11

Spring Boot - Github Repository에서 민감한 정보를 숨기기 (IntelliJ)

Github repository에서 민감한 정보가 유출되지 않도록 유의하셔야 하죠.Spring Boot에서 project를 설정할 때 project의 credentials가 갖고 있는 'application.properties' file을 잘 설정해야 됩니다. 1. 'application-dev.properties' file 생성 및 설정 IDE는 IntelliJ입니다.왼쪽에 있는 'resources' folder를 right click 하고 'application-dev.properties' file를 만듭니다.  NB: 생성한 'application-dev.properties' file는 git에 추가하지 마세요.  생성된 file은 git에 추가하라고 하는 창이 뜨면 'Cancel'를 click하세..

Spring Boot 2024.11.08

Spring Boot app과 local MySQL database 연동

Spring Boot Team project를 진행하며서 application을 실행해 봤는데 다음과 같은 오류가 발생했습니다. IDE는 IntelliJ입니다.  오류의 원인을 알아봤는데 "application.yaml" file의 확인해야 된다고 결과가 나갔습니다.그애서 "resources"에 있는 "application.yaml" file를 찾아갔습니다. 내용은 다음과 같습니다.해결 과정1. spring.datasource 설정spring.datasource 설정을 로컬 데이터베이스로 변경하여 H2 메모리 내 데이터베이스 대신 사용할 수 있도록 업데이트해야 합니다. 여기에는 URL, 사용자 이름, 비밀번호 및 데이터베이스 설정에 맞는 드라이버 클래스 이름을 변경하는 것이 포함됩니다.다음을 변경해 주세..

Spring Boot 2024.11.07