분류 전체보기 (22) 썸네일형 리스트형 [JPA] N+1 문제 해결하기 JPA를 사용하면 한번쯤 겪게 되는 N+1 문제와 해결방법에 대해 정리해보겠습니다. 1. N+1 문제란? 하나의 쿼리로 데이터 N개의 목록을 가져오려고 할 때, 각 데이터 별로 연관된 데이터를 조회하는 쿼리가 발생하여, 총 N개의 쿼리가 추가로 발생하는 문제를 N+1 문제라고 합니다. 한 회원이 여러 게시물을 작성할 수 있다고 가정하고, Board 에서만 N:1 단방향으로 회원을 참조하도록 설계해보겠습니다. 이제 BoardRepository와 MemberRepository를 작성해보겠습니다. 간단하게 삽입과 조회 기능만 추가해두겠습니다. 다음으로 회원과 게시물 데이터를 넣고, 게시물의 목록을 조회하는 findAllByViewDesc를 이용해 게시물 목록을 조회수 내림차순으로 조회해보겠습니다. 테스트 코드.. [글로런] N+1 문제 해결하기 코스 목록을 조회하는 로직에서, N+1 문제가 발생한 적이 있습니다. 코스 목록을 조회하면서, 각 코스 별로 작성자를 조회하는 쿼리가 N번 발생하는 문제가 발생한 것이죠. 문제 상황과 해결과정은 아래의 글에 별도로 정리해두었습니다. https://lback.tistory.com/12 [리마인더]개인정보처리방침 ('duf7040@gmail.com' 이하 '리마인더')은(는) 「개인정보 보호법」 제30조에 따라 정보주체의 개인정보를 보호하고 이와 관련한 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같이 개인정보 처리방침을 수립·공개합니다. ○ 이 개인정보처리방침은 2023년 4월 4부터 적용됩니다. 제1조(개인정보의 처리 목적) ('duf7040@gmail.com '리마인더')은(는) 다음의 목적을 위하여 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다. 제2조(개인정보의 처리 및 보유 기간) ① < 리.. [JPA] 즉시로딩, 지연로딩 JPA의 즉시 로딩과 지연 로딩에 대해 정리해보겠습니다. 1. 도메인 설계 연관 관계를 설명할 때 가장 자주 쓰이는 예시인 Team, Member 도메인을 이용하겠습니다. 둘 다 id와 name만 갖도록 간단하게 설계했고, Member에서만 N:1 단방향으로 Team을 참조하계 설계했습니다. 2. 즉시로딩 FetchType.EAGER, 즉시로딩으로 설장하고, 팀과 회원을 하나씩 저장한 후, 회원만 조회했을 때 어떻게 조회되는지 확인해보겠습니다. 테스트 코드는 다음과 같습니다. 팀1과 팀1에 속하는 회원1을 저장하고, 영속성 컨텍스트를 한번 비워줍니다. 이후 회원을 조회하고, 회원의 팀의 이름을 출력해보았습니다. 이때 생성된 쿼리를 확인해보겠습니다. 회원을 조회하는 시점에서 left join을 이용하여 팀.. [글로런] 지연로딩 이용하기 프로젝트 진행하며 발생했던 이슈를 정리하려다보니, 프로젝트 자체의 이슈보다는 스프링이나 JPA 등 사용한 기술과 직접적으로 연관된 이슈가 많네요. 따라서 문제 상황만 확인하고, 자세한 내용은 별도의 글로 정리하도록 하겠습니다. 우선 문제 상황은 코스에 대한 소개 column 입니다. 지금 코스 테이블의 설계는 위와 같습니다. 코스에 대한 소개를 별도의 테이블로 분리해둔 상황이죠. 주석으로 쓰여있듯이, 자주 조회되는 값이 아니고 조회 시 부담되는 값이기 때문입니다. 예를 들어 코스의 목록을 보여줄 때는 제목이나 작성자는 보여지지만, 그 소개는 보여지지 않습니다. 만약 MyBatis를 이용한다면 조회할 column에서 introduction을 제외하는 것으로 충분할 수도 있겠지만, JPA를 이용하여 Cour.. [Web] JWT 이 글에서는 JWT에 대해 정리해보겠습니다. 1. 세션 인증 JWT 에 대해 살펴보기에 앞서, 먼저 세션을 통한 인증 방식에 대해 간단하게 살펴보겠습니다. 세션을 이용한 인증은 서버 측에서 사용자의 정보를 저장하여 이뤄집니다. 세션을 이용하면 저장과 삭제를 통해 꽤나 간편하게 로그인 과정을 처리할 수 있습니다. 1. 로그인 요청 2. 로그인 처리 -> 세션에 사용자 정보 저장 3. 로그아웃 요청 -> 세션에서 사용자 정보 제거 세션은 사용자의 정보가 서버에서 보관되는 방식이기 때문에, 보안상으로 안전한 편입니다. 참고로 기본적으로 세션은 서버의 메모리에 사용자의 정보를 저장합니다. 다만 메모리의 단점을 극복하기 위해 하드 디스크나, DB까지 다양하게 사용한다고 합니다. 2. JWT (1) JWT란? 세션.. [Web] OAuth 2.0 OAuth 2.0에 대해 정리해보겠습니다. 1. OAuth 2.0 (1) OAuth 2.0 이란? OAuth 2.0은 기본적으로 '권환을 위임받기 위한 프로토콜' 입니다. 이를 보다 자세히 이해하기 위해서는 3가지 주체가 필요합니다. A라는 서비스에서 B라는 서비스에 저장된 사용자의 자원이 필요하다고 가정해봅시다. (대표적으로 소셜 로그인이 그 예 입니다.) (1) Resource Owner 서비스를 이용하는 사용자입니다. (2) Resource Server 위 가정에서 B 서비스가 resource server에 해당됩니다. (3) Client Server 위 예시에서 A 서비스가 client server가 됩니다. 이를 바탕으로 OAuth 2.0을 좀 더 자세히 설명하면, OAuth 2.0은 clien.. 포트폴리오 ▼포트폴리오는 아래 링크에서 확인하실 수 있습니다. 임유열-포트폴리오 [글로런] 배포 (3) - AWS EC2 배포하기 이제 마지막으로 AWS EC2에 서버를 올려서 배포하도록 하겠습니다. 서비스 링크 : 글로런 JAR를 서버에 올리는 수동 배포 방식을 이용했습니다. 1. EC2 인스턴스 생성 먼저 서버를 올릴 EC2 인스턴스를 생성합니다. AWS에서 EC2를 검색한 후, '인스턴스 시작' 버튼을 누릅니다. 그럼 인스턴스 생성을 위한 설정을 하는 페이지가 나오고, 옵션을 선택해주면 됩니다. 저는 다음과 같이 진행하였습니다. OS - Ubuntu 18.04LTS t2.micro (프리 티어) 키 페어 생성 (RSA, .ppk) 인스턴스에 연결하기 위한 access token과 비슷한 역할 SSH 연결 시 MobaXterm을 이용할 것이므로, .ppk 형식으로 생성 보안 그룹 - SSH, HTTPS, HTTP 위치 무관 트래.. [글로런] 배포(2) - 이미지 AWS S3 에 저장하기 DB를 로컬에서 AWS RDS로 전환한 것에 이어, 강의나 코스 커버에 첨부되는 이미지를 로컬이 아니라 AWS S3에서 관리하도록 전환하겠습니다. 1. S3 버킷 생성하기 AWS에서 S3를 검색하면 위와 같은 화면이 나오고, '버킷 만들기' 버튼을 클릭합니다. 버킷 생성 옵션을 입력해주고 생성하면 됩니다. 이름 등을 설정해주고, 기본 옵션에서 크게 변경할 것은 없습니다. 퍼블릭 액세스를 허용하면 개발할 때는 조금 편할 수 있지만, 실제로 모든 퍼블릭 액세스를 열어둘 경우는 없으므로, 이번 프로젝트에서도 이후에 '버킷 정책'을 통해 접근을 제어하는 것으로 하겠습니다. 2. IAM 사용자 생성하기 AWS에서 자격을 증명할 때는 AWS에서 생성한 계정을 직접 이용하기 보다는 IAM을 이용하는 것이 바람직하다고.. 이전 1 2 3 다음