![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/3Vwy5/btsFt3J3VsT/aqGiRyQDfdhS3o9agyKdP1/img.png)
공연 동행 구인 웹서비스를 구현하며 앞서, 깃헙 액션을 통해 CI/CD 및 서버를 구성해두었는데 구글 소셜 로그인 개발 중, 도메인이 필요한 상황이 발생했습니다😲구글 소셜 로그인을 redirect url 등록 시, 배포 서버에서 사용하려면 .shop 같은 도메인을 두어야 함→ https는 선택: 앱 게시 상태를 테스트 단계로 둘거면 없어도 되고, 프로덕션 단계로 둘거면 필요 이후 배포를 목적으로 하는 서비스이기에, 도메인 연결 후, https 설정까지 해보기로 하였습니다!(사실 평소에 ec2 ip 주소 보면서, 이름 지어주고 싶기도 했음..) 도메인 구매하기 🛍️가비아에서 도메인 가격 확인 후, shop이 500원으로 저렴하길래 구매했습니다!(1년에 500원 입니다~~)https://domain.ga..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/Z1qoZ/btsFvXCkTOV/61lFLuku8lAuP38BG49pD1/img.png)
공연 동행 구인 웹 서비스에서 동행 구인 게시글 목록 조회 API를 구현하며많은 양의 동행 구인글 반환이 필요하여서버 부하 방지를 위해 커서 기반 페이지네이션을 적용해보았습니다😀 오프셋 방식과 커서 방식 비교페이지네이션은 모든 데이터를 전달하는 것이 아닌, 특정 개수의 필요한 데이터만 전달하는 방법을 의미합니다.페이지네이션하면 대표적으로 두 가지 방법이 있습니다. 1. 오프셋 기반 페이지네이션오프셋을 사용하게 되면, 오프셋 앞 데이터를 읽고 그 이후의 n개의 데이터를 읽어서 반환하게 되므로, 성능 저하 문제가 발생합니다. 2. 커서 기반 페이지네이션커서 아이디를 기준으로 다음 n개의 데이터를 반환해주는 방식입니다. 간단히 말하면오프셋 기반 방식의 경우 90번째(오프셋) 데..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/du7OF1/btsE0jUc5uh/DxESKP8UcwyTxdKd9cg6cK/img.png)
공연 동행 구인 웹 서비스 프로젝트에 참여하며CI/CD를 직접 적용해보게 되어 그 과정을 기록해보고자 합니다👣 이전에는 깃에 코드를 올리고, aws ec2를 통해 pull 받아와 jar 파일을 실행하는 방식으로 배포해왔었습니다.매번 develop 브랜치가 업데이트 될 때마다 수동으로 빌드 후 jar 파일을 실행해야 하며 번거로웠기에깃에서 제공해주는 "GitHub Action"을 통해 자동화를 적용하여 개발에 좀 더 집중해보고자 합니다😀 CI/CD란? 지속적 통합 및 지속적 배포 CI Continuous Integration, 빌드와 테스트 자동화 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트 되어 공유 레포지토리에 통합하는 것을 의미합니다. CD Continuou..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/PAcn5/btsDHqtXTt6/q4kstDGplKkNQpeE93HTVK/img.png)
AOP란? Aspect Oriented Programming, 관점 지향 프로그래밍 횡단 관심사의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임 횡단 관심사란 어플리케이션의 여러 부분에 걸쳐있는 기능을 의미 ➡️로깅과 트랜잭션, 인증처리와 같은 시스템 공통 처리 영역을 말합니다. 👾 예를 들면 결제 시스템에서 결제 전과 후에 로깅이 이루어지는 경우, 로깅 작업은 결제 메서드에서 공통적으로 이용되는 부분이므로 횡단 관심사가 됩니다. 신용카드_결제(){ // 결제 시작 전 로그 // 로직 // 결제 종료 후 로그 } 포인트_결제(){ // 결제 시작 전 로그 // 로직 // 결제 종료 후 로그 } 쿠폰_결제(){ // 결제 시작 전 로그 // 로직 // 결제 종료 후 로그 } AOP..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cjheqM/btsD3jNZCfK/HekVydgDmdedMzDxkKkL20/img.png)
롯데시네마 클론 코딩 프로젝트에서 사용자의 티켓 정보를 가져오는 기능 개발 중테이블 간 연관된 정보들이 많아 총 8개의 테이블을 건드려야 하는 상황이 발생했습니다“과연 쿼리문을 8개 사용하는 것이 적합한가?”라는 의문을 가지게 되었습니다🫤 기능 개발 후, 리팩토링을 통해 성능을 향상시켜보았습니다🧙 Refactor1.fetch join을 통해 연관관계 엔티티 함께 조회하기 Refactor2.각 티켓에 대한 티켓 정보는 비동기적으로 가져오기(각 티켓은 서로에게 영향을 미치지 않는 독립적인 데이터이므로) Fetch Join X, 비동기 X - 75349ms(기존 구현)우선 기존에 구현된 코드는 아래와 같습니다!각각의 테이블들에 대해 데이터를 따로 가져오고 있는 것을 확인할 수 ..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cTQ00g/btsGY1j5McQ/6klpCNuukEoA1NMLLLf4TK/img.png)
프로젝트 하다가 만났던 LazyInitializationExceptionJPA 공부 후, 발생 원인과 해결법을 한번 정리해보고자 합니다😃 발생 원인서비스 단에 @Transactional을 붙여둔 상태에서 메서드가 종료되면 Hibernate의 Session도 함께 종료되어 영속성 컨텍스트에서 사라집니다.엔티티 객체의 속성 중, FetchType이 LAZY로 설정된 필드가 있었다면, 해당 트랜잭션 내에서, 프록시 객체로 채워진 상태일 것입니다. 이때, get을 통해 데이터를 가져오게 되면 쿼리를 통해 해당 객체를 실제 데이터로 채우게 됩니다.하지만 서비스 단에서 컨트롤러 단으로 코드 흐름이 넘어간 경우, 트랜잭션이 종료되어 영속성 컨텍스트에서 사라진 상태이므로 프록시 객체를 실제 객체로 채우지 못해 Laz..