전체 글 썸네일형 리스트형 [ SpringBoot / JPA ] 무한 참조 문제 해결 : :java.lang.IllegalStateException: Cannot call sendError() after the response has been committed 에러 내용 java.lang.IllegalStateException: Cannot call sendError() after the response has been committed Failure while trying to resolve exception [org.springframework.http.converter.HttpMessageNotWritableException] 이미지 별로 좋아요 정보를 가져오는 로직에서 사용자가 올린 게시물에 좋아요를 누르지 않았을 때는 무한 참조가 발생하지 않았었는데 1번 사용자가 2번 사용자의 이미지 게시물을 좋아요 누르자 마자 새로 로딩하면 무한참조가 발생하는 문제가 발생했다. 이를 해결하기 위해 postman으로 데이터를 찍어보았다. 다음과 같이 좋아요 정보인 l.. 더보기 [SpringBoot] 중복 유니크 키 제약조건 생성 중복 유니크 키 선언하는 방법을 알아보자. 중복 유니크 키는 왜 선언했는가? 게시물 좋아요 기능을 만들기 위해서 좋아요 엔티티를 선언하는 과정에서 한 사람이 하나의 이미지에 대해서 좋아요를 눌러 DB에 하나의 row 데이터가 생성되었다고 가정했을 때 동일한 사람이 동일한 이미지에 대해서 다시 좋아요를 누를 수 있는가? 아니다. 한 사람은 하나의 게시물에 좋아요를 눌렀을 경우, 다시 좋아요를 누르면 중복 데이터가 쌓이는 것이 아닌 좋아요가 취소가 되어야 한다. 즉, userId와 imageId 는 중복 유니크 키로 선언해야한다. 그 과정은 다음과 같다. @Table 어노테이션에 uniqueConstraints 속성을 주고, @UniqueConstraints 어노테이션에 name 속성을 likes_uk 로 .. 더보기 [SpringBoot] 게시물 페이징 처리하기 오늘은 페이징 처리하는 방법을 알아보자. 페이징 처리하는 방법은 생각보다 간단했다. 🙋♀️ Controller 코드 먼저 컨트롤러에서 @PageableDefault 어노테이션을 명시하고, Pageable 객체를 받아오면 된다. @PageableDefault는 Spring Data JPA에서 페이징 처리를 위한 기본 설정을 지정하는 어노테이션이다. 이 어노테이션은 컨트롤러의 매개변수로 받는 Pageable 객체의 기본값을 설정할 때 사용된다. 또한 size 속성을 활용해서 몇개씩 content 를 끊어서 가져올지도 명시하면된다. import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; impor.. 더보기 [JPA] 양방향 매핑 업로드 파일을 프로젝트 외부에 두는 이유 프로젝트 폴더에는 .java 파일이 있음. 이 파일이 컴파일 되어 실행이되는 것임. target 폴더가 있는데 그 안에 서버가 실행될 때 컴파일을 해서 .class 파일이 여기에 저장됨. 프로젝트 폴더 안에 있는 파일들은 모두 컴파일해서 target 폴더에 반영이된다. -> 이 과정을 "Deploy(배포하다)" 라고 한다. 그래서 결국 target 에 있는 파일들이 실행이 되는 것임. 만약에 프로젝트 내부에 업로드 폴더를 만든 뒤 이미지를 업로드하면, target 폴더로 이동하게 된다. target 폴더 내부에 있는 파일들이 실행이 된다. 배포될 때 즉, target 파일들로 옮겨지는데 시간이 걸리는데 이미지 파일의 경우 용량이 조금 더 커서 시간이 오래 걸릴 수.. 더보기 [SpringBoot] 파일 java.nio.file.NoSuchFileException 파일 업로드 기능을 구현하는 과정에서 해당 오류가 나타났다. 👀 오류 내용 2024-03-13 06:05:28.534 ERROR 63261 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: java.nio.file.NoSuchFileException: Users/XXXXX/workspace/work_springboot/upload/4bcb0611-14d.. 더보기 [Builder pattern] @Builder 사용 하여 객체의 정보를 수정할 때 값이 수정되지 않고 초기화 되는 문제 Builder 패턴 👀 문제 상황 사용자의 정보를 수정하는 로직을 작성하는 중에 dto로 받아온 사용자의 수정 데이터를 toEntity 라는 메서드로 엔티티 객체로 변환하는 순간 dto로 받아온 데이터들이 모두 사라지는 문제를 겪었다. Chat GPT 에게 물어봐도 toEntity 메서드는 객체를 새로 생성하는 메서드이기 때문이라고 하는데 나는 이 이야기를 들으면서도 도대체 말을 이해하지 못했다. 당연히 빌더 패턴을 사용해서 dto를 entity로 변경하는 건데 왜 기존의 값이 수정되지 않고 새로 생성이 되는지 이해를 못했다. 이건 내가 빌더패턴을 정확하게 이해하지 못해서 발생한 대참사이다. 빌더는 객체를 수정하는 것이 아니라 생성자처럼 객체를 생성하는 기능을 수행한다고 한다. 🌟 정확하게 알아야 할 개.. 더보기 [ SpringBoot ] lombok : 오버라이딩한 생성자에 @Builder 어노테이션 사용 시 발생하는 문제 오늘은 개인 미니프로젝트를 하다가 새롭게 알게 된 내용을 적어보려고 한다. Builder 어노테이션을 활용하여 회원가입, 회원정보수정 시 사용할 생성자를 정의해두었다. @Builder public User(String username, String password, String name, String email) { this.username = username; this.password = password; this.name = name; this.email = email; } @Builder public User(String name, String password, String website, String bio, String phone, String gender) { this.name = name; .. 더보기 [회고록] 3월 1 - 2주 회고록 스스로 칭찬할 점 자바의 정석 진도를 꾸준히 나가고 있다. 하루에 4~5개를 들으려고 노력중이다. 코딩테스트를 준비할 생각이 없었지만, 인턴 지원 때 코테를 준비하며 조금 더 문제를 잘 풀어보고 싶다는 생각에 알고리즘 책을 보며 차근차근 자료 구조를 코드로 구현하는 연습을 해보았다. 깃허브 Readme 파일을 열심히 꾸몄다. (프로필 페이지, 부트캠프 미니 프로젝트 설명 페이지) 이걸로 포트폴리오를 제출하면 조금 더 간편할 것 같다는 생각이 들었다. 하지만 깃허브 링크까지 들어가서 봐주실지 조금 걱정이 된다. 대책을 세워봐야겠다. 노션에 3월 목표를 정리하고, 세부 체크리스트를 적으며 차근차근 할 일을 해나가는 중이다. 원티드 프리온 보딩을 신청해서 AWS 강의를 듣는 중이다. 현업에 계신 개발자분들의 .. 더보기 이전 1 ··· 3 4 5 6 7 8 9 ··· 20 다음