728x90
반응형

Dev./Spring 18

[Spring] Pageable+Page 사용해 Pagination 적용해보기

왜 Pagination을 사용해야 할까?데이터가 많아질수록 한 번에 모든 데이터를 불러오면 성능저하, 네트워크낭비, 응답 지연 문제가 생긴다.그래서 일정 개수만 잘라서 가져오는 페이지네이션을 사용한다.Spring Data JPA는 Pageable, Page 기능을 제공해주어 페이지네이션을 쉽게 구현할 수 있게 해준다.Page실제 조회된 결과 + 페이지 정보레포지토리에서 조회하면 페이지 객체 반환Page pagination = scheduleRepository.findAll(pageable);단순히 데이터 리스트가 아니라 페이지 정보를 함께 담고 있다.Page 객체가 제공하는 정보메서드 의미getContent()현재 페이지의 실제 데이터 ListgetNumber()현재 페이지 번호getTotalPages..

Dev./Spring 2025.11.18

[Spring] record DTO 클래스

응답 DTO 클래스를 만들다보면 인텔리제이에서 Convert to record 표시가 뜬다. 단순히 코드 추천인 줄 알고 넘어갔는데왜 응답 DTO에 추천이 뜰까 생각하며 record 클래스를 알아보게 되었다.record 클래스자바 14부터 도입된 불변 객체를 간편하게 생설할 수 있는 새로운 타입. record는 주로 데이터를 보관하는 객체로 사용되며, 기본적인 작업들을 자동으로 처리해주기 때문에 간결하고 효율적이다.특징1. 불변 객체객체가 생성된 후, 필드를 변경할 수 없다.final로 처리된 필드만 사용하기 때문에 불변성 보장2. 자동 생성 메소드getter, toString(),equals(),hashCode() 메소드가 자동으로 생성필드를 기반으로 계산되므로, 객체의 값을 비교하거나 문자열로 출력할..

Dev./Spring 2025.11.17

[Spring] DELETE 메소드에 RequestBody를 지양해야 하는 이유

글 삭제시 유저가 입력한 패스워드와 작성자의 패스워드 일치시 삭제를 구현해야했는데 강의대로 따라가다보니 @DeleteMapping과 @RequestBody를 같이사용하게 되었다.피드백HTTP Method중 GET과 DELETE에서 RequestBody의 사용은 지양해야 합니다. 지금은 HTTP Method를 정의한 문서에서 GET과 DELETE에서 RequestBody(요청 본문)의 의미가 정의되어있지 않기 때문입니다. 다시말해 요청본문이 있어도 그것이 어떤역할을 해야할지 명확하지 않아 무시되거나 거부될 수 있습니다. 실무적인 관점에서는 사용하는 라이브러리/프레임워크/버전에 따라서 DELETE에 요청본문을 허용하지 않는 것들이 있습니다.또한 일반적으로 DELETE에 요청본문을 넣지 않는다는 룰이 있어 다..

Dev./Spring 2025.11.13

[Spring] Filter

Filter란?Filter는 Spring 전용 기술이 아닌, 자바 서블릿(Java Servlet) 표준 스펙에서 제공하는 기능이다.즉, Spring이 등장하기 전부터 톰캣(Tomcat), 제티(Jetty) 같은 서블릿 컨테이너 수준에서요청과 응답을 가장 먼저 가로채어 처리하는 구조다.Spring Boot는 이런 Servlet Filter를 내부적으로 자동 등록하고Spring 애플리케이션의 맨 앞단(DispatcherServlet 이전) 에서 실행되게 해준다.동작 구조클라이언트 요청 ↓[Filter] ─── Servlet 레벨 (보안, 인코딩, 인증) ↓DispatcherServlet ─── Spring MVC 진입점 ↓[Interceptor] ─── Spring 레벨 (로깅, 권한 검증,..

Dev./Spring 2025.11.13

[Spring] JPA 영속성 컨텍스트

영속성 컨텍스트데이터베이스와 애플리케이션 사이에 JPA가 만든 임시 저장소(캐시)영속성 컨텍스트의 역할역할설명이해를 위한 비유① 1차 캐시같은 엔티티를 두 번 조회해도 DB에 다시 안 감한 번 불러온 책은 책상 위에 둔다② 변경 감지 (Dirty Checking)엔티티의 필드가 바뀌면 자동으로 UPDATE 감지책을 수정하면 포스트잇으로 표시해둔다③ 쓰기 지연 (Flush 시점에 DB 반영)INSERT, UPDATE, DELETE가 트랜잭션 끝날 때 실행됨숙제는 한 번에 제출한다DB 접근을 최소화한 ORM이 효율적인 ORM생명주기에 따른 4가지 상태상태설명예시비영속 (new)아직 JPA에 저장 안 됨new Todo("공부")영속 (managed)EntityManager에 저장되어 관리 중em.persist..

Dev./Spring 2025.11.10

[Spring] JPA N+1 문제

상황 요약단건 조회시 1:N 양방향 관계로 설정된 A 엔티티와 연결된 B 엔티티 목록을 함께 내려주는 기능을 구현해야 했다.@Entitypublic class Todo { @OneToMany(mappedBy = "todo", fetch = FetchType.LAZY) private List comments = new ArrayList();}@Entitypublic class Comment { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "todo_id") private Todo todo;} Todo를 불러와 그 안의 todo.getComments()를 호출했을 때 다음과 같이 쿼리 두번이상 실행되는 문제가 발생했다.select..

Dev./Spring 2025.11.07

[Spring] JPA 관계 설정(1:N/N:1)

JPA 관계 설정ERD에서 DB간 관계를 설정했다면 그 관계를 자바 객체 수준에서 반영하는 과정을 의미한다. 즉 ERD 테이블 관계를 코드로 옮겨온다 라고 이해하면 될 것 같다. ERDJPA 관계 설정표현 대상데이터베이스자바 객체단위테이블엔티티 클래스관계 표현PK/FK어노테이션 (@OneToMany, @ManyToOne)주 언어SQL, 다이어그램Java역할설계구현결과DB 스키마코드 로직에서의 연결JPA 관계 설정 핵심 키워드 정리1. @OneToMany / @ManyToOne — 가장 기본적인 관계 표현의미1:N 관계 (예: Todo 1개 → Comment 여러 개)N:1 관계 (예: Comment 여러 개 → Todo 1개)키워드 포인트외래키(FK) 는 항상 N 쪽(다수 쪽) 에 존재한다.→ 그래서 @..

Dev./Spring 2025.11.05

[Spring] 수정 사항 발생시 자동 리빌드 Auto Reload

API 구현 후 포스트맨에서 통신할 때 수정 사항이 발생하면 서버를 껐다 켜서 컴파일 시켜야했다. 수정사항이 얼마나 많은데 그때마다 서버 껐다 킬 수는 없으니 방법을 알아보다 핫 리로드 설정을 보게 되었다.왜 서버를 껐다 켜야 수정사항이 반영되는 걸까?java는 코드를 컴파일러가 기계어로 번역 후 실행하는 컴파일 언어다. 저장 즉시 실행되는 것이 아니라 컴파일 -> 클래스 로딩 -> 실행 순의 순서가 필요하다. 프로그램이 실행될때 CPU가 바로 기계어를 읽을 수 있어서 빠르지만 개발자가 코드 수정시 재컴파일 해야한다는 단점이 있다. 즉 자바의 특성을 이해하면 알 수 있다.핫 리로드 서버를 껐다 켜지 않아도 코드 수정이 즉시 반영되게 하는 개발 환경 설정장점코드 저장 순간 인텔리제이가 자동 빌드, 변경된..

Dev./Spring 2025.11.04
728x90
반응형