목록[백엔드]/[spring+JPA | 이슈해결] (12)
개발자로 후회없는 삶 살기

🚨 서론 (문제 상황)필자가 운영하고 있는 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가 힙,..

🚨 서론 (문제 상황)대부분의 AI 모델은 Python, C++로 작성되고 동작하도록 설계되어 있다. 특히 대용량 데이터 연산 라이브러리를 편하게 사용할 수 있는 Python은 모델을 학습하고 서빙하기에 특화 되어있다. @app.route("/img2img", methods=["POST"])def imageToimage(): image_path, prompt = extract_img2img_request_message(request) image_paths = generate_image_to_image_process(prompt, image_path) return render_template(INDEX, lora_weights = lora_weights.keys(), images = im..

서론 개인적으로 공부하고 있는 우아한 테크코스 로또 문제에서 발생한 소수점 계산 문제를 해결합니다. 본론 - float과 double의 문제점 float와 double은 정확한 값이 아닌 근삿값을 담고 있는 문제가 있습니다. -> 고정 소수점과 부동 소수점 1) 고정 실수를 부포비트, 정수부, 소수부로 나누고 자릿수를 고정하여 실수를 표현하는 방식입니다. ex) 7.75 = 111.11(2) 7.75는 실수를 2진수로 변환하면 111.11이 되는데 이를 정수부와 소수부로 나눠서 담아 표현합니다. 구현법이 간단하지만, 자릿수 제한이라는 단점이 있습니다. 2) 부동 실수를 부호부, 가수부, 지수부로 나누는 방식입니다. ex) 12.3456 = 0.123456 * 10^2 12.3456를 0.123456 * ..

서론 포스트맨 요청 헤더에 토큰을 자동으로 넣는 방법을 다룹니다. 본론 스프링과 포스트맨으로 프로젝트를 진행하다보면 로그인 이후 받아온 토큰을 계속 사용해서 이후 요청을 해야할 때가 있습니다. @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { final String token = AuthorizationExtractor.extract(request); Long id = Long.valueOf(jwtTokenProvider.getPayload(token)); Student findStudent = studentRepository...

서론 초기 엔터티 구축 과정에서 발생한 중복 검증을 개선한 방법에 대해 설명합니다. 본론 - 초기 엔터티 구축 첫 번째 기능에 필요한 초기 엔터티를 구축합니다. @Entity @Getter @Table(name = "student") @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Student extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "student_id") private Long id; @Column(name = "login_id", length = 255, nullable = false) private Strin..

서론자바에서는 데이터에 변경이나 추가를 하지 못하도록 불변을 설정할 수 있는 메서드를 제공합니다. 이번 시간에는 자바의 불변에 대해 알아봅니다. 본론- 복제본에 변화를 준 경우먼저 복제본에 변화를 줄 수 있는지 없는지 살펴보겠습니다. -> 배열을 입력받아 배열을 반환하는 메서드1. Arrays.copyOf이것은 배열을 복제하여 배열을 반환하는 메서드입니다. 복제본에 변화를 주어도 변경이 가능합니다. -> 배열을 입력받아 List를 반환하는 메서드1. List.of변경 불가를 보장합니다. 2. Arrays.asList변경은 가능하고 추가는 불가합니다. -> List를 입력 받아 List를 반환하는 메서드1. Collections.unmodifiableList복제본에 변경이 불가합니다. 2. List.cop..