ContextConfiguration

목표 @ContextConfiguration의 용도를 이해한다. @ContextConfiguration의 용도 테스트에서 context initializer를 사용해서 ApplicationContext를 구성할 때 사용한다. context를 로드하기 위해 필요한 컴포넌트는 locations로 xml 설정 파일을 지정하거나, classes로 @Configuration 클래스를 지정할 수 있다. @ContextConfiguration("/test-config.xml") class XmlApplicationContextTests { // class body... } @ContextConfiguration(classes = [TestConfig::class]) class ConfigClassApplicationContextTests { // class body... } ApplicationContextInitializer의 구현체를 사용해 구성하고 싶다면, initializers 프로퍼티로 등록할 수 있다. ApplicationContextInitializer: Spring이 ApplicationContext를 초기화 전에 실행하는 콜백 인터페이스 @ContextConfiguration(initializers = [CustomContextInitializer::class]) class ContextInitializerTests { // class body....

2024-09-15 · 1 min · 108 words

ConditionalOnProperty

배경 @ConditionalOnProeprty라는 어노테이션을 코드에서 봤는데 동작 방식을 분명하게 이해하지 못 하고 있었다. 목적 configuration property의 값에따라 조건부로 빈을 생성할 때 사용할 수 있다. 클래스 위나 메서드 위에 붙일 수 있다. 각 필드 설명 prefix: 공통적으로 사용되는 property의 prefix name: property의 이름 value: name과 같다. havingValue: property의 값. 만약 명시하지 않거나 빈 값이면, property의 값이 false만 아니면 된다. matchIfMissing: property가 존재하지 않으면 match되는지 여부의 설정. 참고 자료 https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/condition/ConditionalOnProperty.html

2024-09-15 · 1 min · 67 words

CommandLineRunner

구동 시점으로 받은 커맨드 인자를 기반으로 코드를 실행시킬 수 있다. https://www.daleseo.com/spring-boot-runners/

2024-09-15 · 1 min · 11 words

collation

문자열을 비교할 때 어떤 규칙으로 비교하는지는 collation 설정에 따라 달렸다. mysql 기준으로 자주 사용하는 collation은 다음이 있다. utf8_general_ci utf8_unicode_ci utf8_bin 특수문자를 사용한다면 아래중 하나를 사용해야된다. utf8mb4_general_ci utf8mb4_unicode_ci ut8_bin의 경우는 A < B < a < b로 처리된다. utf8_general_ci는 정렬할 때는 A < a < B < b로 처리되고, ‘a’ = ‘A’는 참이 나온다. 참고 자료 https://sshkim.tistory.com/128 https://m.blog.naver.com/writer0713/221806591790

2024-09-15 · 1 min · 57 words

Cloudwatch 에러 로그 발생 시 알림 오게 구성 하기

슬랙이나 디스코드에 알림이 오게 구성하고 싶었지만, 이는 AWS Lambda가 필요하다. 하지만 우리에겐 이 권한이 없기 때문에 따로 사용할 수 없다. 따라서, 에러 로그 발생 시 이메일이 전송되도록 구현했다. 이를 구현하기 위해서는 Simple Notification Service가 필요하다. 1. Amazon SNS 주제 생성 이메일로 받을 것이기 때문에 표준으로 설정 알림 받을 이메일 구독 생성 2. Log Metric Filter 만들기 Log groups → 작업 → 지표 필터 생성 패턴 필터링: ERROR(에러 로그에 ERROR라는 단어가 포함되기 때문)...

2024-09-15 · 1 min · 124 words

Cloudfront의 압축 기능

Cloudfront에서 파일을 전송해줄 때 데이터의 용량을 줄이기위해서 파일을 압축해서 전송한다. 하지만 압축가능한 형식이 제한되어 있으므로 아래 문서를 확인해야된다. https://docs.aws.amazon.com/ko_kr/AmazonCloudFront/latest/DeveloperGuide/ServingCompressedFiles.html#compressed-content-cloudfront-file-types 이미지 전송 크기 문제 이미지 용량 때문에 로딩이 느려지는 문제를 해결 하기위해 방법을 좀 찾아봤다. 이미지를 요청할 때 이미지 크기도 같이 기입하여 적절하게 리사이징 하는 기법이 있는데 이 방법은 Lambda를 사용해야되어서 현재는 사용이 불가하다. 포기! https://stackoverflow.com/questions/42187592/best-way-to-save-images-on-amazon-s3-and-distribute-them-using-cloudfront https://aws.amazon.com/ko/blogs/networking-and-content-delivery/resizing-images-with-amazon-cloudfront-lambdaedge-aws-cdn-blog/

2024-09-15 · 1 min · 56 words

ClassLoader

Java에서 ClassLoader는 자바 클래스를 JVM으로 동적으로 로드하기 위한 객체다. ClassLoader 덕분에 파일 시스템과 파일의 구조에 대해서 알 필요가 수 있다. Java의 클래스들은 한 번에 전부 로드되는 것이 아니라 애플리케이션에서 필요할 때 로드한다. 이 때 ClassLoader가 호출되고 ClassLoader가 동적으로 메모리에 로드한다. ClassLoader의 종류 Bootstrap Class Loader 자바 클래스들은 java.lang.ClassLoader에 의해 로드된다. 하지만 이 ClassLoader도 결국엔 클래스다. 이 java.lang.ClassLoader를 로드하기 위한 것이 바로 Bootstrap Class Loader다. Bootstrap Class Loader는 다른 ClassLoader의 부모 역할을 한다....

2024-09-15 · 1 min · 128 words

Class A 로 타입 캐스팅 하기

Class<A> clazzA = ...; B instanceB = ...; clazzA.cast(instanceB); 참고 자료 https://www.tutorialspoint.com/java/lang/class_cast.htm

2024-09-15 · 1 min · 12 words

Class A 가 Class B 의 자식인지 확인하는 방법

Class<A> clazzA = ...; Class<B> clazzB = ...; clazzA.isAssignableFrom(clazzB); // true class B extends A { ... } 참고 자료 https://www.tutorialspoint.com/java/lang/class_isassignablefrom.htm

2024-09-15 · 1 min · 21 words

char[] 의 특정 구간을 String으로 만들기

String 생성자 중에 char 배열의 offset과 count를 지정할 수 있는 것이 있다. char[] a = {'a', 'b', 'c'}; String b = new String(a, 1, 2); // b == "bc" 참고 자료 https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

2024-09-15 · 1 min · 32 words

Char Array를 String으로 변환하기

String.valueOf() 를 사용가능 하다. final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; String string = String.valueOf(charArray);

2024-09-15 · 1 min · 22 words

build 후에 실행 시 no main manifest attribute 에러 해결

대부분 SpringBoot 플러그인을 추가해주지 않아서 발생하는 문제다. SpringBoot 플러그인에는 Spring Boot 애플리케이션을 jar 파일로 패키징을 도와주기 위한 플러그인이므로 필요하다. 참고 자료 https://dingue.tistory.com/17 https://kotlinworld.com/323 https://stackoverflow.com/questions/54121894/executing-springboot-application-as-jar-gives-no-main-manifest-attribute

2024-09-15 · 1 min · 24 words

BroadcastChannel

같은 origin의 서로 다른 window, tab, frame, iframe 간에 통신을 할 때 사용하는 Web API다. WebRTC로 두 탭 사이에 연견을 맺기 위해서 BroadcastChannel을 사용했다. 간단한 사용법만 정리해본다. 채널 생성 인자로 원하는 채널의 이름을 생성할 수 있다. 이미 생성된 채널이라면 구독을 하게 된다. const signaling = new BroadcastChannel('webrtc'); 이벤트 처리 아래와 같이 어떤 이벤트가 발생했을 때의 처리를 구현할 수 있다. signaling.onmessage = e=> { if(e.data.type === 'hello') { console.log('hello'); } } 이벤트 발생 이벤트를 발생시키는 방법은 아래와 같다....

2024-09-15 · 1 min · 89 words

BigInteger

목표 BigInteger가 무엇인지 이해한다. BigInteger의 사용 방법을 이해한다. BigInteger의 내부 구조를 이해한다. BigInteger Java에서 primitive type 정수 보다 큰 범위를 숫자를 저장하기 위해서 사용할 수 있는 클래스 immutable arbitrary-precision interger를 표현한다. arbitrary-precision: 값을 표현하기 위해 필요한만큼 공간을 사용한다는 의미 따라서, long 타입보다 큰 범위의 값을 나타낼 때 사용할 수 있다. 사용법 int, long 타입의 경우에서 변환은 valueOf() BigInteger a = BigInteger.valueOf(54); BigInteger b = BigInteger.valueOf(37); 큰 정수 등을 표현할 때는 string으로 생성자 주입 b = new BigInteger(“123456789123456789”); 일부 값들은 상수로 정의되어 있음 a = BigInteger....

2024-09-15 · 1 min · 179 words

BigDecimal valueOf(0) 대신 BigDecimal ZERO

valueOf 메소드는 캐싱되어 있는 범위인지 확인한 후 캐싱된 값을 반환하지만 ZERO 는 바로 캐싱된 값을 반환하기 때문이다.

2024-09-15 · 1 min · 17 words

BDD

목표 BDD가 무엇인지 이해한다. BDD의 장점을 이해한다. BDD의 활용 예(Mockito)를 알아본다. BDD란 정의 TDD 중 하나로, TDD를 진행할 때 테스트와 관련된 용어들을 비즈니스 용어로 사용하도록 하는 기법 만들어진 배경 BDD 개념을 처음 고안한 Daniel Terhorst-North의 블로그: https://dannorth.net/introducing-bdd/ 기존에 TDD를 진행할 때, 테스트 코드의 모든 영역에 test라는 단어가 들어갔다. class: CustomerLookUpTest method: testFindsCustomerById(), TestFailsForDuplicateCustomers() 테스트 코드를 문서처럼 사용하기 위해 test라는 단어를 제거하고, 비즈니스 도메인의 용어를 사용하는 문장을 작성하도록 변경했다. class: CustomerLookUp method: findsCustomerById(), failsForDuplicateCustomers() 이 기법을 사용하다보니 아래와 같은 관습을 갖기 시작했다....

2024-09-15 · 2 min · 344 words

batch update

목표 한꺼번에 다수의 row를 업데이트 해야될 때, 하나씩 update 쿼리를 보내면 부하가 많이 발생할 수 있다. mybatis에서 batch update 방법을 알아본다. 방법 SqlSessionFactory를 통해 SqlSession을 생성하고 flush와 commit을 한다. sqlSessionFactory.openSession(ExecutorType.BATCH).use { sqlSession -> val xxxMapper = sqlSession.getMapper(XXXMaper::class.java) xxxs.forEach { xxxMapper.update(it) } sqlSession.flushStatements() sqlSession.commit() } SqlSession 트랜잭션을 commit 또는 rollback하고, Mapper 인스턴스를 획득할 수 있다. auto-commit이 꺼져있다면, commit 메서드를 호출하기 전까지 데이터베이스에 커밋되지 않는다. commit 메서드를 호출하지 않고 SqlSession이 닫힌다면 롤백된다. sqlSessionFactory....

2024-09-15 · 1 min · 82 words

AWS 보안 그룹에 내 IP를 추가할 때, 유동 IP면 어떡하지

기본적으로 IP 임대주기는 10분이지만 디바이스를 끄지 않으면 임대하고 있는 IP 계속 유지한다. 따라서 공유기에 물려있으면 IP가 바뀌는 경우가 드물다. 참고 자료 https://studyforus.tistory.com/137

2024-09-15 · 1 min · 22 words

AUTO_INCREMENT 1로 초기화 하기

ALTER TABLE tablename AUTO_INCREMENT = 1 https://stackoverflow.com/questions/8923114/how-to-reset-auto-increment-in-mysql

2024-09-15 · 1 min · 7 words

AssertJ 정확히 두 리스트가 같은지 확인

assertThat(a).hasSize(b.size()).hasSameElementsAs(b); hasSameElementsAs 는 b가 가지고 있는 요소들을 a가 전부 가지고 있는지 확인한다. 하지만 a가 중복된 값을 가지고 있다면 b가 하나만 가지고 있어도 통과가 되기 때문에, hasSize()로 크기 체크도 해야된다. https://www.baeldung.com/java-assert-lists-equality-ignore-order

2024-09-15 · 1 min · 30 words