개발 공부 기록하기 108

[AWS SQS 들이파기] SQS 만들어보기

1. AWS console에서 SQS를 검색해 들어갑니다. 2. 대기열 생성을 눌러줍니다. Amazon SQS > 대기열이라고 있는데, Queue를 대기열로 번역했네요. 뭔가 어색합니다 ㅋㅋㅋㅋ 3. 대기열 세부정보 설정 가장 먼저 나오는 것은 대기열 유형을 표준으로 고를지, FIFO로 고를지에 관한 것입니다. 둘의 가장 큰 차이점으로는 크게 4가지가 있습니다. 순서 : 표준 Queue는 순서를 가능한 보장하려 하나 항상 보장되는 것은 아니지만, FIFO Queue는 순서를 무조건 보장합니다. 특정 메시지 전송 횟수 : 표준 Queue는 메시지큐에 쌓여있는 메시지를 최소 1회 전송하지만, 가끔 한 개 이상의 메시지 사본이 배달될 수 있습니다. 때문에 메시지를 Application에서 idempotent을..

Unable to load AWS credentials from any provider in the chain 해결

spring-cloud-aws 를 사용할때 이런 에러가 날 수 있다. com.amazonaws.SdkClientException: Unable to load AWS credentials from any provider in the chain: [com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper@64c19877: Failed to connect to service endpoint: , com.amazonaws.auth.profile.ProfileCredentialsProvider@7f570ac4: profile file cannot be null 이 경우, credeitnals를 넣어주어야 하고 몇 가지 해결책이 있다. 1. Access Key 발급받아..

짧은 코멘트와 함께하는 이펙티브 자바) #7 다 쓴 객체 참조를 해제하라

짧은 코멘트 다 쓴 객체의 참조를 해제하지 않아 메모리 문제가 된적은 아직까지 경험해보지 못했다. 하지만 OOM이 발생한 적은 몇 번 존재했는데, OOM 발생시 heap dump를 뜨게 해둔 옵션이 OOM을 해결하는데 큰 도움을 주었다. JAVA 개발자라면 head dump 를 연습삼아 한 번 씩 떠보는 것도 좋아 보인다. 다 쓴 객체의 참조를 해제하라 다음 Stack 코드에서 이상한 부분을 발견할 수 있는가? public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[D..

짧은 코멘트와 함께하는 이펙티브 자바) #6 불필요한 객체 생성을 피하라

짧은 코멘트 스프링을 사용하는 개발자라면, 생성비용이 아주 비싼 객체를 캐싱하고 있는 컴포넌트를 빈으로 등록해 활용할 수 있다. JPA를 사용할때는 Auto boxing을 사용할 수 있다. (DB column에 들어가는 null을 표현하기 위해) 하지만 연산이 들어가기 전에 가능한 빨리 primitive type으로 바꿔주는 것이 좋다. Long과 long 연산 단위가 수만회를 넘어가면 차이가 꽤 큰 것을 확인할 수 있다. String과 StringBuilder 역시 불필요한 객체 생성을 하는 예시라 할 수 있다. 불필요한 객체 생성을 피해라 String s = new String("JAVA"); String s = "JAVA"; 첫 번째 코드보다 두 번째 코드가 좋다. 두 번째 코드는 새로운 인스턴스를..

짧은 코멘트와 함께하는 이펙티브 자바) #5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

짧은 코멘트 의존성 주입은 정말 중요한 개념으로, 스프링을 사용하는 개발자라면 누구나 의존성 주입을 활용하고 있다. 의존성을 주입을 적절하게 함으로써, 하위 구현체를 갈아 끼울 수가 있고 테스트도 아름답게 작성할 수가 있는데... 의존성은 나중에 찐하게 한 번 다뤄봐야 겠다 ㅎㅎ 자원을 직접 명시하지 말고 의존 객체 주입을 사용해라 사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글톤 방식이 적합하지 않다 예를 들어, 맞춤법 검사기가(SpellChecker) 안에 어휘사전(Lexicon)을 가지고 있다고 하자 정적 유틸리티 클래스로 구현 public class SpellChecker { private static final Lexicon dictionary = ...; privat..

Failed to connect to service endpoint (Warning) 해결

spring-cloud-aws를 이용한 프로젝트를 로컬에서 실행시킬때 Application 자체는 잘 뜨는데 이런 Warning이 날 때가 있다. com.amazonaws.SdkClientException: Failed to connect to service endpoint Caused by: java.net.SocketTimeoutException: connect timed out 이런 Warning이 나는 코드를 살펴보면, public final class AwsCloudEnvironmentCheckUtils { private static final String EC2_METADATA_ROOT = "/latest/meta-data"; private static Boolean isCloudEnviron..

There is no EC2 meta data available, because the application is not running in the EC2 environment 해결

build.gradle에 spring-cloud-aws-autoconfigure 을 설정하고 로컬에서 실행시키면 다음과 같은 에러가 나올 수 있다. (줄바꿈 추가) Caused by: java.lang.IllegalStateException: There is no EC2 meta data available, because the application is not running in the EC2 environment. Region detection is only possible if the application is running on a EC2 instance 에러를 해석해보면, application이 돌아가는 환경이 EC2가 아니라 meta data가 없다는 뜻이다. 오호.. region 정보를 추가..

짧은 코멘트와 함께하는 이펙티브 자바) #4 인스턴스화를 막으려거든 private 생성자를 사용하라

짧은 코멘트 유틸성 클래스에 private 생성자가 없으면 '엇 이 개발자분 Effective Java 안읽으셨나?' 라는 생각이 가장 먼저 든다 ㅋㅋㅋ 클래스 본문의 길이를 줄이고 싶어, lombok의 NoArgsConstructor(accessLevel = AccessLevel.PRIVATE)을 사용하는 것을 개인적으로 선호한다 ㅎㅎ 인스턴스화를 막고 싶을 때는 private 생성자를 사용하면 된다 단순히 정적 메소드와 정적 필드만을 담은 클래스를 만들고 싶다면, 그리 곱게 보이지는 않지만 아래의 경우에 쓸모가 있다 기본값이나 관련 메소드들을 모아 놓을 때 (ex. java.util.Arrays, java.lang.Math) 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메소드를 모아 놓을 때 f..

Failed to instantiate StackNameProvider 해결

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.aws.core.env.stack.config.StackNameProvider]: Factory method 'autoDetectingStackNameProvider' threw exception; nested exception is java.lang.IllegalArgumentException: No valid instance id defined Spring Cloud AWS 의 auto configure를 이용할때 위와 같은 에러가 날 수 있다. 이럴때는.. cloud: aws: stack: auto..

짧은 코멘트와 함께하는 이펙티브 자바) #3 private 생성자나 열거 타입으로 싱글턴임을 보증하라

짧은 코멘트 Spring Bean의 기본 scope이기도 한 싱글톤 알아두면 유용하다. Spring을 사용할 경우 객체를 직접 싱글톤으로 만들 일을 드물지만, 정말 간혹 쓰는 경우가 있다. 그럴때는 주로 2번의 방법을 사용했다. 싱글톤 보증 싱글톤 : 인스턴스를 오직 하나만 생성할 수 있는 클래스 (GOF) 함수와 같은 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트가 싱글톤의 예이다. 클래스를 싱글톤으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다 싱글톤을 만드는 방법과 장단점은 아래와 같다 방법 1 생성자는 private으로 감춰두고, 인스턴스를 만들 수 있는 유일한 수단으로 public static 멤버를 하나 만들어 둔다. public class Elvis { // fina..