자동 생성자

목표 @RequiredArgsConstructor가 동작하는 방식을 알아본다. @NoArgsConstructor, @RequireArgsConstructor, @AllArgsConstructor @NoArgsConstructor 파라미터가 없는 생성자를 만든다. final 필드가 있어서 불가능한 경우는 컴파일 오류가 발생한다. @NoArgsConstructor(force=true) 옵션을 줄 경우, 컴파일 오류가 발생하지 않고 모든 final 필드를 0, false, null로 초기화한다. @NonNull 이 붙어있는 어노테이션이 붙어있어도 검사하지 않으므로 유의해야된다. @RequiredArgsConstructor final 필드나 @NonNull 이 붙어있는 필드 중에 초기화 되지 않은 필드들을 파라미터로 가지는 생성자를 만든다. 이 경우에는 @NonNull 이 붙어있으면 널 검사를 하기 때문에, 생성자 파라미터에 null이 있으면 NullPointerException 이 발생한다....

2024-09-15 · 1 min · 127 words

입출력

Java에서 입출력시 InputStream과 OutputStream을 사용한다. 이 들은 각각 추상 클래스기 때문에 별도의 구현체를 사용한다. Byte Stream 데이터를 바이트 단위로 주고 받을 때 사용한다. InputStream BytesArrayInputStream: 바이트 배열을 읽기 위해서 내장된 버퍼를 사용한다. FileInputStream: 파일을 바이트 단위로 읽기위해서 사용한다. FilterInputStream: InputStream에 추가 기능을 사용하기 위해서 사용한다. 이는 다른 InputStream을 포함하고 있어야되면 단독으로 사용은 불가능하다. BufferedInputStream: 입력 성능을 개선하기 위해 사용한다. 특정 크기(기본값 8bytes)만큼의 버퍼를 할당한 후 데이터를 미리 읽고 저장한다. 이후 주가적인 읽기 작업이 필요하면 버퍼의 크기를 늘려 읽기를 실행시킨다....

2024-09-15 · 2 min · 321 words

인덱스 생성, 삭제, 조회 SQL 문

// 생성 ALTER TABLE 테이블명 ADD INDEX 인덱스명(컬럼명1, 컬럼명2, ...) // 삭제 ALTER TABLE 테이블명 DROP INDEX 인덱스명 // 조회 SHOW INDEX FROM 테이블명;

2024-09-15 · 1 min · 24 words

이터레이터, 제너레이터, yield

이터레이터(iterator) 이터레이터는 값을 차례대로 꺼낼 수 있는 객체다. 우리가 for 반복문을 사용할 때 요소를 하나씩 꺼내서 처리할 수 있게 되는데, 이터레이터를 사용했기 때문에 가능한 것이다. 어떤 클래스가 이터레이터이기 위해서는 다음 조건을 만족해야된다. __iter__ 메소드를 구현하되 자기 자신(self)을 반환한다. __next__ 메소드를 구현해서 next 내장 함수의 인자로 자신을 줬을 때 다음에 반환할 값을 정의해야된다. 더 이상 반환할 값이 없는 경우 __next__메소드는 StopIteration 예외를 일으키도록 한다. 이터러블(iterable) 말 그대로 ‘순회 가능한’이라는 뜻이다. for 문의 in 키워드 뒤에 올 수 있는 모든 값을 이터러블이다....

2024-09-15 · 2 min · 291 words

이진탐색 lower bound, upper bound

알고리즘 문제 풀이 중 이진탐색 lower bound, upper bound를 사용해야되는 경우가 발생했다. 이론은 알고 있지만 이를 코드로 구현하는 것에 어려움을 겪어 아직 이해가 부족하다고 생각해서 글로 정리하게 되었다. lower bound 정렬된 데이터에서 처음으로 해당 값 이상이 되는 인덱스를 찾는 것이다. def find_lower_bound(number): start = 0 end = n while start < end: mid = (start + end) // 2 if cards[mid] >= number: end = mid else: start = mid + 1 return start 여기서 기존 이진 탐색과 end의 의미가 다른 것을 알아야된다....

2024-09-15 · 2 min · 276 words

이미지 리사이징 및 압축

이미지 처리 방법 Java에서 이미지 처리하는 방법에는 여러 가지가 있다. AWT: Java 기본 라이브러리로 창 생성, 버튼 등의 GUI와 관련된 처리를 할 수 있도록 도와주는 라이브러리다. ImageJ: 이미지 작업을 위해 만들어진 라이브러리다. 만들어진 목적이 GUI가 아니라 처음부터 이미지 처리였기때문에 이미지 처리에대해 좋은 기능이 많이 있다. OpenIMAJ: 비디오, 오디오 처리나 머신 러닝 등의 작업을 할 수 있다. 이 라이브러리를 통해서도 이미지 처리를 할 수 있다. TwelveMonkeys ImageIO: Java 기본 라이브러리인 ImageIO를 확장한 형태다....

2024-09-15 · 3 min · 578 words

이미 등록된 빈에 추가 설정 하는 법

배경 테스트 환경에서 컨테이너에 등록된 빈을 대상으로 추가 설정하는 방법이 필요했다. @PostConstruct JSR-250 스펙으로 있는 애노테이션이다. ApplicationContext에 등록된 객체 중에 해당 애노테이션이 붙어있는 메소드가 있다면, 해당 빈이 생성되고 난 뒤에 메서드를 실행한다. 따라서, 아래와 같이 설정할 수 있다. @TestConfiguration class TestConfig { @Autowired private SomeBean someBean; @PostConstruct private void initSomeBean() { // someBean.setProperty("qwe"); } } 참고 자료 https://stackoverflow.com/questions/57920642/spring-java-config-configure-already-existing-bean https://docs.spring.io/spring-framework/docs/current/reference/html/core.html https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-postconstruct-and-predestroy-annotations

2024-09-15 · 1 min · 60 words

의존성 추가할 때 일부 의존을 제외하는 법

dependencies { implementation('commons-beanutils:commons-beanutils:1.9.4') { exclude group: 'commons-collections', module: 'commons-collections' } implementation 'com.opencsv:opencsv:4.6' // depends on 'commons-beanutils' without exclude and brings back 'commons-collections' } 참고 자료 https://docs.gradle.org/current/userguide/dependency_downgrade_and_exclude.html

2024-09-15 · 1 min · 26 words

응답 값에 특정 필드가 없는지 테스트

목표 응답 값에 특정 필드의 값이 null이 아니라, 완전히 존재하지 않는지 검증이 필요했다. 해결 아래와 같이 json 경로를 쓰고, doesNotHaveJsonPath() 메서드로 테스트할 수 있다. .andExpect(jsonPath("$.keyToNull").doesNotHaveJsonPath())) doesNotExist는 해당 경로의 값이 null인 경우에도 통과되어 버린다. 참고 자료 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/result/JsonPathResultMatchers.html

2024-09-15 · 1 min · 36 words

윈도우에서 작성한 Shell script를 실행하면

윈도우 환경에서는 파일 마지막 줄에 ^M 가 추가되어서 UNIX 환경과 달라 에러가 발생할 수 있다. 이를 해결하기 위해서는 vi로 열어서 :set fileformat=unix 위와 같이 입력하고 파일을 닫으면 된다. 참고 자료 https://stackoverflow.com/questions/2920416/configure-bin-shm-bad-interpreter

2024-09-15 · 1 min · 31 words

웹 소켓 통신 과정

소켓 연결을 유지하기 때문에 양방향 통신이 가능하다. 즉, 웹에서 사용하는 소켓이라 할 수 있다. 웹소켓과 HTTP 프로토콜 모두 OSI 모델에서 제7계층인 Application layer에 해당하며 제4계층인 TCP에 의존한다. TCP 소켓에서는 바이트 스트림을 사용하지만 웹 소켓에서는 UTF-8 포맷의 메시지 스트림만 허용한다. 웹소켓 통신 과정 WebSocket Handshake 클라이언트 핸드쉐이크 요청 GET /chat HTTP/1.1 Host: example.com:8000 Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 Upgrade: 웹소켓 프로토콜로 프로토콜을 변경한다는 요청 Sec-WebSocket-Key: 핸드쉐이크에 필요한 키 Connection: 프록시에 더 이상 전송하지 않는 헤더 필드를 지정하는 헤더다....

2024-09-15 · 1 min · 163 words

운영체제 (공룡책)

파일 시스템 인터페이스 파일 개념 파일: 컴퓨터를 편리하게 사용하기 위해 저장된 정보에 대한 논리적인 단위. 일반적으로 파일은 프로그램 또는 자료를 나타낸다. 자료는 숫자, 문자, 이진수 등으로 구성될 수 있고, 자유로운 형식이 될 수도 있고, 엄격한 형식을 갖출수도 있다. 프로그램은 소스 파일과 실행 파일을 나타낸다. 파일 속성 이름: 기호형 파일의 이름은 사람이 읽을 수 있는형태로 유지된 유일한 정보이다. 식별자(identifier): 이 고유의 꼬리표는 통상 하나의 숫자로 파일 시스템 내에서 파일을 확인한다. 식별자는 우리가 읽을 수 없는 파일의 이름이다....

2024-09-15 · 18 min · 3727 words

운영에서 Foreign Key를 사용하지 않는 이유

배경 ERD diagram을 최신화 하는 도중 실제 운영 DB에서는 FK가 따로 설정되어 있지 않아서 테이블 간의 관계를 파악하는 것에 어려움이 있었다. 일반적으로 한국 회사에서 이 방법을 많이 사용하는 것으로 보인다. 설명 성능에 영향을 미친다. FK의 정합성을 체크하는 과정에서 부하가 발생한다. 데이터를 처리하는 순서를 신경쓸 필요가 없다. 부모 테이블에 작업할 때 자식 테이블의 간섭을 피할 수 있다. 데이터베이스 대신 애플리케이션에서 체크를 한다. 이를 통해 유동적으로 검증 과정을 수정할 수 있다. 데이터베이스 샤딩을 할 때 FK가 방해된다....

2024-09-15 · 1 min · 86 words

우선순위 큐 사용법

queue 내장 모듈에 구현이 되어있다. from queue import PriorityQueue que = PriorityQueue() que.put(4) que.put(1) que.put(7) que.put(3) print(que.get()) # 1 print(que.get()) # 3 print(que.get()) # 4 print(que.get()) # 7 참고 자료 https://www.daleseo.com/python-priority-queue/

2024-09-15 · 1 min · 31 words

요청에 파일 포함 시키기

Spring에서 request body로 파일이 오면 어떻게 처리할 수 있는지 방법이 필요했다. HTTP에서는 한 개의 요청에 여러 개의 body를 담을 수 있는 multipart라는 content-type을 사용한다. 이전에 책으로 읽은 경험이 있는데 잊고 있었다…(링크) Spring에서 Multipart로 받은 파일은 다음과 같이 다룰 수 있다. // Controller @PostMapping("/") public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) { storageService.store(file); redirectAttributes.addFlashAttribute("message", "You successfully uploaded " + file.getOriginalFilename() + "!"); return "redirect:/"; } 참고 자료 https://spring.io/guides/gs/uploading-files/ https://www.baeldung.com/spring-file-upload

2024-09-15 · 1 min · 68 words

외부 접속 허가 설정

/etc/mysql/mysql.conf.d/mysqld.cnf 에서 bind-address를 0.0.0.0로 수정해야된다. localhost 뿐만 아니라 모든 ip의 접속을 다 허가한다는 의미다. 참고 자료 https://github.com/Hyeon9mak/WIL/blob/main/reverse-proxy-was-mysql.md

2024-09-15 · 1 min · 17 words

예외가 발생하지 않는지 테스트

방법 // obviously fails: assertThatCode(() -> { throw new Exception("boom!"); }).doesNotThrowAnyException(); 참고 자료 Assert that Runnable does not throw exception. · Issue #943 · assertj/assertj · GitHub

2024-09-15 · 1 min · 27 words

예외 발생 여부 테스트

목표 어떤 메서드를 호출했을 때 특정 예외가 발생하는지 테스트하는 코드를 작성한다. 어떤 메서드를 호출했을 때 아무 예외가 발생하지 않는지 테스트하는 코드를 작성한다. assertThrows assertThrows<SomeException> { service.insert(something) } Executable(함수형 인터페이스) 타입을 파라미터로 넘기면 이를 실행했을 때 SomeException이 발생하는지 검증한다. assertDoesNotThrow assertDoesNotThrow { service.insert(something) } Executable(함수형 인터페이스) 타입을 파라미터로 넘기면 이를 실행했을 때 아무 예외가 발생하지 않는지 검증한다. 참고 자료 https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html#assertDoesNotThrow(org.junit.jupiter.api.function.Executable) https://stackoverflow.com/questions/17731234/how-to-test-that-no-exception-is-thrown

2024-09-15 · 1 min · 60 words

영속성 관리

https://junroot.github.io/programming/JPA-시작하기/ 에서 어느 정도 영속성 컨텍스트와 엔티티의 생명주기를 간단하게 알아봤다. 이 영속성 컨텍스트의 특징을 좀 더 자세히 알아보도록 하자. 플러시 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 이 때 영속성 컨텍스트에 보관된 엔티티를 지우는 것은 아니다. 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화 하는 것이다. 플러시 과정 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교하여 수정된 엔티티를 찾는다. 수정된 엔티티는 수정 쿼리를 만들어서 쓰기 지연 SQL 저장소에 등록한다. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다....

2024-09-15 · 2 min · 265 words

여러 개의 숫자 중 최대 값 찾기

Math.max(12.123, 12.456) 참고 자료 https://www.tutorialspoint.com/java/number_max.htm

2024-09-15 · 1 min · 5 words