DOM Element 제거하기

remove() 메서드를 통해 쉽게 제거가 가능하다. const element = document.getElementById("demo"); element.remove(); 참고 자료 https://www.w3schools.com/jsref/met_element_remove.asp

2024-09-15 · 1 min · 14 words

Dockerfile multi-stage

목표 Dockerfile에서 multi-stage 가 무엇인지 이해한다. multi-stage 란 단일 Dockerfile에서 여러 개의 이미지를 빌드 할 수 있는 기능이다. Dockerfile에서 여러 개의 FROM 절을 사용하면 multi-stage가 된다. FROM golang:1.21 WORKDIR /src COPY <<EOF ./main.go package main import "fmt" func main() { fmt.Println("hello, world") } EOF RUN go build -o /bin/hello ./main.go FROM scratch COPY --from=0 /bin/hello /bin/hello CMD ["/bin/hello"] multi-stage 장점 빌드시 필요한 환경과 실행시 필요한 환경이 다를 수 있다. 위의 예시에서도 go를 빌드 하기위해서 FROM golang:1....

2024-09-15 · 1 min · 97 words

Docker 이해하기

지금까지 도커를 사용하여 배포 환경을 구축해왔지만 사실 도커에대한 이해가 있는 것은 아니다. 최근에 도커를 건드릴 일이 많아졌기 때문에 이 기회에 도커에대해서 학습해보고자 한다. 컨테이너 도커를 사용하면서 가장 많이 언급되는 단어가 컨테이너다. 컨테이너는 하나의 운영 체제 커널에서 다른 프로세스에 영향을 받지않고 독립적으로 실행되는 프로세스의 상태를 말한다. 독립적인 환경을 가지기 때문에 각 컨테이너마다 프로세스 ID도 격리되어 관리된다. 이 컨테이너 덕분에 우리는 배포 환경에 의존적이지 않도록 구성할 수 있다는 장점이 있다. 예전부터 유닉스나 리눅스는 하나의 운영 체제 안에서 자원을 분리해 할당하고, 실행되는 프로세스를 격리하는 방법이 존재했다....

2024-09-15 · 7 min · 1379 words

DNS 지정하기

resolver nginx config 파일에서 resolver 디렉티브를 사용하면, 사용할 DNS 서버 주소를 지정할 수 있다. 아래 예시는 로컬에 있는 DNS 서버를 사용하겠다는 의미이다. port를 지정하지 않으면 기본적으로 53번 포트를 사용하고, 2개 이상 명시하면 라운드 로빈 방식으로 사용한다. resolver 127.0.0.1 참고 자료 http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver https://wooono.tistory.com/685

2024-09-15 · 1 min · 42 words

DispatcherServlet이 모든 경로의 요청을 처리하는가

결론은 아니다. web.xml 에 설정된 경로만 처리하기 한다. 하지만 일반적으로 / 로 설정하기 때문에 모든 경로를 처리하는 것이다.

2024-09-15 · 1 min · 18 words

DDD

배경 우리팀 코드가 DDD를 사용하고 있다고 설명을 들었다. DDD가 무엇인지 이해하고, 어떤 장단점이 있는지 알아본다. 용어 정리 도메인 소프트웨어로 해결하고자 하는 문제 영역 소프트웨어를 사용하는 사용자의 활동이나 관심사와 관련되어 있다. 모델 목적을 위해 현실 세계에 존재하는 것을 가공하고 편집하여 우리에게 정보를 제공한다. 특정 다이어그램이 아니라 다이어그램으로 전달하려는 아이디어와 목적을 가진 의사소통 수단이다. 이 의사소통 수단은 회의, 기획, 디자인, 개발등 여러 이해관계자가 사용한다. 도메인 모델은 특정 도메인을 개념적으로 표현한 것, 도메인 모델을 사용하려면 여러 관계자들이 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유하는 데 도움이 된다....

2024-09-15 · 3 min · 429 words

data class 프로퍼티로 Array가 있는 경우 equals를 오버라이드 하는 이유

상황 data 클래스에 Array 타입의 프로퍼티가 있을 경우에 IDE에서 equals()와 hashCode()를 오버라이드 하라는 알림이 나온다. 원인 data 클래스는 equals()를 자동 생성할 때, 각 프로퍼티의 equals() 메소드를 호출하여 동등성을 비교한다. 아래 사진은 위의 SomeClass를 자바로 디컴파일 한 코드다. Instrinsics.areEqual() 코드를 살펴보면 두 객체의 equals()를 호출하는 것을 확인할 수 있다. Array 타입은 equals() 메소드가 구현되어 있지 않으므로, 오버라이드 해줘야된다. 만약 List 를 사용할 수 있는 상황이라면 Array 대신 List로 대체하는 방법도 있다. 참고 자료 https://stackoverflow....

2024-09-15 · 1 min · 73 words

Custom Directives

목표 커스텀 디렉티브를 등록하는 방법을 알아본다. 방법 커스텀 디렉티브는 컴포넌트와 유사하게 라이프사이클 훅(hook)을 포함하는 객체로 정의된다. 아래는 autofocus를 디렉티브로 구현한 예시다. const focus = { mounted: (el) => el.focus() } export default { directives: { // enables v-focus in template focus } } 컴포넌트와 마찬가지로 템플릿에서 사용할 수 있도록 등록을 해야된다. 아래는 app 수준에서 커스텀 디렉티브를 등록하는 예시다. const app = createApp({}) // make v-focus usable in all components app.directive('focus', { /* ....

2024-09-15 · 2 min · 285 words

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