2025/02 20

본캠프 : 심화 개인 과제_N+1 문제

N+1 문제: JPA가 연관된 엔티티를 조회할 때 추가적인 쿼리(N개)를 반복적으로 실행하기 때문에 발생하는 문제 Lazy Loading지연 로딩(Lazy Loading)은 데이터를 실제로 사용할 때 데이터베이스에서 조회하는 방식(N+1 문제 발생) Eager Loading즉시 로딩(Eager Loading)은 엔티티를 조회할 때 연관된 데이터까지 모두 한 번에 로드하는 방식 Entity클래스에서 해당 필드의 Fetchtype을 Eager로 설정하면 N+1 문제가 발생하지 않는다.하지만 연관된 객체를 매번 함께 조회하는것은 낭비인 경우가 있다. 해결방안Fetchtype을 Lazy로 설정하되 추후에 쿼리를 작성할 때 fetch join을 사용하여 해당 부분은 Eager로 동작하게 한다. Fetch join..

개발/부트캠프 2025.02.27

본캠프 : 테스트 코드

테스트 준비Spring Bootdependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test'} 📌 스프링 부트에서는 이미 호환되는 버전의 테스트 관련 라이브러리들이 제공된다.테스트는 중요하기에 따로 테스트 관련 의존성을 넣지 않더라도 default로 포함되어있다. Given-When-Then 패턴Given : 주어진 전제 조건을 정의하고 테스트 실행을 위한 준비 "어떤 배경이나 상태가 주어졌을 때"When : 테스트하려는 메서드나 기능을 실행하는 과정 "어떤 행동을 실행하면"Then : 메서드나 기능이 실행된 후 예상되는 결과가 나오는지 확인 "예상한 결과가 맞는지 확인한다" import org.junit...

개발/부트캠프 2025.02.26

본캠프 : 챌린지반 특강_Git

commit: 작업의 의도와 히스토리를 파악할 수 있는 문장 commit type타입목적feat, feature새로운 기능 추가imp, impl기존 기능 수정fix버그, 결함 수정hotfix긴급 수정(to master)refector, refec리펙토링test테스트 코드choreconfig, 빌드 수정 등 잡다.. merge 전략: merge commit, squash, rebase주어진 상황에 따라 각 merge 방법을 알고 사용 *rebase: 브랜치의 커밋 히스토리를 다른 브랜치 위로 재배치(rebase)

개발/부트캠프 2025.02.25

본캠프 : 특강_영속성 컨텍스트 (Persistence Context)

영속성 컨텍스트 (Persistence Context)  ▶ 조건1) @Transactional 내에서 가능(readOnly 제외)2) DB에 한 번이라도 갔다 오기 위 두가지 조건이 모두 맞으면 영속성 컨텍스트 상(메모리)에서 관리가 된다. ▶ 장점1) 캐시 지원 : 한 번 조회된 데이터는 다시 쿼리하더라도 DB를 사용하지 않고 캐시 데이터를 사용2) 더티 체킹 : 트랜잭션 종료 시점에 자동으로 변경사항을 DB에 반영

개발/부트캠프 2025.02.24

본캠프 : Git - GitHub 저장소 재설정

1. 기존 원격 저장소 확인먼저 현재 프로젝트에 연결된 원격 저장소 목록을 확인git remote -v 출력 결과가 다음과 같다면 원격 저장소가 이미 설정됨origin  https://github.com/기존-레포지토리-주소 (fetch)origin  https://github.com/기존-레포지토리-주소 (push) 2. 기존 원격 저장소 제거 후 새로 추가이미 존재하는 원격 저장소를 삭제하고 다시 추가하는 방법git remote remove origingit remote add origin https://github.com/변경-레포지토리-주소 현재 프로젝트에 연결된 원격 저장소 목록을 재확인git remote -v

개발/부트캠프 2025.02.21

본캠프 : 중복 코드 메서드로 만들기

1. findById와 updateById에서 중복으로 사용하는 코드가 있다.User findUser = userRepository.findById(id).orElseThrow( () -> new ResponseStatusException(HttpStatus.NOT_FOUND, "해당 ID가 존재하지 않습니다.")); 2. 중복되는 코드를 드래그하면 Method Extract이 가능하다. 3. 자동으로 getUser 메서드를 만든 후 같은 코드가 작성된 로직에도 Replace한다. 4. findById와 updateById에 getUser 메서드가 적용되었다. → 2번 이상 같은 코드가 작성되면 메서드화 시키는 것이 좋다. 그럼 수정 시에 해당 메서드만 변경하면 된다. 끝!

개발/부트캠프 2025.02.20

본캠프 : 뉴스피드 제작(팀 프로젝트)_소프트 삭제(Soft Delete)

[ User 소프트 삭제 방법 ]1. User Entity  설정필드 추가       private LocalDateTime deletedAt클래스 전체 적용       @SQLDelete(sql = "UPDATE users SET deleted_at = now() WHERE id = ?")       @SQLRestriction("deleted_at IS NULL")  2. 설명1) @SQLDelete란?JPA에서 @Entity가 삭제될 때 실행할 SQL을 정의하는 어노테이션입니다.기본적으로 delete from users where id = ?로 실행되는 DELETE 명령어를 사용자 정의 SQL로 변경할 수 있습니다.@SQLDelete를 활용하면 데이터를 실제로 삭제하지 않고, deleted_at 컬..

개발/부트캠프 2025.02.19

본캠프 : Spring Data JPA 페이지네이션(Pagination)

[ Spring Data JPA 페이지네이션(Pagination) ]Spring Data JPA에서는 Pageable과 Page 인터페이스를 사용하여 데이터를 페이지 단위로 조회할 수 있어요.이를 통해 대량의 데이터를 한 번에 불러오는 것이 아니라, 필요한 만큼 가져올 수 있도록 해줍니다. ✅ 페이지네이션 핵심 개념📌 기본 개념Pageable : 페이지 정보를 담는 인터페이스요청한 페이지 번호(page), 페이지 크기(size), 정렬 방식(sort)을 포함PageRequest.of(page, size)를 사용하여 객체 생성Page : 페이지 결과를 담는 객체getContent() : 현재 페이지의 데이터 리스트getTotalPages() : 전체 페이지 수getTotalElements() : 전체 데..

개발/부트캠프 2025.02.17

본캠프 : 뉴스피드 제작(팀 프로젝트)_비밀번호 수정 API

비밀번호 수정 API기존프로필 수정 서비스 로직에서 유저 확인을 위한 비밀번호 검증 및 수정이 같이 구현됨변경비밀번호 수정 API 추가함 UserPasswordUpdateRequestDto 설정필드(현재 비밀번호와 새 비밀번호)private String currentPasswordprivate String newPassword User Entity 설정필드비밀번호 변경을 위해 User Entity에 currentPassword와 newPassword 필드를 추가할 필요가 없음User Entity에 추가하면 이 값이 데이터베이스에 저장되므로 불필요한 데이터가 남게 됨비밀번호 변경 요청은 일회성데이터이므로, DTO에서만 관리함메서드(새 비밀번호 저장)public void updatePassword(Strin..

개발/부트캠프 2025.02.14