728x90
반응형

Dev. 48

[Spring] 응답DTO에 엔티티 의존성을 주입해야 하는 경우

Response DTO란도메인 엔티티를 외부에 그대로 노출하지 않고 프론트에서 필요한 형태로 변환해 전달하는 역할즉, Response DTO는 도메인의 상태를 읽기 전용으로 표현하는 포장지다.그렇기 때문에 엔티티를 주입 DTO 안에서 필요한 정보만 꺼내 포맷팅하는 방식이 자연스럽다.주입 해야 하는 경우 - 필드 수처음에 Response DTO 만들 때 필드를 직접 하나씩 넣는 방식을 택했다.return new UpdateCommentResponse( comment.getId(), comment.getUser().getUsername(), comment.getSchedule().getTitle(), comment.getContent(), comment.getModifiedAt()..

Dev./Spring 2025.11.19

[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

[Error] Port 8080 was already in use

문제새로운 스프링 프로젝트 테스트 실행시 다음과 같은 오류가 콘솔창에 뜸Port 8080 is already in useIdentify and stop the process that's listening on port 8080 or configure this application to listen on another port.8080 포트를 이미 다른 프로세스에서 사용 중이라는 뜻나는 분명 이전 프로젝트 서버를 껏는데?이전 프로젝스 서버 죽이고 새로운 프로젝트를 실행했다.개발 중 의도치않게 포트가 점유된 상태로 서버가 백그라운드로 남는 경우가 종종 있다고 한다.appication.properties 파일에서 포트를 예를들어 8081 로 바꿔줄수도 있지만 정석대로 원인을 해결하는 방법으로 정함.상황 진단터..

Dev./Error. 2025.11.11

[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

[Error] MySQL 버전 충돌 (macOS/Homebrew)

예전에 공부용으로 homebrew로 설치된 mysql이 있었는데 이번에 예제 따라간다고 웹에서 MySQL 8.4 dmg를 추가 설치하면서 두 버전이 같은 포트와 데이터 디렉토리를 공유하며 지속된 충돌문제가 발생했다.발생된 로그로그설명Unable to lock ./ibdata1 error: 35InnoDB 데이터 파일(ibdata1)을 중복 프로세스가 잠그려 함Can't connect to local MySQL server through socket '/tmp/mysql.sock'이미 다른 인스턴스가 포트를 점유하거나 소켓 경로 다름Access denied for user 'root'@'localhost'root 인증 플러그인 꼬임 (caching_sha2_password ↔ mysql_native_pas..

Dev./Error. 2025.11.08

[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

[Error] JPA 양방향 연관관계에서 무한 루프문제 해결

문제단건 조회시 해당 엔티티에 딸린 댓글들을 가져올 때 엔티티를 그대로 반환하면서 무한 루프 문제가 발생했다.Todo와 Comment는 서로 양방향 연관관계로 연결되어있다. 원인@RestController는 반환값을 자동으로 JSON 직렬화한다고 한다. 그때 양방향 연관관계에서 Jackson이 Todo 객체를 JSON으로 변환하려 함Todo 내부의 comments를 직렬화하려 함각 Comment는 다시 todo를 가지고 있어서 Todo 직렬화 시도Todo → Comment → Todo → Comment … 🔁와 같은 순환문제가 발생한다. 즉, 객체가 서로를 참조하고 있어서 JSON 변환이 무한 루프에 빠지는 것해결해결방법은 여러가지가 있다고 하는데 나는 @JsonManagedReference / @Js..

Dev./Error. 2025.11.06
728x90
반응형