springboot

    [SpringBoot(Java), AWS] 이미지 로딩 속도 개선 (CloudFront, S3)

    포토 캘린더 서비스 (Cookiee-) 를 진행하며 이미지 로딩 속도 개선을 한 경험을 적어보려 합니다. 문제 상황 진행 중인 프로젝트에서 이미지를 로딩하는 모든 API 호출에 있어서 이미지 로딩이 너무.. 느린 것이 문제 상황이었다. WiFi가 불안정한 곳에서 사용자에게 서비스를 설명할 때에는 체감 5초까지 걸릴 정도로 이미지 로딩이 오래 걸리었다. 하지만 우리 서비스는 이미지 관련 서비스이기 때문에 꼭 이 부분을 고쳐야 했다. 본래 서비스는 S3만을 이용하여 이미지 작업을 처리하였다. SpringBoot에서 이미지를 S3 버킷에 저장하고 S3 버킷 내 객체 URL을 DB에 저장하였다. 프론트에서 이미지 로딩 API를 호출할 때에도 S3 버킷 내 객체 주소를 통해 화면에 띄웠다. 해결 아이디어 이를 해..

    [자바 ORM 표준 JPA 프로그래밍] 섹션3. 영속성 관리 - 내부 동작 방식

    영속성 컨텍스트 영속성 컨텍스트의 의미 영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 의미를 가진다. 이는 DB에 저장한다는 의미보다는 영속성 컨텍스트를 통해 엔티티를 영속화 한다는 의미를 가진다. 따라서 엔티티를 영속성 컨텍스트에 저장한다는 뜻이다. 이후 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있다. 엔티티매니저와 영속성 컨텍스트는 N:1의 관계를 가진다. 엔티티의 생명주기 1. 비영속 (new, transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); 2. 영속 (managed) : 영속성 컨텍스트에 관리되는 상태 엔티티 매니..

    [오류 해결] 서버 404 Not found 해결

    상황 SpringBoot 개발 도중 local에서 프로젝트 Run 하면서 Postman으로 API 테스트 하는 것은 아주 잘 되는데 서버에 jar 파일 배포 후 API URI로 API 호출을 하면 404 Not found가 뜨는 상황이 발생하였다. 우선 가장 먼저 살펴보아야 할 것은 URI에 오타가 없는지 이다. 필자는 죽어도 오타는 없어서 여러 방법을 동원해 해결하였다. 이번 오류에서 가장 이상했던 점은.. 특정 API는 되고 특정 API는 Not found가 뜨는 점이었다.. jar 파일이나 DB 문제가 아니라 판단하였기에 더욱 이상했다. 🥺 해결 방법 1. 우선 로컬 환경에서 빌드한 jar 파일을 서버로 전송하는 과정에서 "덮어쓰기"를 사용하고 있었는데, 이부분을 바꾸었다. 서버의 jar 파일을 삭..

    [GCP] GCP Compute Engine Key 생성, FileZila로 파일 전송 (PuttyGen, Filezila)

    GCP Compute Engie에서 SSH Key 생성하기 1. 본인의 VM 인스턴스에서 SSH 연결을 하여 서버로 접속한다. 필자는 가장 쉬운 방법으로 "브라우저 창에서 열기"를 선택하였다. 2. RSA Key Pair를 생성한다. dudrhy12@beyondvision-instance:~$ ssh-keygen -t rsa -f ~/.ssh/{키파일 이름} -C "{유저 구글 아이디}" 3. Key 값을 확인한다. cat ~/.ssh/beyondVision-RSAkey.pub 4. Key 값을 등록한다. 메뉴 > 설정 > 메타데이터 > SSH키 에 접속하여 방금 확인한 Key 값을 추가한다. 이후 이 값으로는 Putty에서 SSH 연결을 하거나 Mac에서 SSH 연결을 할 때 사용할 수 있다. Key ..

    [오류 해결] SLF4J: Class path contains multiple SLF4J bindings. 해결

    상황 SpringBoot 프로젝트를 Run 하던 도중 아래와 같은 오류가 발생했다. SLF4J: Class path contains multiple SLF4J bindings. 구글링을 해보니 SLF4J의 라이브러리가 중복되어 발생하는 문제였다. 해결 gradle이나 maven에서 중복 의존성을 제거하는 방법도 있지만 나는 중복해서 들어간 것은 없었다. 그래서 직접 프로젝트의 라이브러리 목록에서 확인하였다. (External Libraries에서 확인 가능) 많은 목록들 중 SLF4J 관련 라이브러리들이 보였고 이중 simple 이라는 이름이 포함된 jar 파일을 삭제하였다. rm C:\Users\CYS\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-simpl..

    [스프링부트와 JPA 활용 2] Section2. API 개발 고급 - 준비

    API 개발 고급 소개 조회용 샘플 데이터 입력 지연 로딩과 조회 성능 최적화 컬렉션 조회 최적화 페이징과 한계 돌파 OSIV와 성능 최적화 조회용 샘플 데이터 입력 userA JPA1 BOOK JPA2 BOOK userB SPRING1 BOOK SPRING2 BOOK 두 건의 주문이 접수된 것이다. jpashop/src/main/java/jpabook/jpashop/InitDb.java 추가 package jpabook.jpashop; import jakarta.annotation.PostConstruct; import jakarta.persistence.EntityManager; import jpabook.jpashop.domain.*; import jpabook.jpashop.domain.item...

    [스프링부트와 JPA 활용 2] Section1. API 개발 기본

    회원 등록 API 단순히 SQL로 API를 끌어오지 않아도 된다. JPA는 Entity가 있기 때문에 API를 설계할 때 주의해야 한다. API를 test 하기 위해 Postman을 설치한다. Download Postman | Get Started for Free Download Postman | Get Started for Free Try Postman for free! Join 25 million developers who rely on Postman, the collaboration platform for API development. Create better APIs—faster. www.postman.com 템플릿 엔진을 사용하여 렌더링 하는 Controller와 API 스타일의 Controll..

    [스프링부트와 JPA 활용 1] Section7. 웹 계층 개발

    홈 화면과 레이아웃 jpashop/src/main/java/jpabook/jpashop/controller/HomeController.java 생성 package jpabook.jpashop.controller; import lombok.extern.slf4j.Slf4j; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @Slf4j public class HomeController { @RequestMapping("/") public String home(){ log.info..

    [스프링부트와 JPA 활용 1] Section6. 주문 도메인 개발

    주문, 주문상품 엔티티 개발 구현 기능 상품 주문 주문 내역 조회 주문 취소 순서 주문 엔티티, 주문 상품 엔티티 개발 주문 리포지토리 개발 주문 서비스 개발 주문 검색 기능 개발 주문 기능 테스트 Order.java 수정 package jpabook.jpashop.domain; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Entity @Table(name="orders") @Getter @Setter public class Order { @Id @GeneratedVal..

    [스프링부트와 JPA 활용 1] Section5 중 "상품 기능 테스트"

    김영한 강사님의 "스프링부트와 JPA 활용1"을 듣다 보면 Section 5에서 "상품 기능 테스트"를 생략하신 것을 볼 수 있다. 이 테스트가 이전에 강의에서 다룬 테스트와 유사하여 생략하였다고 하셨는데 복습겸 궁금하여 테스트 코드를 직접 작성하여 보였다. MemberServiceTest.java를 참고하여 작성하였고 //given, //when, //then 으로 나누어 작성하니 도움이 많이 되었다. 테스트한 기능은 상품 등록, 상품 목록 조회, 상품 조회이다. 파일 위치는 jpashop/src/test/java/jpabook/jpashop/service/ItemServiceTest.java 으로 지정하였다. package jpabook.jpashop.service; import jpabook.jpa..