전체 글

Object에서 final이 아닌 메서드는 모두 재정의를 염두에 두고 설계된 것이라 재정의 시 지켜야 하는 일반 규약이 명확히 정의되어 있다. equals() 는 재정의가 쉬워보이지만 함정이 도사리고 있다.. 회피하는 길은 아예 재정의를 하지 않는 것이다. 그러면 오직 본인 자신과만 같게 된다. 왜냐하면 Object의 equals()는 주소값을 비교하기 때문이다.Object.classpublic boolean equals(Object obj) { return (this == obj);} 다음과 같은 상황 중 하나에 해당하면 재정의 안하는 것이 좋다.각 인스턴스가 본질적으로 고유함. -> ex)Thread처럼 값을 표현하는 것이 아닌 동작하는 개체를 표현하는 클래스. -> 동작하는 개체는 고유할 수 ..


InputStream, OutputStream, java.sql.Connection은 close()를 통해 직접 닫아줘야 한다. 왜?? 알다시피 java에는 gc가 존재한다. 힙영역에서 참조되지 않는 객체를 조사하고 제거하는 역할을 진행한다.그래서 따로 메모리 해제를 하지 않고 java를 사용해왔다.하지만 왜 위와 같은 클래스들은 따로 close()를 호출해줘야하는 것일까? 파일, 네트워크 연결, 데이터베이스 는 JVM 힙 영역에 올라가는 객체가 아니다. 운영체제의 리소스이다.먼저 운영체제의 Stream을 알아야 한다. 즉, 스트림은 프로그램(JVM)밖에 있는 외부 자원이다. JVM과 외부 통신을 통해 DB 연결, 네트워크 통신, 파일 디스크립터 등을 진행하는 것이다. 그래서 JVM 내부의 GC가 작동하..


참고 자료 : https://medium.com/@syedharismasood4/building-reliable-microservices-with-the-transactional-outbox-pattern-in-spring-boot-952d96f8b534https://medium.com/@egorponomarev/outbox-pattern-in-spring-boot-8e8cf116f044https://medium.com/@greg.shiny82/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%94%EB%84%90-%EC%95%84%EC%9B%83%EB%B0%95%EC%8A%A4-%ED%8C%A8%ED%84%B4%EC%9D%98-%EC%8B%A4%EC%A0%9C-%EA%B5%AC%ED%98%8..

8.0 버전에 들어오면서 기존 MyISAM 스토리지 엔진에서만 제공하던 전문 검색이나 위치 기반 검색 기능도 모두 InnoDB 스토리지 엔진에서 사용할 수 있게 개선되었다. 8.1 디스크 읽기 방식: 전기적 특성을 띤 CPU, 메모리는 매우 빠른 속도로 발전했지만 디스크 같은 기계식 장치의 성능은 상당히 제한적으로 발전했다. 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건임. 8.1.1 하드 디스크 드라이브(HDD)와 솔리드 스테이트 드라이브(SSD) : 기계식 HDD를 대체하기 위해 전자식 저장 매체인 SSD가 출시됨. SSD도 기존 HDD와 같은 인터페이스(SATA, SAS)를 지원하므로 내장 디스크나 DAS 또는 SAN에 그대로 사용할 수 있다.SATA, SAS, DAS, SAN?..


MySQL 서버는 사람의 머리 역할을 하는 MySQL 엔진과 손발 역할을 하는 스토리지 엔진으로 구분할 수 있다.4.1 MySQL 엔진 아키텍처4.1.1 MySQL의 전체 구조 : C API, JDBC, ODBC, .NET의 표준 드라이버를 제공하여 모든 언어로 MYSQL 서버에서 쿼리를 사용할 수 있게 지원한다.4.1.1.1 MySQL 엔진 : 클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 옵티마이저로 구성됨. 또한 MYSQL은 표준 SQL 문법(ANSI SQL)을 지원하기 때문에 표준 문법에 따라 작성된 쿼리는 타 DBMS와 호환되어 실행될 수 있다.ANSI SQL이란? American National Standards Institute가 각기 다른 DBM..


무중단 배포 도입 이유진행중인 프로젝트에서 Github Actions를 통해 CI/CD를 구축한 상태이다. main 브랜치에 merge될 때마다 자동 배포가 진행되는데, 이때 필연적으로 서버가 종료되고 다시 시작되는 시간(Downtime)이 발생했다. 최소 30초에서 길면 60초 정도가 걸렸는데, 지금은 개발기간이라 큰 문제는 없지만 이후 운영 상황에서의 이 Downtime은 사용자 경험 측면에서도 안좋고 서비스가 성장할 수록 손실이 커질 것이라 판단하여 무중단배포 도입을 결정하였다.Nginx를 선택한 이유무중단 배포를 구현하는 여러 가지 방식이 있다. Kubernetes, AWS ELB, Nginx 등K8s는 학습 비용이 높고, AWS ELB는 인스턴스를 생성, 관리(과금 위험)해야 했다. Nginx는..


무중단 배포 도입 과정과 배포 전략에 관한 내용은 Nginx , Docker, Github Actions로 무중단배포 진행 를 참고하면 된다. 1. 문제 원인 파악현재 사용중인 서버는 AWS EC2 t2.micro(프리티어)이고, 메모리는 1GB이다. 배포 전략으로 선택한 Green/Blue 는 green과 blue WAS가 동시에 실행되는 시간이 발생하며 이때 RAM 프리티어 한도인 1GB를 넘어가게 되고, 이로 인해 서버의 작동 불가로 이어졌다. 그 이유는1. 모든 메모리가 사용되면 시스템은 새로운 프로세스나 기존 프로세스를 위한 충분한 메모리를 확보할 수 없게 된다.2. 이로 인해 여러 프로세스가 제한된 메모리 자원을 놓고 경쟁하게 만들고,3. 이러한 리소스 경합은 CPU가 효율적으로 프로세스를 ..


먼저 테스트 데이터 총 500만개 (caregivers=간병인), 지역은 총 20개 지역으로 나눠서 동일한 비율로 (지역당 약 25만개씩) 더미데이터를 추가한 뒤 환자 -> 간병인 찾기 기능을 진행하였습니다. 찾기 기능을 원활하게 하려면 적절한 인덱스 설정 + 페이지네이션 구현이 필수입니다.현재 프로젝트는 무한스크롤 방식인 No-Offset 방식의 페이지네이션을 채택하였고, 동적 조건 검색을 원활히 하기 위한 Querydsl을 도입하였습니다. 하지만 구현하는 과정에서 예상치 못한 상황들을 만났고, 해결해 나간 과정을 기록하려 합니다. No-Offset 적용 방식은 여기 입니다. (정렬 복합키 해결) 먼저 프로젝트 구조에 대해 설명드릴 내용이 있습니다. 진행중인 프로젝트는 JPA InheritanceT..