CsvSource에서 빈 문자열 표현하기

문제 상황 아래와 같은 상황에서 param1에 빈 문자열을 넣고 싶은데, null이 인자로 넘겨져서 에러가 발생했다. @CsvSource(value = [",5"]) @ParameterizedTest fun someTest(param1: String, param2: Int) { // ... } 해결 방법 아래와 같이 작은 따옴표를 이용해서 빈 문자열을 표현할 수 있다. @CsvSource(value = ["'',5"]) @ParameterizedTest fun someTest(param1: String, param2: Int) { // ... } 참고 자료 https://github.com/junit-team/junit5/issues/1014

2024-09-15 · 1 min · 56 words

CSRF

목표 CSRF가 무엇인지 이해한다. CSRF의 대응 방법을 이해한다. CSRF란? 피해자가 의도하지 않은 기능을 수행하기 위해 악의적인 요청을 보내도록 하는 공격이다. 요청에 세션 쿠키를 포함한 모든 쿠키가 자동으로 포함되기 때문에, 서버에서는 정상적인 요청과 CSRF 공격을 구분할 수 없다. 공격 예시 일반적으로 사회공학 기법을 사용해서 요청을 보내도록 한다. 악성 페이지, 이메일 등의 html에 <img> 태그를 통해 보이지 않는 요청을 보내도록 하기 악성 페이지에 스크립트 심기 공격시에는 요청을 보낸 사이트에 인증되어 세션이 유지되고 있어야된다....

2024-09-15 · 3 min · 484 words

cron

cron 목적 미리 정해진 시간에 예약된 작업 실행을 자동화하는 도구. 백그라운드 프로세스로 실행되며 사용자의 개입 없이 특정 이벤트나 조건이 트리거될 떄 미리 정의된 시간에 지정된 작업을 수행하는 데몬 프로세스다. cron [-f] [-l] [-L loglevel] crontab cron이 실행할 작업을 나열한 파일 실행할 작업을 추가, 제거, 수정이 가능하다. crontab의 커맨드는 공백단위로 분리되며, 순서대로 나음을 의미한다. Minute (holds a value between 0-59) Hour (holds value between 0-23) Day of Month (holds value between 1-31) Month of the year (holds a value between 1-12 or Jan-Dec, the first three letters of the month’s name shall be used) Day of the week (holds a value between 0-6 or Sun-Sat, here also first three letters of the day shall be used) Command 예시 30 08 10 06 * /home/maverick/full-backup anacron 일, 주, 월 빈도로 작업을 실행할 수 있는 명령어 cron 보다 좋은 점: cron은 예약된 시간에 컴퓨터가 꺼져있으면 실행하지 않지만, anacron은 마지막 작업 시각을 확인해서 마지막 실행 시각을 비교해서 시간이 지났으면 실행한다....

2024-09-15 · 1 min · 172 words

CountDownLatch

목표 CountDownLatch가 무엇인지 이해한다. CountDonwLatch 다른 스레드가 주어진 작업을 완료할 때까지 현재 스레드를 블락하기 위해서 사용할 수 있다. counter 필드를 가지고 있고, 상황에 따라 이를 감소시킬 수 있다. counter 필드가 0이 될 때까지, 호출한 스레드에서는 블락된다. 예제 코드 테스트 코드에서는 assertThat을 호출하기 전에 5개의 Worker 가 모두 동작이 끝나기를 기다려야된다. 테스트 코드에서 CountDownLatch(5)로 선언하고, 각 Worker에서 1씩 감소시키는 방식으로 대기를 시킨다. public class Worker implements Runnable { private List<String> outputScraper; private CountDownLatch countDownLatch; public Worker(List<String> outputScraper, CountDownLatch countDownLatch) { this....

2024-09-15 · 1 min · 194 words

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