목록[백엔드] (128)
개발자로 후회없는 삶 살기

서론※ 아래 내용을 다룹니다.Hash 알고리즘Set 자료구조 내부 원리hashCode와 Equals를 재정의 해야 하는 이유 본론- List vs Set 특징 비교1. List1) 인덱스가 있다.2) 중복을 허용한다.3) 순서가 있다. 2. Set1) 인덱스가 없어서 순서가 없다.2) 중복을 허용하지 않고 유일한 요소만 저장할 수 있다.3) 요소를 포함하고 있는지 중복을 체크하는 속도가 매우 빠르다.자바의 Set은 위와 같은 특징을 가지고 있어서, 중복 제거 할 때 용이하게 사용되고, 순서가 필요한 경우엔 사용할 수 없다. 3번 특징처럼 체크 속도가 왜 이렇게 빠른지 구현하면서 알아보자. - Set의 문제점public class MyHashSetV0 { private int[] elementData..

서론※ 아래 내용을 다룹니다.배열리스트ArrayList각각의 성능 비교 본론- ArrayList와 배열의 차이점배열의 단점 : 동적으로 배열의 크기를 조절할 수 없고, 너무 크게 잡으면 메모리가 낭비된다.이러한 단점을 극복하는 ArrayList는 배열의 문제점을 해결하고 간편하게 사용할 수 있도록 도와주는 자료구조이다. 직접 간단하게 구현해보면서 실제 ArrayList 클래스 내부 구조를 파악해보자 ArrayList 내부 구현 코드를 보면 Object 배열을 사용하고 기본 크기는 10이다. 🚨 범위를 초과하면 어떻게 될까?배열을 사용하기 때문에 범위를 초과하면 당연히 OOB 에러가 난다. - 동적 배열우리가 원하는 리스트는 동적으로 저장할 수 있도록 크기가 커지는 것이다. 따라서 ArrayList 내부..

서론※ 아래 내용을 다룹니다.제네릭 타입제네릭 메서드와일드 카드타입이레이저각각의 사용 목적 본론- 제네릭이 필요한 이유public class IntegerBox { private Integer value; public Integer get() { return value; } public void set(Integer value) { this.value = value; }}IntegerBox는 정수를 저장하는 박스이고, StringBox는 문자열을 저장하는 박스이다. 🚨 요구사항이 늘어난다면?Boolean, Double 등 요구사항에 있는 타입의 Box를 전부 새로 만들어야 한다.코드가 다 똑같이 생겼는데 데이터 타입만 달라 코드 중복이 발생한다. ->..

서론※ 아래 내용을 다룹니다.스프링 Rest Docs 셋팅ClassNotFound 예외 해결 본론- Rest Docs 사용 목적API 명세 작성 > 스펙 작성 > 문서 작성프론트엔드 개발자와 프로젝트를 진행할 때, API 명세를 작성하고 문서화하여 공유하는 것이 일반적이다. 이때 Rest Docs을 사용하면 개발이 완료되기 전에, 간단한 컨트롤러 테스트 코드로 API를 문서화할 수 있다. 또한 테스트가 성공해야만 문서가 만들어지므로, 테스트 코드 작성을 의무적으로 수행하기 위한 팀 규율로 사용할 수도 있다. ✅ 도메인 > 서비스 > 컨트롤러 순으로 개발을 하면 문서화 시점이 늦지 않을까?실무에서는 API 명세에 맞게 컨트롤러의 요청과 응답, 빈 검증만 간단하게 개발하여 Rest Docs로 문서화하고, 도..

서론※ 아래 내용을 다룹니다.프레젠테이션 레이어를 테스트하는 방법StubbingTest DoubleTest Fixture 클렌징 본론- 프레젠테이션 레이어의 역할외부 세계의 요청을 가장 먼저 받는 레이어로 응답 결과와 요청 필드 검증을 주로 테스트해야 한다. 🚨 어떻게 테스트해야 할까?Mocking : 가짜 객체로 대신하는 것프레젠테이션 레이어를 테스트할 땐 그에 의존되는 하위의 레이어를 모킹한다. 프레젠테이션 레이어 테스트만 집중하여 단위 테스트 느낌이 가능하도록 하는 것이다. - MockList mockList = Mock(List.class)의존 관계로 인해 테스트가 어려울 때, 잘 동작하는 것을 가정하고, 가짜 객체로 처리할 때 사용한다. Mockito 라이브러리의 Mock 인터페이스는 가짜 객..

🚨 서론 (문제 상황)필자가 운영하고 있는 AI 검색 서비스는 4대의 분산 추론 서버의 응답을 저장하고, 클라이언트에게 전시하는 동작이 가장 중요한 기능 중 하나이다.[서비스 링크] 추론 요청에 대한 응답으로는 단순 문자열 1개나 이미지가 아닌, 100개 이상의 검색 결과로 1개의 검색 결과에 5개의 필드를 가지고 있다. 이처럼 한 번의 추론에서 50KB 용량의 다수의 문자열 데이터를 응답 받기에 어떻게 클라이언트에게 전달하는 것이 효과적일지 고민이 생겼다. 또한, 클라이언트에 추론 결과를 제공하기 위해서 추론 결과가 저장되는 공간을 반복적으로 체크하도록 설계가 되어있었기 때문에 접근 시간, 조회 속도를 고려하여 저장 공간을 선택해야 했다. 필자가 최종 선택한 저장 공간은 시간 지역성을 고려한 Redi..

🚨 서론 (문제상황)@Beanpublic RedisTemplate redisTemplate( RedisConnectionFactory redisConnectionFactory, ObjectMapper objectMapper) { Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); jsonRedisSerializer.setObjectMapper(objectMapper); // 여기 ✅Redis의 Serializer는 내부적으로 ObjectMapper를 사용하여, 객체 ↔ JSON 직렬화, 역직렬화를 수행한다. @Asyncpubli..

🚨 서론 (문제 상황)Redis는 단순 데이터 저장뿐만 아니라, 캐싱, 메세지 콜백 등 다양한 기능으로 활용도가 매우 높다. 그 중 정밀한 이벤트 핸들러를 제공하는 Redis Stream을 사용하고자 했고, 일반 (키-벨류, 해시맵) 형태가 아닌 특수한 자료구조라서, 사용하기 전에 자세히 알아보고자 한다. 본론- 자바의 직렬화 & 역직렬화직렬화 : 자바의 Object를 다른 컴퓨터의 자바 시스템에서 사용할 수 있도록 저장하는 것을 의미한다. Object를 연속된(Serial) 바이트 스트림 형태로 포맷 변환하는 기술이다.역직렬화 : 바이트 스트림을 원래대로 자바 시스템의 Object로 변환하여 로드하는 기술이다. JVM 클래스 로더 시스템을 보면 클래스 정보가 메서드 영역에 저장되고 Object가 힙,..