Java(15)
-
왜 Elasticsearch는 Java로 개발되었을까? Compass부터 Lucene까지
이 글은 팀원의 단순한 한마디 "왜 Elasticsearch 는 C 나 C++ 이 아니고 Java 로 개발했어요?성능을 고려한다면 Java 보단 다른게 좋지 않나?" 라는 의문에서 시작된 글입니다.Elasticsearch란?Elasticsearch is a search engine based on Apache Lucene. It provides a distributed, multitenant-capable full-text search engine with an HTTP web interface and schema-free JSON documents. 출처 : https://en.wikipedia.org/wiki/Elasticsearch#External_linksElasticsearch는 Apache L..
2024.11.10 -
Java 이해도 미쳤ㄴ,,,? 면접관님 이거 한번 보세요 (Java 계산기)
프로젝트의 시작 어느 날 익명의 기업으로부터 흥미로운 과제를 받았습니다. 과제의 내용은 다음과 같았습니다. 💡 회사는 스프린트 단위로 프로젝트를 진행합니다. 이번 스프린트에서는 사칙연산, 다음 스프린트에서는 삼각함수를 구현할 예정입니다. 추후에는 로그, 미적분이 예정되어 있습니다. 확장에 유리한 설계를 해주세요. v1. 설계의 시작과 문제점 인식 초기에 저는 사칙연산을 처리할 수 있는 간단하고 직관적인 설계를 구상했습니다. 이를 위해, 사용자의 입력을 분석하고 연산을 수행하는 Calculator 클래스와 연산을 추상화하는 Operation 인터페이스를 도입했습니다. 또한, 연산 종류에 따라 적절한 연산 객체를 생성하는 OperationFactory 클래스도 만들었습니다. 하지만 이 설계는 곧 두 가지 큰..
2024.03.01 -
정적 유틸리티 클래스 -> 인터페이스 기반 설계로: java에서 OCP 원칙을 적용
자바 개발자라면 누구나 효율적인 코드 구조와 객체지향적 설계의 중요성을 인식합니다. 특히, 게시물 추적 기능과 같이 데이터를 처리하고 분석해야 하는 경우, 코드의 재사용성과 확장성은 더욱 중요해집니다. 이 글에서는 DateBasedPostTracker 클래스를 예로 들어 정적 유틸리티 클래스와 인터페이스 기반 설계의 각각의 장단점을 탐구하고, 어떤 방법이 객체지향적인 설계 원칙, 특히 개방/폐쇄 원칙(OCP)을 더 잘 따르는지 논의해 보겠습니다. DateBasedPostTracker 클래스 소개 DateBasedPostTracker는 특정 날짜에 게시된 해축겔 게시판의 정보를 가져오는 기능을 제공하는 클래스입니다. 이 클래스는 세 가지 주요 기능을 포함합니다. 1. findFirstPage(String ..
2024.02.05 -
카타르 아시안컵 16강날 해축갤 트래픽 분석 : 인기 게시물의 파워
예전에 쿼리 튜닝을 한 상황의 가정은 다음과 같았습니다. 손흥민이 월드컵에서 골을 넣으면 해축갤에 미친 듯한 드립(게시물)이 올라오고 퍼갈 것이다. 이때 '%흥민%' 이라는 키워드로 검색이 많이 일어날 것이다. 그래서 게시물에 약 1억 건의 데이터를 넣고 느려진 게시물 조회 쿼리를 개선을 했었습니다. (4분20초 -> 0.0019초) 2024.01.29 - [Project 해축갤/데이터베이스] - 1억 데이터 쿼리 최적화: 풀텍스트 인덱스의 한계와 LIKE 절의 귀환 1억 데이터 쿼리 최적화: 풀텍스트 인덱스의 한계와 LIKE 절의 귀환 배경 최근 데이터를 200만 개에서 1억 개로 늘리고 난 뒤 기존 API의 성능이 얼마나 나오는지 궁금해 쿼리를 한번 테스트해 봤습니다. 정신 나갔다,,, 쿼리 응답시간..
2024.02.01 -
JaCoCo와 애노테이션: 자바 테스트 커버리지의 한계 이해하기
JaCoCo 란? JaCoCo는 Java 코드의 커버리지를 체크하는 라이브러리입니다. 여기서 코드의 커버리지란 내 테스트 코드가 내 코드의 몇 퍼센트를 보증하냐!라고 생각하시면 편합니다. 테스트코드를 돌리고 그 커버리지 결과를 눈으로 보기 좋도록 html이나 xml, csv 같은 리포트로 생성합니다. 그리고 테스트 결과가 내가 설정한 커버리지 기준을 만족하는지 확인하는 기능도 있습니다. 최근 이러한 JaCoCo를 활용해 코드의 품질을 높이려는 노력을 하던 와중에 특이한 점을 찾았습니다. 특이점 JaCoCo 를 통해 테스트의 커버리지를 측정하던 와중 테스트 코드를 작성했는데도 커버리지가 카운팅이 되지 않는 부분을 발견했습니다. 다음은 문제의 코드입니다. @Test @DisplayName("updatePo..
2024.01.08 -
EC2 메모리 문제 해결과 Elastic IP 적용: 인스턴스 유형 변경 후 IP 문제 극복기
상황 어제 EC2에 Spring Boot와 MySQL을 실행시키려 하니 다음과 같은 에러가 나왔습니다. 이유는 OOM(Out Of Memery) Killer 가 mysql.service를 죽였다는 것. 사실 이럴만도 한 게 기존에 쓰던 EC2의 스펙이 t4g.nano였습니다. 이 EC2 인스턴스의 스펙은 대략 다음과 같습니다 AWS Gravition Processor(CPU) 2 개와 메모리 500MB짜리입니다. 여기서 주요 문제는 메모리 용량입니다. 현재 지금 돌아가고 있는 EC2의 RSS(실제 사용하는 물리 메모리양)를 보면 mysql 은 396MB, Spring Boot는 222MB 인걸 확인할 수 있습니다. (상황 종료 후의 spring boot, mysql을 확인한 것입니다.) 심지어 mysql..
2023.12.20 -
Java @Scheduled: 매시 정각에 실행되는 Cron 표현식 테스트하기
배경 @Transactional @Scheduled(cron = "0 0 * * * *") public void updatePopularPosts() { // 새로운 상위 10개 게시물 추출 List top10Posts = postRepository.findTop10Posts(); // 기존의 data 삭제 popularPostRepository.deleteAllInBatch(); // 변환 후 새로운 data 삽입 List popularPosts = convertToPopularPost(top10Posts); popularPostRepository.saveAll(popularPosts); } 위 함수에 대한 테스트 코드를 작성해보려 하다 이런 글을 쓰게 되었습니다. 테스트의 목적은 매 정시에 함수가 실..
2023.12.20 -
HttpMediaTypeNotAcceptableException: Could not find acceptable representation
위와 같은 코드를 작성했고 이 Controller에서 DB 조회 후 MemberResponseDTO에 담아 보내게 되는 단순한 로직이다. 전에는 갑자기 잘 되던 api 가 ResponseDTO로 바꾸고 나서 잘 안 되길래 뭔가 싶더니 HttpMediaTypeNotAcceptableException라는 에러가 났다. 그래서 직접 에러를 검색해 보니, 클라이언트가 받을 수 있는 response를 만들 수 없다는 에러이다. 실제로 postman에서도 다음과 같은 에러가 나온다. 하지만 로그를 보면 즉, DB에 쿼리를 하는 과정까지는 문제가 아니었음을 알 수 있다. 그렇다면 쿼리를 하고 나서 클라이언트에게 올바를 형태를 주지 못한다는 것이고, 그래서 DTO를 봤더니 @Getter 가 없었다. 여러분은 꼭 @Ge..
2023.10.30 -
비밀번호의 암호화 위치, 엔티티 내부 vs 서비스 계층?
위와 같은 단순한 게시판 프로젝트를 진행 중에 있다. 회원 엔티티의 password 필드는 프론트엔드에게서 받은 비밀번호를 암호화하여 저장하는 필드이다. 회원가입을 할 때 보통은 이 암호화라는 작업을 MemberService 계층 안에서 작업한다. public class MemberService { private final MemberRepository memberRepository; private final PasswordEncoder passwordEncoder; //회원 등록 @Transactional public void registerMember(MemberRegiDTO memberRegiDTO) { String name = memberRegiDTO.getName(); String passwor..
2023.10.17 -
필드 Null 체크 없애기, Optional<String> vs String?
최근 게시판 프로젝트로 끝까지 한번 해보자 라는 프로젝트를 진행하고 있던 와중,참 거슬리는 코드가 눈에 들어왔다.저게 틀린 코드라고 생각하지는 않았기에 저렇게 적었다만은,뭐랄까 참 지저분해 보이는 코드라서 리팩토링 욕구(?)가 솟았다. 그래서 어떻게 할까 고민을 하던 와중 먼저저 코드의 의미, 기능을 생각해보니 다음과 같았다. MemberUpdateDTO 의 Null 이 아닌 필드들만 DB에 업데이트 하기! 즉 필드의 null 체크를 좀 더 야무지게 할 수 있는 방법을 찾으면 됐다.그러다 Java 8 부터 도입된 Optional 을 사용하면 훨씬 더 안전하고,Java 표준 스펙에 의거한 코드를 만들 수 있지 않을 까 생각했다. 그래서 MemberUpdateDTO 의 null 이 올수 있는 필드를 Opti..
2023.10.13