본문 바로가기

전체 글

JPA Paging 삽질 기록 JPA에서의 Fetch join 조건 - @~ToOne은 몇 개든 사용 가능 - @~ToMany는 1개만 사용 가능 +) Entity Graph의 경우도 이 조건 동일하게 적용됨. Paging에서는 👉 N+1 해결하겠다고 fetch join, entity graph 잘못 쓰면 MultipleBagFetchException 발생 - @~ToOne은 join fetch 사용 가능(QueryDSL의 경우) BUT, jpql은 페이징에서는 fetch join 아예 사용 불가능 (Entity Graph는 사용 가능) 👉 페이징 시 QueryDSL 사용 권장! - @~ToMany는 페치 조인 불가능 👉 N+1 해결 방법 : default_batch_fetch_size 적용 👉또는, QueryDSL으로 쿼리문 작성하.. 더보기
Entity type으로 Wrapper class를 사용하는 이유 개발을 진행하다가, Entity class에서는 Integer, Long, Boolean등 모두 wrapper class를 사용한다는 것을 깨닫고, 그 이유를 알고 싶어서 서칭을 시작했다. 내 기준 가장 잘 설명되었던 블로그는 다음과 같다. https://blog.naver.com/tlsgur0529 tlsgur0529님의블로그 : 네이버 블로그 github: github.com/rlatls1997 gmail: rlatls1997@gmail.com blog.naver.com 다만 링크를 타고 들어가면 바로 해당 포스팅으로 넘어가지 않아서, 잠시 해당 부분 캡쳐본을 보자면 즉, 기본형은 null처리를 할 수 없고 0으로 디폴트 초기화가 일어난다. 때문에 예를 들어 0이 식별자로서의 값인지, 값이 없음의 0.. 더보기
정적 팩토리 메서드 정적 팩토리 메서드란? : 객체 생성의 역할을 하는 클래스 메서드 즉, 직접적으로 생성자를 통해 객체를 생성하는 것이 아닌, 메서드를 통해서 객체를 생성하는 것 (보통 네이밍을 from(하나의 매개변수를 받아서 객체를 생성), of(여러개의 매개 변수를 받아서 객체를 생성)로 함.) 정적 팩토리 메서드의 (생성자보다 나은) 장점 메서드 이름에 객체의 생성 목적을 담아낼 수 있음 → 가독성이 좋아짐 호출할 때마다 새로운 객체를 생성할 필요가 없음 새로운 객체 생성의 부담을 덜 수 있음 생성자를 private으로 설정해서 객체 생성을 정적 팩토리 메서드로만 가능하도록 제한할 수 있음 자주 사용되는 요소의 개수가 정해져 있다면, 해당 개수만큼 미리 생성해 놓고 조회(캐싱)하는 구조로 만들 수 있음 하위 자료형.. 더보기
Thread Local이란? 자바의 class 중 하나. 오직 한 쓰레드에 의해서 읽고 쓰여질 수 있는 변수 두개 이상의 쓰레드가 같은 코드를 실행하고 이 코드가 하나의 ThreadLocal 변수를 참조 하더라도 서로의 ThreadLocal 변수를 볼 수 없음 👉멀티 쓰레드 환경에서 각 스레드마다 독립적인 변수를 가지고 접근할 수 있음. 사용 방법 Context 클래스에서 ThreadLocal 객체를 생성한다. ThreadLocal.set() 메서드를 이용해서 현재 쓰레드의 로컬 변수에 값을 저장한다. ThreadLocal.get() 메서드를 이용해서 현재 쓰레드의 로컬 변수 값을 읽어온다. ThreadLocal.remove() 메서드를 이용해서 현재 쓰레드의 로컬 변수 값을 삭제한다. 자세한 내용 : https://javacan... 더보기
기타 에러 해결 기록들 프로젝트를 진행하면서 마주했던 잔잔바리 에러에 대한 해결 기록을 남긴다-! 1. Github에서 프로젝트를 레포지토리로 옮기는 초기 작업 참고 : https://eunhee-programming.tistory.com/158 (GitHub)깃허브 프로젝트 올리기/ 레파지토리 생성 및 지우는법(자세한 설명) 깃허브에 프로젝트 올리기 포스팅 요약 1. 깃허브 레파지토리 생성 및 프로젝트 올리기 - 자세한 설명 2. 생성한 레파지토리 - 자세한 설명 레파지토리 생성 및 프로젝트 올리기 1. 깃허브 접속 후 eunhee-programming.tistory.com 주의할 점 : 위 블로그 보고 따라하는데, 맨 마지막 명령어를 다르게 줘야 한다. git push origin main (ㅇ) git push origi.. 더보기
JPA N+1 문제 해결 * 본 내용은 인프런 JPA 기본 강의(김영한)를 정리한 내용을 포함하고 있습니다. * 지연 로딩 fetch = FetchType.LAZY 프록시로 조회해서 필요한 것만 쿼리문을 날림.(한꺼번에 자동으로 조인해서 데이터를 미리 가져오는 “즉시 로딩”과 반대 개념) 프록시의 메소드를 건드려서 실제로 “사용하는 시점”에 초기화가 되어 해당 쿼리문을 사용함 실무에서는 가급적 “지연 로딩”만 사용할 것. (즉시 로딩은 N+1 문제를 일으킴) @~ToOne은 디폴트가 즉시로딩. LAZY로 설정할 것 @~ToMany는 디폴트가 LAZY 모든 연관관계를 지연로딩으로 깔기. 그 후, 문제 발생 시 해결방법 : 페치 조인 (대부분의 경우 해결 가능) 엔티티 그래프 batch size N+1 해결 방법 ① : 페치 조인 .. 더보기
REST API 가이드 1. REST API 설계시 가장 중요한 다섯가지 규칙 ✅ URI는 정보의 자원을 표현 ✅ ****자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현 1. 소문자를 사용한다. 주소에서 대소문자를 구분하므로, 카멜방식이 아닌 소문자를 사용하여 작성한다. Bad http://ssafe.com/users/postComments Good http://ssafe.com/users/post-comments 2. 언더바를 대신 하이픈을 사용한다. 가급적 하이픈의 사용도 최소화하며, 정확한 의미나 표현을 위해 단어의 결합이 불가피한 경우에 사용한다. Bad http://ssafe.com/users/post_comments Good http://ssafe.com/users/post.. 더보기
[SSAFY 공통 프로젝트] ssafé 회고 7주간의 SSAFY 공통 프로젝트가 드디어 끝이 났다. 아래 목차의 순서대로 회고록을 작성해 보고자 한다. - 프로젝트를 통해 배운 점 - 아쉬운 점 - 차후 이어지는 프로젝트 때는 어떻게 할 건지 - 전반적인 프로젝트 후기 - 프로젝트를 통해 배운 점 이번 프로젝트는 비교적 긴 기간동안 맨 바탕에서부터 제대로 해보는, 내 첫 프로젝트여서 모든 게 새로웠고 그만큼 배우는 것도 많았다. 팀원들과의 지속적인 소통, 맨 바탕에서부터의 기획과 구현 모두 처음 해 보는 것이었고 그 과정에서 사용되었던 모든 툴과 기술 스택도 새로운 것이 많았다. 대부분의 소통은 디스코드를 통해 이루어졌고, 피그마를 통해 와이어프레임/프로토타입을 작성하며 기획했다. ground rule, convention, 데일리 스크럼, 기술 .. 더보기