백엔드/Spring

[Spring] 이미지를 파일로 저장하지 않고 업로드 하기

목적 이미지 업로드 시 이미지를 디스크에 저장하지 않기 위함 목차 서론 구현 방법 이미지 다운로드 이미지 업로드 1. 서론 회사에서 외부 상품을 크롤링하여 내부 상품으로 변환하는 프로세스를 개발중이었다. 배치 어플리케이션을 통해 외부 상품의 이미지를 회사 이미지 서버에 올리고, 회사 이미지 서버의 url을 DB에 저장해야 했다. 배치 어플리케이션이기 때문에 메모리 관리가 크게 중요하지 않았고, (쿠버네티스의 새로운 Pod에 어플리케이션이 뜨고 죽기 때문, 새로운 배치 어플리케이션은 새로운 Pod에서 시작) 굳이 디스크에 저장하고 싶지 않았다.(그냥 메모리에서 처리하고 싶었다.) 2. 구현 방법 이미지 url에 접근하여 이미지의 정보를 ByteArray형태로 가져온다. ByteArray타입의 데이터를 By..

2023.03.20 게시됨

[Spring] bootBuildImage와 "No compatible attachment provider is available" 포스팅 썸네일 이미지

백엔드/Spring

[Spring] bootBuildImage와 "No compatible attachment provider is available"

목적 bootBuildImage로 만든 스프링부트 이미지 실행 시 No compatible attachment provider is available 에러가 발생하는 것을 해결하기 위함 목차 bootBuildImage로 이미지 빌드 에러 해결하기 1. bootBuildImage로 이미지 빌드 bootBuildImage를 사용하여 빌드한 이미지를 쿠버네티스에서 Pod의 형태로 만들어 실행하였다. 하지만 No compatible attachment provider is available 라는 에러와 함께 Pod가 실행되지 않았다. 상태가 CrashLoopBackOff로 초기화 컨테이너가 반복적으로 실행에 실패하였다. 2. 에러 해결하기 https://github.com/alibaba/arthas/issues..

2021.12.01 게시됨

[Gradle] bootBuildImage를 사용한 스프링부트 컨테이너 이미지 빌드 포스팅 썸네일 이미지

백엔드/Gradle

[Gradle] bootBuildImage를 사용한 스프링부트 컨테이너 이미지 빌드

목적 멀티 프로젝트 환경에서 간단하게 docker 이미지를 만들고 docker hub에 푸시하기 위함 목차 Dockerfile을 이용하는 방법 bootBuildImage를 사용하는 방법 사용 예시 1. Dockerfile을 이용하는 방법 기존에 컨테이너 이미지를 만들기 위해선 Dockerfile을 생성하고 필요한 속성들을 정의해야 했다. FROM openjdk:11 EXPOSE 8080 ADD ./build/libs/*.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"] 도커 이미지는 여러 레이어를 갖고 있어서 변경되지 않는 부분은 그대로 사용하고 변경되는 부분만 바꾸어 효율적인 사용이 가능했다. 하지만 별다른 설정 없이 Dockfile을 사용하는 방법은 이미지를 단..

2021.11.24 게시됨

백엔드/Spring

[Spring] JWT 로그인 구현하기 2

목적 기존에 구현한 JWT로그인을 보완하고자 함 목차 기존의 흐름 새로 구현한 JWT로그인의 흐름 코드 설명 기존의 흐름 https://emgc.tistory.com/133 기존에 작성한 JWT로그인이며 흐름은 아래와 같다. 필터 로그인 시 쿠키에 있는 토큰을 확인하고 유효한 토큰이라면 인증객체를 생성하고 요청을 넘긴다 컨트롤러 인증객체의 확인 없이 클라이언트가 입력한 아이디와 비밀번호를 통해 사용자를 인증하고 인증된 사용자의 정보로 토큰을 발급한다. 하지만 아래와 같은 문제점이 있어서 새로운 JWT로그인이 필요했다. 토큰을 갖고 있어도 매번 아이디 비밀번호를 입력해야 로그인 가능 토큰 자체의 만료시간이 짧기 때문에 만료될때마다 아이디 비밀번호를 입력 새로 구현한 JWT로그인의 흐름 토큰을 access ..

2021.10.25 게시됨

[JPA] @DataJpaTest 사용할 DB 변경 포스팅 썸네일 이미지

백엔드/JPA

[JPA] @DataJpaTest 사용할 DB 변경

목적 @DataJpaTest에 대해 알아보고 DB설정을 변경하고자 함 목차 @DataJpaTest란? 테스트 DB 변경하기 1. @DataJpaTest란? 주석 내용을 보면 아래와 같이 나와있다. Annotation for a JPA test that focuses only on JPA components. 오직 JPA 구성 요소에만 초점을 맞춘 JPA 테스트를 위한 애노테이션이다. JPA의존성을 추가하여 사용할 수 있는 모든 JPA 구성요소들을 테스트할 수 있다. Using this annotation will disable full auto-configuration and instead apply only configuration relevant to JPA tests. 다른 설정은 비활성화 시키고,..

2021.09.16 게시됨

[Spring] 생성자 주입을 사용해야 하는 이유 포스팅 썸네일 이미지

백엔드/Spring

[Spring] 생성자 주입을 사용해야 하는 이유

목적 생성자 주입을 사용하는 이유에 대해 알고자 함 목차 생성자 주입이란? 생성자 주입의 장점 a. NPE 방지 b. Immutable 객체 생성 c. 순환참조 방지 1. 생성자 주입이란? 주입이란 A객체가 B객체를 사용하는 코드가 있을때, B객체를 생성하여 A객체가 사용할 수 있도록 관계를 형성해 주는 것이다. 생성자 주입은 생성자를 사용하여 객체를 생성할때, 생성되는 객체가 사용하는 의존성을 생성자의 파라미터로 전달해주는 방식이다. 2. 생성자 주입의 장점 a. NPE 방지 필드주입과 setter주입이 제대로 되지 않았다는 가정하에 autowired를 제거하였다. 테스트 시 필드주입과 setter주입의 경우엔 의존성이 제대로 주입되지 않았음에도 객체를 생성할 수 있었다. 따라서 의존성이 제대로 주입되..

2021.08.27 게시됨

백엔드/Java

[Java] Generics

목적 제네릭에서 Object와 ?의 차이에 대해 알고자 함 목차 Generics란? List와 Array의 차이 와 의 차이 파라미터로받는 와 의 차이 1. Generics란? List list = new ArrayList(); Map map = new HashMap(); 꺽쇠 안에 사용되어 해당 클래스에 사용되는 타입을 지정해주는 것 List와 같이 사용하게 된다면 해당 List는 Integer타입만을 저장하고 사용할 수 있고, Map와 같이 사용하게 된다면 해당 map은 key와 value가 String타입만을 저장하고 사용할 수 있게 된다. 2. List와 Array의 차이 제네릭을 사용하는데 있어서 List와 Array의 차이는 상위클래스와 하위클래스의 관계가 성립하는가 이다. Object obj..

2021.07.30 게시됨

[Spring] GeoIp2를 사용한 해외 아이피 차단 포스팅 썸네일 이미지

백엔드/Spring

[Spring] GeoIp2를 사용한 해외 아이피 차단

목적 해외에서 들어오는 해킹시도를 막기 위함 목차 해킹시도 해외 IP 차단하기 1. 해킹시도 최근에 제작한 서비스를 AWS EC2에 배포하여 운영중에 다음과 같은 예외를 보게 되었다. 처음보는 IP에서 수상한 url 경로로 접속한 것이었다. 찾아보니 /index.php s=/index/ think app/invokefunction&function ... 러시아의 모스크바에서 php서버 취약점에 대한 공격시도였다. 다행히 내 서비스는 스프링부트여서 예외를 뱉어냈다. 하지만 그럼에도 내 서비스에는 해외에서 접근할 일이 없기에 해외 IP의 접근을 모두 막고 싶었다. 또한 스프링부트에서 해외 IP차단에 관련한 글은 찾기가 힘들어 이에 대한 가이드 라인을 제공하고자 글을 작성하게 되었다. 2. 해외 IP 차단하기..

2021.07.28 게시됨